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

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

为什么我要告诉计算机等待子进程完成然后立即告诉它如果没有孩子完成就立即退出?

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

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

WUNTRACED选项记录如下,我没有添加到此描述中:

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

阅读POSIX的waitpid页面了解更多详情。

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

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

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