如何确保"waitpid(-1, &stat, WNOHANG)"收集所有子进程

How to make sure that `waitpid(-1, &stat, WNOHANG)` collect all children processes

本文关键字:子进程 WNOHANG stat 何确保 确保 waitpid      更新时间:2023-10-16

摘自 Unix 网络编程 Vol1 第三版第 5.10 节 等待和等待 pid 函数

#include    "unp.h"    
void
sig_chld(int signo)
{
    pid_t   pid;
    int     stat;    
    while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) {
        printf("child %d terminatedn", 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():成功时,返回其状态的子进程 ID 已更改;如果指定了 WNOHANG 并且一个或多个子项 由 pid 指定存在,但尚未更改状态,则 0 为 返回。出错时,返回 -1。

根据上述文档,如果目前没有子进程终止,waitpid将返回0。如果我理解正确,这将导致函数sig_chld中断while语句。

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

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

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