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

avd*_*avd 12 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
Run Code Online (Sandbox Code Playgroud)

Jer*_*que 21

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

while (pid = waitpid(-1, NULL, 0)) {
   if (errno == ECHILD) {
      break;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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