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

8th*_*his 13 c posix waitpid

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

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

有人可以解释这个选项和WUNTRACED选项吗?我不知道被追查的意义.

Jem*_*ake 36

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

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

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

  • 传奇解释! (3认同)
  • 啊,条款不太清楚……我的错。“终止”意味着进程已完成(或由于故障而崩溃或被 SIGKILL 终止),并且有一个退出代码可供父进程检查。在上面我使用“停止”的地方,我真的应该说“暂停”或“暂停”(但执行此操作的信号是“SIGSTOP”,这就是为什么我草率地说“停止”)。挂起的进程(例如在 shell 中使用 Ctrl-z 时)可以稍后恢复。因此,任何时候进程终止(通过 exit(val)、SIGKILL、段错误)都应该允许 wait() 继续。 (2认同)

fuz*_*fuz 6

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

该选项WUNTRACED记录如下,我对此内容无添加:

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

阅读POSIXwaitpid页面以获取更多详细信息。