【问题标题】:What if the child exits before the parent calls wait()?如果孩子在父母调用 wait() 之前就退出了怎么办?
【发布时间】:2019-05-06 13:33:48
【问题描述】:

我正在学习 C 中的 wait() 方法。我知道它会阻塞父进程,直到其子进程之一终止。但是,如果内核决定先调度子进程并且子进程在父进程调用 wait() 之前终止怎么办?由于无法观察到孩子的返回,父母是否会永远等在那里(没有其他中断)?

在照片中,如果执行顺序是:fork --> HC --> exit -->HP-->wait,那么就会发生我描述的情况。

【问题讨论】:

标签: c unix


【解决方案1】:

不,父母不会永远等待。

wait 上的文档指出:

所有这些系统调用都用于等待状态变化 调用进程的子进程,并获取有关子进程的信息 谁的状态发生了变化。 状态变化被认为是: 孩子终止;孩子被信号拦住;或者孩子是 由信号恢复。 在终止孩子的情况下,执行 等待允许系统释放与 孩子;如果未执行等待,则终止的子进程仍然存在 处于“僵尸”状态

如果孩子已经改变了状态,那么这些调用会立即返回。

【讨论】:

  • 感谢您的回答。那么如果调用立即返回,那么父进程就不能收割那个子进程了吗?
  • @folkboat 它收获了。
【解决方案2】:

但是如果内核决定先调度子进程,然后 子进程在父进程调用wait()之前终止?

这是一个很可能的情况。如果wait家族函数之一被父进程使用或者signal(SIGCHLD, SIG_IGN);forking之前被显式调用,即使父进程被抢占也不会将子进程变成僵尸(=不允许使用CPU当时)。

此外,需要等待或忽略信号是清理进程未使用的数据。在使用其中一种方法时,内核被告知子进程不再使用。因此,您可以清理未使用的系统资源。

【讨论】:

  • 谢谢!现在很好的是,即使孩子之前退出,孩子仍然可以被父母的 wait() 调用收割。但是说“如果父母被抢占,它会在短时间内将孩子变成僵尸,但是当父母调用wait()时,孩子可以被父母收割(所以不是一个僵尸了)”?
  • @folkboat 是的,说得好。
  • @folkboat en passant,你从哪里得到图像?我喜欢它的表现形式。
  • 取自 CMU 的 CSAPP 讲座幻灯片。您可以从其网站获取更多信息:link。它提供课程视频和幻灯片。如果你只想要幻灯片,你可以从这个页面下载:link
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
相关资源
最近更新 更多