【问题标题】:waitpid, wnohang, wuntraced. How do I use thesewaitpid,wnohang,wuntraced。我如何使用这些
【发布时间】:2016-02-04 04:31:33
【问题描述】:

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

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

有人能解释一下这个选项和 WUNTRACED 选项吗?我不知道被追踪是什么意思。

【问题讨论】:

  • pid = -1 表示等待 any 孩子,而不是所有孩子。而“等待”是一个技术术语,指的是wait(2)
  • @melpomene 啊,是的,任何一个都非常不同。感谢您的指正。假设我有 3 个孩子……计算机如何确定要等待哪个?或者它是先到先得的类型,如果其中一个孩子完成然后计算机在技术上等待并继续前进?
  • @8this 如果你传递一个-1 的pid,它不会等待所有个孩子完成,它会等待any个孩子完成。一旦任何孩子完成了,它就会被收割。

标签: c posix waitpid


【解决方案1】:

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

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

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

【讨论】:

  • 传奇解释!
  • 所以默认情况下 wait() 或 waitpid() 不会通知父进程,因为子进程被信号停止?因为文档说“暂停调用线程的执行,直到其子线程之一终止。” .所以我不清楚“终止”是否是因为信号
  • 啊,条款不是很清楚……我的错。 “终止”意味着进程已经完成(或由于故障而崩溃或被 SIGKILL 杀死)并且有一个退出代码可供父进程检查。在我上面使用“停止”的地方,我真的应该说“暂停”或“暂停”(但这样做的信号是“SIGSTOP”,这就是为什么我说“停止”时马虎了)。暂停的进程(例如在 shell 中使用 Ctrl-z 时)可以稍后恢复。因此,任何进程终止(通过 exit(val)、SIGKILL、segfault)都应该允许 wait() 继续。
【解决方案2】:

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

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

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

阅读POSIXwaitpid页面了解更多详情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2015-05-04
    • 2018-04-11
    相关资源
    最近更新 更多