在我的程序中,我在有限的 while 循环中分叉(并行)子进程,并对每个子进程执行 exec 。我希望父进程仅在所有子进程终止后才恢复执行( while 循环之后的点)。我该怎么做呢?
我尝试了几种方法。在一种方法中,我让父进程在 while 循环后暂停,并仅当 waitpid 返回错误 ECHILD(没有剩余子进程)时才从 SIGCHLD 处理程序发送一些条件,但我在这种方法中面临的问题甚至在父进程完成分叉所有进程之前, 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
在信号处理程序中,为什么不在分叉所有进程后创建一个循环,如下所示:
while (pid = waitpid(-1, NULL, 0)) {
if (errno == ECHILD) {
break;
}
}
程序应该挂在循环中,直到不再有子进程。然后它就会掉下来,程序将继续进行。作为额外的好处,循环将阻塞waitpid
当孩子们跑步时,所以你在等待时不需要一个繁忙的循环。
你也可以使用wait(NULL)
这应该相当于waitpid(-1, NULL, 0)
。如果您不需要在SIGCHLD中执行其他操作,则可以将其设置为SIG_DFL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)