waitpid,wnohang,wuntraced。我该如何使用它们

时间:2015-11-03 21:01:45

标签: c posix waitpid

我有点困惑。据我了解,waitpid的pid为-1意味着我等待所有孩子完成,但如果我在WNOHANG的waitpid中添加一个选项,那么如果没有完成,那些选项会立即退出......这些似乎非常令人困惑。

为什么我会告诉计算机等待子进程完成,然后在没有子进程完成后立即告诉它立即退出?

有人可以解释这个选项和WUNTRACED选项吗?我不知道被追查是什么意思。

2 个答案:

答案 0 :(得分:29)

在不同情况下,您通常使用WNOHANG和WUNTRACED。

案例1:假设你有一个过程会产生一群孩子,并且在孩子们跑步时需要做其他事情。这些孩子有时会退出或被杀死,但内核将保持退出状态,直到其他进程通过wait()或waitpid()声明它。因此,您的父进程有时需要调用wait()/ waitpid()以让内核摆脱子进程的遗骸。但我们不希望wait()/ waitpid()到阻止,因为在这种情况下,我们的进程还有其他需要做的事情。我们只想收集死进程的状态,如果有。这就是WNOHANG的用途。它会阻止wait()/ waitpid()阻塞,以便您的进程可以继续执行其他任务。如果一个孩子死了,它的pid将由wait()/ waitpid()返回,你的进程可以对此进行操作。如果没有任何东西死亡,则返回的pid为0。

案例2:假设您的父进程在子进程运行时想要 nothing 。你不想让它做一些拇指扭转for循环,所以你使用正常的wait()/ waitpid()而没有WNOHANG。您的进程将从执行队列中取出,直到其中一个子节点死亡。但是,如果你的一个孩子通过SIGSTOP 停止怎么办?您的孩子不再处理您设置的任务,但父母仍在等待。所以,从某种意义上说,你有一个僵局,除非孩子继续通过你父母和那个孩子以外的某些方式。 WUNTRACED允许您的父级从wait()/ waitpid()返回,如果孩子已停止以及退出或被杀死。这样,你的父母有机会发送一个SIGCONT来继续它,杀死它,将它的任务分配给另一个孩子,无论如何。

答案 1 :(得分:4)

如果您通过-1WNOHANGwaitpid()将检查是否存在任何僵尸儿童。如果是,则获得其中一个并返回其退出状态。如果不是,则返回0(如果存在未终止的子项)或返回-1(如果没有),ERRNO设置为ECHILD(无子进程)。如果你想知道你的孩子最近是否死亡而不必等待其中一人死亡,这是很有用的。在这方面它非常有用。

选项WUNTRACED记录如下,我没有任何内容可添加到此说明中:

  

WUNTRACED pid指定的任何已停止的子进程的状态,以及自停止后尚未报告的状态,也应报告给请求进程。

阅读waitpidPOSIX页面了解详情。