2017-02-22 26 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