等待所有子进程的父继续执行之前UNIX(Waiting for all child processe

2019-07-20 15:04发布

在我的计划,我分叉(平行)子进程在有限while循环,并在他们每个人做高管。 我想父进程继续执行(这个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

Answer 1:

而不是调用的waitpid在信号处理程序,为什么不创建你已付出的所有进程后如下循环:

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

直到不再有更多的孩子该计划应在循环挂起。 然后,它会掉下来,程序将继续进行。 作为一个额外的奖金,循环将阻止在waitpid ,而孩子正在运行,所以你并不需要一个繁忙的循环,你需要等待。

你也可以使用wait(NULL)这应该是等同于waitpid(-1, NULL, 0) 如果没有什么别的需要在SIGCHLD做,你可以将其设置为SIG_IGN。



Answer 2:

我想你应该使用waitpid()调用。 它可以让你等待“任何儿童的过程”,所以如果你这样做的时候适当的数量,你应该是金色的。

如果失败(约担保不知道),你可以做蛮力的办法坐在环路,做一个waitpid()NOHANG每个孩子的PID的选项,然后延迟了一段时间做一遍前。



文章来源: Waiting for all child processes before parent resumes execution UNIX
标签: c unix fork