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