我有点困惑。据我了解,waitpid的pid为-1意味着我等待所有孩子完成,但如果我在WNOHANG的waitpid中添加一个选项,那么如果没有完成,那些选项会立即退出......这些似乎非常令人困惑。
为什么我会告诉计算机等待子进程完成,然后在没有子进程完成后立即告诉它立即退出?
有人可以解释这个选项和WUNTRACED选项吗?我不知道被追查是什么意思。
答案 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)