【问题标题】:Who waits for a shell background process?谁在等待一个 shell 后台进程?
【发布时间】:2015-06-01 18:21:13
【问题描述】:

我想知道这个问题:

如果我在 bash 中键入以下命令

# 睡眠 100 &

shell 怎么知道等待它结束?

当 shell 分叉自己以执行 sleep 命令时,与号在技术上不是意味着它不会等待新分叉的进程吗? 尽管如此,它仍然在等待它(否则我会将它视为僵尸,而我不会)

在这里感到困惑:\

【问题讨论】:

  • 因为它保留了正在运行的作业列表。
  • 不太明白是什么意思。。有什么不同?
  • 当你去学校接你的孩子时,是什么阻止你开车去学校,等 15 秒,然后开车离开? 你知道你有多少孩子,还有多少还没有上车。
  • 此外,并非所有形式的 wait() 调用块。 shell 可以在执行 print-a-prompt 业务时轮询它是否有任何子节点已经完成运行,如果它们完成则获取它们,否则不会延迟继续。
  • 当然会,最终。但是,它不会执行 阻塞 等待,这是重要的部分。

标签: linux bash shell process wait


【解决方案1】:

当子进程退出时,shell 会得到一个SIGCHLD;因此,它可以立即在信号处理程序中调用wait4() 来获取它。

如果你运行strace bash,你会看到类似下面的内容:

--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=13708, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG, NULL) = 13708
wait4(-1, 0x7fffbca63110, WNOHANG, NULL) = -1 ECHILD (No child processes)

也就是说:shell得到一个子进程退出的信号;它在没有 PID 的情况下调用wait4(),从而从其进程表中获取第一个死子;并再次调用它,并被告知没有死去的孩子可以被收割。

这与在前台运行进程的情况不同,后者立即运行阻塞 wait()

【讨论】:

  • 它读起来像一部恐怖电影......
猜你喜欢
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多