我正在编写一个 SIGCHLD 处理程序,我想知道在什么情况下调用 waitpid() 会返回 -1?
更具体地说,如果我创建一个循环,在其中调用 waitpid(...) 并希望它运行直到所有终止的子进程都被收割,我是否会迭代直到 waitpid(...) 返回 -1?否则,我怎么知道还有没有孩子需要收割呢?
waitpid()
-1
在这些情况下可以返回:
errno
设置为。ECHILD
如果您正在循环以获取进程组中的所有子进程或所有子进程(即您设置pid
为-1
or 0
),那么当这种情况发生时,您应该跳出循环。SIGCHLD
如果将信号操作设置为SIG_IGN
或SA_NOCLDWAIT
为信号设置了标志,也会发生这种情况。options
参数上,errno
将设置为EINVAL
。如果pid
大于0
(所以你在等待一个特定的子进程)并且不存在或者不是这个进程的子进程,errno
将被设置为ECHILD
; 如果您处于等待循环中,这可能不适用。这些通常表明您的代码中存在问题,您可能应该报告或记录它,然后退出。errno
将设置为EINTR
。发生这种情况时,您可能应该留在循环中。