我正在编写一个 SIGCHLD 处理程序,我想知道在什么情况下调用 waitpid() 会返回 -1?
更具体地说,如果我创建一个循环,在其中调用 waitpid(...) 并希望它运行直到所有终止的子进程都已被回收,我是否会迭代直到 waitpid(...) 返回 -1?不然怎么知道还有没有 child 需要收割呢?
最佳答案
waitpid()
在这些情况下可以返回 -1
:
- 该进程没有尚未等待的子进程。在这种情况下,
errno
设置为ECHILD
。如果您正在循环获取进程组中的所有子进程或所有子进程(即您将pid
设置为-1
或0
),您发生这种情况时应该跳出循环。如果SIGCHLD
的信号操作设置为SIG_IGN
或为信号设置了SA_NOCLDWAIT
标志,也会发生这种情况。 - 在参数中检测到问题。如果问题出在
options
参数上,errno
将设置为EINVAL
。如果pid
大于0
(因此您正在等待特定的子进程)并且不存在或不是此进程的子进程,则errno
将被设置为ECHILD
;如果您处于等待循环中,这可能不适用。这些通常表明您的代码中存在问题,您可能应该报告或记录它,然后退出。 - 通话被信号打断。
errno
将被设置为EINTR
。发生这种情况时,您可能应该随时了解情况。
关于C - 在什么情况下调用 waitpid() 会返回 -1,表示错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24586585/