3

摘自 Unix Network Programming Vol1 第三版第 5.10 节 wait 和 waitpid 函数

#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_chld中断。while

问题> 那么我们如何保证这个信号处理程序可以确保收集所有终止的子进程?

4

1 回答 1

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

如果您没有要处理的孩子,您将不会在信号处理程序中。该循环是因为当您在处理程序本身中时,第二个或第三个孩子可能已更改或终止发送不会排队的 SIGCHLD。因此,循环实际上可以防止您错过那些可能死去的孩子。当此时没有更多的孩子要收割时,它将返回 0 或错误输出 -1 (ECHILD)。

于 2012-07-04T04:59:16.160 回答