c之等待所有子进程退出

thcjp 阅读:145 2025-02-15 21:57:57 评论:0

我正在尝试用 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,因此它始终为真,导致无限循环。


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号