waitpid,wnohang,wuntraced。我如何使用这些

waitpid, wnohang, wuntraced. How do I use these

我有点困惑。据我了解,pid 为 -1 的 waitpid 意味着我等待所有 child 完成但是如果我向 WNOHANG 的 waitpid 添加一个选项,该选项表示如果 none 则立即退出已经完成...这些看起来非常混乱。

为什么我要告诉计算机等待 child 个进程完成,然后在 child 中的 none 个进程完成后立即告诉它立即退出?

谁能解释一下这个选项和 WUNTRACED 选项?不知道被追踪是什么意思

如果您传递 -1WNOHANGwaitpid() 将检查是否存在任何 zombie-children。如果是,则其中一个被收割并返回其退出状态。如果不存在,则返回 0(如果存在未终止的 children)或返回 -1(如果不存在)并将 ERRNO 设置为 ECHILD(否child 进程)。如果您想知道您的 children 中是否有任何人最近死亡而不必等待其中一个人死亡,这将很有用。它在这方面非常有用。

选项WUNTRACED记录如下,我没有什么要补充的:

WUNTRACED The status of any child processes specified by pid that are stopped, and whose status has not yet been reported since they stopped, shall also be reported to the requesting process.

阅读 waitpid page from POSIX 了解更多详情。

你通常在不同的情况下使用WNOHANG和WUNTRACED。

案例 1:假设您有一个进程产生了一堆 children 并且需要在 children 是 运行 时做其他事情。这些 children 有时会退出或被杀死,但内核会保持它们的退出状态,直到其他进程通过 wait() 或 waitpid() 声明它。所以,你的 parent 进程需要偶尔调用 wait()/waitpid() 来让内核摆脱 child 的残留。但是我们不希望 wait()/waitpid() 到 block,因为,在这种情况下,我们的进程还有其他事情需要做。我们只想收集死进程的状态 if 如果有的话。这就是 WNOHANG 的用途。它可以防止 wait()/waitpid() 阻塞,以便您的进程可以继续执行其他任务。如果 child 死亡,它的 pid 将由 wait()/waitpid() 返回,您的进程可以对此采取行动。如果什么都没死,那么返回的pid就是0。

情况 2:假设您的 parent 进程想要 什么都不做 而 children 是 运行。你不想让它做一些 thumb-twidling for-loop,所以你使用没有 WNOHANG 的普通 wait()/waitpid()。您的进程会从执行队列中取出,直到其中一个 children 死亡。但是,如果您的 children 之一通过 SIGSTOP 停止 怎么办?您的 child 不再执行您为其设置的任务,但 parent 仍在等待。所以,从某种意义上说,你遇到了一个僵局,除非 child 通过你的 parent 和 child 之外的某种方式继续。如果 child 被 停止 以及退出或被杀死,WUNTRACED 允许您的 parent 从 wait()/waitpid() 返回。这样,您的 parent 就有机会向它发送 SIGCONT 以继续它、杀死它、将其任务分配给另一个 child,随便什么。