当前位置: 技术问答>linux和unix
进程管理实验(只求讲解,不要源代码)
来源: 互联网 发布时间:2016-10-10
本文导语: 编写程序,要求父进程创建一个子进程,子进程执行shell命令find / -name hda* 的功能,子进程结束时由父进程打印子进程结束的信息。执行中父进程改变子进程的优先级。 操作系统课上也没将那么细,写实验有些问...
编写程序,要求父进程创建一个子进程,子进程执行shell命令find / -name hda* 的功能,子进程结束时由父进程打印子进程结束的信息。执行中父进程改变子进程的优先级。
操作系统课上也没将那么细,写实验有些问题
我的问题如下:1 execl()加载子进程 shell 命令find / -name hda*该怎么写
2子进程结束时由父进程打印子进程结束信息怎么处理
if((pid=fork())==0)
{
execl();
}
else if(pid>0)
{ wait(0);
printf("Child process is over.n");
}
可以吗?题目意思是这样吗?
3 父进程怎么改变子进程的优先级,如果用nice()实现,该如何写放在那个位置?
操作系统课上也没将那么细,写实验有些问题
我的问题如下:1 execl()加载子进程 shell 命令find / -name hda*该怎么写
2子进程结束时由父进程打印子进程结束信息怎么处理
if((pid=fork())==0)
{
execl();
}
else if(pid>0)
{ wait(0);
printf("Child process is over.n");
}
可以吗?题目意思是这样吗?
3 父进程怎么改变子进程的优先级,如果用nice()实现,该如何写放在那个位置?
|
/*
编写程序,要求父进程创建一个子进程,子进程执行shell命令find / -name hda* 的功能,子进程结束时由父进程打印子进程结束的信息。执行中父进程改变子进程的优先级。
操作系统课上也没将那么细,写实验有些问题
我的问题如下:1 execl()加载子进程 shell 命令find / -name hda*该怎么写
2子进程结束时由父进程打印子进程结束信息怎么处理
if((pid=fork())==0)
{
execl();
}
else if(pid>0)
{ wait(0);
printf("Child process is over.n");
}
可以吗?题目意思是这样吗?
3 父进程怎么改变子进程的优先级,如果用nice()实现,该如何写放在那个位置?
*/
#include
#include
#include
#include
#include
#include
int
main() {
pid_t pid;
int status;
if ( (pid = fork()) == 0) {
int fd;
/* fork()后,child process运行的代码 */
/* 在这里,用nice()修正子进程的运行优先级。第3个问题是这样处理的。 */
if (nice(5) == -1) {
fprintf(stderr, "[child] nice error: %sn", strerror(errno));
exit(-1);
}
/* 关闭输出,下面3行是可以不要的,不过输出挺多行的,挺烦的,可以注释掉看看效果。 */
fd = open("/dev/null", O_WRONLY);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
/* execlp(),使用了execlp()是为了路径搜索的能力。关于第1个问题,是这样处理的。 */
execlp("find", "find", "/", "-name", "hda*", (char *)0);
exit(127);
} else if (pid == -1) {
fprintf(stderr, "[parent] fork error: %sn", strerror(errno));
exit(-1);
}
/* 这里是,fork()后,父进程运行的代码。 */
/* 使用waitpid()阻塞等待子进程结束,防止父进程过早的退出。子进程终止后,waitpid()返回
返回后,可以打印子进程已经终止的信息。因为waitpid()保证了子进程已经结束。关于第2个问题
是这样处理的 */
if ( (pid = waitpid(pid, &status, 0)) == -1) {
fprintf(stderr, "[parent] waitpid error: %sn", strerror(errno));
exit(-1);
}
fprintf(stdout, "child[%d] terminatedn", pid);
return (0);
}