2017-02-22 27 views
0

* nix中wait()和wait_pid()工作在演示程序,其中在linux上,如何等待多个子进程?

(1)父亲叉一个孩子,等待孩子退出

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

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

但现实世界的* nix编程就像

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

(2)的主要过程是为了叉一些童工,

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

然后问题是,父亲如何处理fork并等待多个孩子?有没有一种方便的方法来完成这项工作,或者设计应该与众不同?

谢谢。

+0

你读过“男人等待”/“男人waitpid”? –

+0

父亲不需要等待其子女。它可以只有一个信号处理程序来捕获SIGCHILD,处理程序可以采取必要的行动。 – codeforester

回答

1

三种可能性:

1) 定期检查儿童死亡与waitpid函数。即现在再这样做:

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

2) 清理的信号处理程序忽略父SIGCHLD

/* 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) 制作分离的孩子:

signal(SIGCHLD, SIG_IGN); 
+0

由于后者在你提出的场景中很受欢迎。 – ttyridal