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

时间:2009-10-02 17:39:43

标签: c unix fork

在我的程序中,我在一个有限的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

2 个答案:

答案 0 :(得分:21)

除了在信号处理程序中调用waitpid之外,为什么不在按如下方式分叉所有进程后创建一个循环:

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

程序应该挂起循环,直到没有更多的孩子。然后它会掉出来,程序将继续。作为额外的奖励,当孩子们正在运行时,循环将在waitpid上阻止,因此您在等待时不需要繁忙的循环。

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

答案 1 :(得分:0)

我认为你应该使用waitpid()电话。它允许你等待“任何子进程”,所以如果你这样做了适当的次数,你应该是金色的。

如果失败(不确定保证),你可以在循环中进行暴力破解,在每个子PID上使用waitpid()选项执行NOHANG,并且然后在再做一次之前推迟一段时间。