当我使用fork()
并行运行两个命令时,我正试图收获子进程。我正在使用以下代码执行此操作:
int process() {
int w, status;
while ((w = waitpid(-1,&status,WNOHANG)) > 0)
fprintf(stderr,"Completed: %d (%d)\n",w,status);
int pid;
if ((pid = fork()) < 0)
errorExit (EXIT_FAILURE);
if (pid == 0) {
// run first command
} else if (cmdList->right) {
// run second command
}
}
我对这段代码的理解是:我不断地运行waitpid()
程序的运行时,只要waitpid()
返回大于0的值,它就会报告它(从而允许僵尸来然后执行fprintf()
到stderr
。这种理解是错的吗?
答案 0 :(得分:1)
此代码将确保删除所有已终止的子项,如标志所示:
WNOHANG
如果状态不能立即用于pid指定的子进程之一,则waitpid()函数不应暂停执行调用线程。
因此,当您遇到这些孩子时,您将执行fprintf()
。因此,如果您有两个这样的孩子,fprintf()
将被执行两次。 fprintf()
将写入stderr
。
请注意,在执行该循环之后,再次调用fork()
,这将创建一个子节点,这不会被循环处理。