2012-07-04 27 views
2

從Unix網絡編程VOL1第三版部分提取5.10 wait和waitpid函數功能如何確保'waitpid函數(-1,&統計,WNOHANG)`收集所有的子進程

#include "unp.h"  
void 
sig_chld(int signo) 
{ 
    pid_t pid; 
    int  stat;  
    while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) { 
     printf("child %d terminated\n", pid); 
    } 
    return; 
} 

... 
// in server code 
Signal(SIGCHLD, sig_chld); // used to prevent any zombies from being left around 
... 

.. 
// in client code 
The client establishes five connection with the server and then immediately exit 
... 

參考waitpid

返回值

waitpid函數():成功,返回子進程ID,其狀態 公頃改變了;如果指定了WNOHANG,並且存在一個或多個由pid指定的子(ren) ,但尚未更改狀態,則返回0爲 。出錯時,返回-1。

根據上述文件,waitpid將返回0如果此時沒有子進程已終止。如果我理解正確,這將導致功能sig_chldwhile聲明中斷。

問題>因此,我們如何保證這個信號處理程序可以確保收集所有終止的子進程?

回答

5
while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) { 
     printf("child %d terminated\n", pid); 

如果您沒有孩子可以處理,您不會在信號處理程序中。循環是因爲當你在處理程序本身時,第二或第三個孩子可能已經改變或終止發送不會排隊的SIGCHLD。因此,循環實際上可以防止你錯過那些可能死亡的孩子。當此時沒有更多的孩子被收割時,它將返回0或者以-1(ECHILD)出錯。

相關問題