C - 在什么情况下调用 waitpid() 会返回 -1,表示错误?

标签 c process handler waitpid sigchld

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

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

最佳答案

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

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

关于C - 在什么情况下调用 waitpid() 会返回 -1,表示错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24586585/

相关文章:

c - 如何在 Delphi 中表示以空字符结尾的字符串数组?

c - 找出是什么减慢了 C 程序的工具?

java - 如何从 Java 运行 shell 脚本并让它在 JVM 关闭后继续运行?

javascript - 评估 WebView、Android 上的 javascript 值

android - 在旋转之前放置网络调用时如何更新 UI 线程?

c - 覆盖主程序入口点可能存在的缺点

c - 在多线程应用程序中将日志写入文件

c# - 在非默认浏览器中启动 Web URL

c - 无法通过管道传输三个进程

java - 测试服务器日志。使用 Java、SocketHandler