【问题标题】:Process terminates while wait() is isssued发出 wait() 时进程终止
【发布时间】:2014-04-18 00:41:58
【问题描述】:

当进程终止并为其发出 wait() 时会发生什么?当一个孩子终止但没有人为它执行 wait() 时会发生什么?如果您对尚未终止的进程执行 wait() 会发生什么情况?

【问题讨论】:

  • 我发现当子进程终止并且父进程不等待时会发生什么,子进程变成了僵尸。

标签: c linux unix process wait


【解决方案1】:

如果我误解了这些问题,请告诉我:

  • 当进程终止并为其发出 wait() 时会发生什么?

    终止的进程将其退出状态返回给它的父进程,父进程 使用wait

  • 当一个孩子终止但没有人为它执行 wait() 时会发生什么?

    正如你在评论中所说,被终止的孩子变成了僵尸 进程,直到其父进程获得退出状态,使用wait

  • 如果您对尚未终止的进程执行 wait() 会发生什么 还没有?

    通常,执行wait 的进程将阻塞,直到它获得其子进程的退出状态(尽管可以告诉它不要阻塞,使用waitpid(2),“wait 系统调用组中的另一个系统调用",提供了更多选择)。通过块,我们的意思是它会在子进程执行时暂停执行。当子进程终止时,它会向操作系统返回一个退出状态。然后将该退出状态返回给其使用wait 的父进程,在得到它后恢复执行。


就僵尸进程而言:

当一个进程死亡时,它的子进程自动成为init的子进程,这是一个只用来做wait的进程。因此,如果一个僵尸进程的父进程在没有wait 的情况下死亡以获取其僵尸子进程的退出状态,那么init 将执行此操作,因为它将成为僵尸进程的新父进程。

【讨论】:

  • 非常感谢您的回答。在第三个答案中,block 是什么意思?你能详细说明一下吗?我是否正确地说所有僵尸进程都将被 init 进程终止?
  • @Duck +1。那时我应该提到waitpid。我现在就编辑。
  • @user3304140 进程保持在僵尸状态,直到它的父进程等待它并读取子进程的退出状态。如果父进程在没有读取退出状态的情况下也终止了,则 init 进程执行此任务。如果父进程不想等待子进程完成,则可以使用“WNOHANG”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多