在linux上,如何等待多个子进程?

时间:2017-02-22 06:41:02

标签: linux process fork wait

* nix wait()和wait_pid()在演示程序中工作

  

(1)父亲请孩子,等孩子退出

     

(2)并且等待函数返回。

强调的是,如果父亲不等待并继续跑步,孩子们就会退出并成为“僵尸”。

但现实世界* nix编程就像

  

(1)我正在写一个服务器程序,

     

(2)主要过程适用于分叉一些童工,

     (3)这些童工做了一些工作,然后退出。

然后问题是,父亲如何处理fork并等待多个孩子?有没有方便的方法来做到这一点,或者设计应该是不同的?

感谢。

1 个答案:

答案 0 :(得分:1)

三种可能性:

1) 定期检查有waitpid的死孩子。即:现在又做:

    while (waitpid(-1, NULL, WNOHANG) > 0)
        continue;

2) 在信号处理程序中清理

/* SIGCHLD handler to reap dead child processes */
static void grimReaper(int sig)
{
    int savedErrno = errno;
    while (waitpid(-1, NULL, WNOHANG) > 0)
        continue;
    errno = savedErrno;
}   
int main(void) {
    ...
    struct sigaction sa;
    memset(&sa, 0, sizeof sa);
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = grimReaper;
    if (sigaction(SIGCHLD, &sa, NULL) == -1)
        ...
}       

3) 通过忽略父级中的SIGCHLD来使分离的孩子成为:

signal(SIGCHLD, SIG_IGN);