【问题标题】:Wait for all child process to exit等待所有子进程退出
【发布时间】:2014-03-23 16:44:59
【问题描述】:

我正在尝试在 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),“test”会显示在wc的输出中间,如果我使用while(wait(NULL) > 0);它进入了一个无限循环。

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

【问题讨论】:

    标签: c unix pipe wait


    【解决方案1】:

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

    while (wait(NULL) > 0) 不起作用,因为wait() 返回捕获的子进程的 PID,所以它始终为 true,导致无限循环。

    【讨论】:

    • 所以如果我有两个孩子,我应该做两个wait 吗?这也进入了无限循环:\