0

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

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

4

1 回答 1

2

waitpid()-1在这些情况下可以返回:

  1. 该进程没有尚未等待的子进程。在这种情况下errno设置为。ECHILD如果您正在循环以获取进程组中的所有子进程或所有子进程(即您设置pid-1or 0),那么当这种情况发生时,您应该跳出循环。SIGCHLD如果将信号操作设置为SIG_IGNSA_NOCLDWAIT为信号设置了标志,也会发生这种情况。
  2. 在参数中检测到问题。如果问题出在options参数上,errno将设置为EINVAL。如果pid大于0(所以你在等待一个特定的子进程)并且不存在或者不是这个进程的子进程,errno将被设置为ECHILD; 如果您处于等待循环中,这可能不适用。这些通常表明您的代码中存在问题,您可能应该报告或记录它,然后退出。
  3. 通话被信号中断。errno将设置为EINTR。发生这种情况时,您可能应该留在循环中。
于 2014-07-05T13:00:10.773 回答