等待所有子进程退出

时间:2014-03-23 16:45:00

标签: c unix pipe wait

我正在尝试在c中编写shell管道,但我的程序在完成之前不会等待所有的孩子。

int fd[2];
if (fork() == 0)
{
    dup2(fd[1], 1);
    close(0);
    execlp("ls", "ls, NULL);
}
if (fork() == 0)
{
    dup2(fd[1], 1);
    close(0);
    execlp("wc" "wc", NULL);
}
wait(NULL);//this dont wait all child
//wait(NULL); wait(NULL); this go into infinite loop
//while (wait(NULL) > 0); this go into infinite loop
write(1, "test", 4);

如果我使用wait(NULL),则在wc的输出中间显示“test”,如果我在(wait(NULL) > 0)时使用,则它会进入无限循环。

编辑:解决方案是在等待之前关闭管道(close(fd[0]); close(fd[1]);)。如果我理解这项工作的原因,我会再次编辑。

1 个答案:

答案 0 :(得分:4)

wait(2)的每次调用都会阻止父进程,直到其子进程退出。因此,如果您想要阻止父进程,直到所有子进程都退出,您必须在for循环中调用wait()和子进程一样多次。

while (wait(NULL) > 0)将无效,因为wait()返回捕获的子进程的PID,因此它始终为true,从而导致无限循环。