C语言 正在等待所有子进程,然后父进程继续执行UNIX

f45qwnt8  于 2023-02-07  发布在  Unix
关注(0)|答案(2)|浏览(171)

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

bis0qfac1#

与其在信号处理程序中调用waitpid,为什么不在派生完所有进程后创建一个循环呢?

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

程序应该一直挂在循环中,直到没有更多的子程序为止,然后它就会退出,程序继续运行。作为额外的好处,当子程序运行时,循环会在waitpid上阻塞,所以在等待时不需要一个忙碌的循环。
您也可以使用wait(NULL),它应该等同于waitpid(-1, NULL, 0)。如果您不需要在SIGCHLD中执行其他操作,则可以将其设置为SIG_DFL。

sqyvllje

sqyvllje2#

我认为您应该使用[waitpid()](http://linux.die.net/man/2/waitpid)调用。它允许您等待“任何子进程”,所以如果您这样做的次数适当,您应该是黄金。
如果失败了(不确定是否能保证),您可以在循环中使用强力方法,在每个子PID上使用NOHANG选项执行waitpid(),然后延迟一段时间再执行。

相关问题