gpt4 book ai didi

c - 在父进程恢复执行之前等待所有子进程 UNIX

转载 作者:行者123 更新时间:2023-11-30 16:40:57 26 4
gpt4 key购买 nike

在我的程序中,我在有限的 while 循环中 fork (并行)子进程,并对每个子进程执行 exec 操作。我希望父进程仅在所有子进程终止后才恢复执行( while 循环之后的点)。我该怎么做?

我尝试了几种方法。在一种方法中,我让父进程在 while 循环后暂停,并仅当 waitpid 返回错误 ECHILD(没有剩余子进程)时才从 SIGCHLD 处理程序发送一些条件,但我在这种方法中面临的问题甚至在父进程完成 fork 所有进程之前, retStat 变为-1

    void sigchld_handler(int signo) {
pid_t pid;
while((pid= waitpid(-1,NULL,WNOHANG)) > 0);
if(errno == ECHILD) {
retStat = -1;
}
}

**//parent process code**
retStat = 1;
while(some condition) {
do fork(and exec);
}

while(retStat > 0)
pause();
//This is the point where I want execution to resumed only when all children have finished

最佳答案

为什么不在信号处理程序中调用 waitpid ,而是在 fork 所有进程后创建一个循环,如下所示:

while (pid = waitpid(-1, NULL, 0)) {
if (errno == ECHILD) {
break;
}
}

程序应该卡在循环中,直到没有更多的子进程。然后它就会掉下来,程序将继续进行。作为额外的好处,当子进程运行时,循环将在 waitpid 上阻塞,因此您在等待时不需要繁忙的循环。

您还可以使用wait(NULL),它应该等同于waitpid(-1, NULL, 0)。如果您不需要在 SIGCHLD 中执行其他操作,则可以将其设置为 SIG_DFL。

关于c - 在父进程恢复执行之前等待所有子进程 UNIX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46459426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com