C - 在什么条件下调用waitpid()会返回-1,发出错误信号?

时间:2014-07-05 12:46:59

标签: c process handler waitpid sigchld

我正在写一个SIGCHLD处理程序,我想知道在什么条件下调用waitpid()会返回-1?

更具体地说,如果我创建一个循环,在其中我调用waitpid(...)并希望它运行直到所有已终止的子进程都被收集,我是否会迭代直到waitpid(...)返回-1?否则,我怎么知道还有更多的孩子需要收割?

1 个答案:

答案 0 :(得分:2)

在这种情况下,

waitpid()可以返回-1

  1. 这个过程没有孩子,它还没有等待。在这种情况下,errno设置为ECHILD。如果您正在循环以收集进程组中的所有子项或所有子项(即您将pid设置为-10),则应该在此循环时退出循环发生。如果SIGCHLD的信号操作设置为SIG_IGN或为信号设置了SA_NOCLDWAIT标记,也会发生这种情况。
  2. 在参数中检测到问题。如果问题出在options参数上,则errno将设置为EINVAL。如果pid大于0(因此您等待特定的孩子)并且不存在或不是此过程的孩子,errno将设为ECHILD;如果您处于等待循环中,这可能不适用。这些通常表示代码中存在问题,您应该报告或记录它,然后退出。
  3. 电话被信号打断了。 errno将设置为EINTR。当发生这种情况时,你应该留在循环中。