c - 等待所有子进程退出

标签 c unix pipe wait

我正在尝试用 c 语言编写一个 shell 管道,但我的程序在完成之前不会等待所有 child 。

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]);)。如果我了解这是如何工作的,我会再次编辑。

最佳答案

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

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

关于c - 等待所有子进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593791/

相关文章:

c - 如何将 Unique int 值分配给字符串或字符?

objective-c - XCode(Objective C)和C程序之间的进程间通信

windows - 是什么阻止windows cpu工作超过100%?

unix - sed 命令合并具有相同关键字的两行或多行

c - 使用管道从文件发送数据时出现同步错误

c - 用管道 fork

unix - 管道程序输出较少时不显示输出开始

c++ - 从 dlopen 加载的函数可以从加载它的可执行文件中调用函数吗?

c - (链接列表)警告: assignment from incompatible pointer type

linux - 解释 shell 脚本代码 "for loop"