在我的程序中,我在一个有限的while循环中派生(并行)子进程,并对每个子进程执行exec。我希望父进程只有在所有子进程都终止之后才能继续执行(while循环之后的点)。我应该怎么做呢?
我尝试过几种方法,其中一种方法是,我让parent在while循环后暂停,并且只有在waitpid返回错误ECHILD(没有子进程)时才从SIGCHLD处理程序发送一些条件,但我在这种方法中面临的问题是,甚至在parent完成派生所有进程之前,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
2条答案
按热度按时间bis0qfac1#
与其在信号处理程序中调用
waitpid
,为什么不在派生完所有进程后创建一个循环呢?程序应该一直挂在循环中,直到没有更多的子程序为止,然后它就会退出,程序继续运行。作为额外的好处,当子程序运行时,循环会在
waitpid
上阻塞,所以在等待时不需要一个忙碌的循环。您也可以使用
wait(NULL)
,它应该等同于waitpid(-1, NULL, 0)
。如果您不需要在SIGCHLD中执行其他操作,则可以将其设置为SIG_DFL。sqyvllje2#
我认为您应该使用
[waitpid()](http://linux.die.net/man/2/waitpid)
调用。它允许您等待“任何子进程”,所以如果您这样做的次数适当,您应该是黄金。如果失败了(不确定是否能保证),您可以在循环中使用强力方法,在每个子PID上使用
NOHANG
选项执行waitpid()
,然后延迟一段时间再执行。