【发布时间】:2013-05-01 06:34:12
【问题描述】:
Wikipedia 基本上提供了我需要知道的有关僵尸进程的所有可能信息,但只是简单地说明了它的用途。如果父进程创建另一个子进程,则不会存在 PID 冲突.
那么这实际上如何“有用”?如果指定的僵尸进程被删除而不是保留在那里,那么 PID 是否不可用?
或者还有什么其他原因导致僵尸进程应该存在?
【问题讨论】:
标签: linux unix process fork zombie-process
Wikipedia 基本上提供了我需要知道的有关僵尸进程的所有可能信息,但只是简单地说明了它的用途。如果父进程创建另一个子进程,则不会存在 PID 冲突.
那么这实际上如何“有用”?如果指定的僵尸进程被删除而不是保留在那里,那么 PID 是否不可用?
或者还有什么其他原因导致僵尸进程应该存在?
【问题讨论】:
标签: linux unix process fork zombie-process
答案也在维基百科上,即:
仍需要此条目以允许父进程读取其 孩子的退出状态。
【讨论】:
僵尸进程很有用。
僵尸进程允许父进程保证能够检索子进程的退出状态、记帐信息和进程 ID。
未清理其子僵尸的进程未正确编程。
【讨论】:
SIGCHLD。除非父进程被正确编程,即使用wait() 调用之一,重新发送它将产生零效果,如果它被正确编程,它将已经处理了原始信号,所以再次处理它只会混淆它并导致无论使用哪个wait() 调用都会出错。
SIGCHLD 处理正确实现,则不必在 wait() 调用中导致错误。它只会导致不必要的信号处理程序调用。否则你是对的:如果孩子的状态发生变化,POSIX 兼容的操作系统将发送SIGCHLD,因此手动发送SIGCHLD 不会改善这种情况。
僵尸进程实际上非常重要,并且绝对需要存在。首先,了解进程创建在 Unix/Linux 中的工作原理很重要。创建新进程的唯一方法是让现有进程通过fork() 创建新的子进程。这样,系统上的所有进程都被安排在一个漂亮有序的树状层次结构中。尝试在 Linux 系统上运行 ps -Hu <your username> 以查看您拥有的进程的层次结构。
在许多程序中,父进程能够获取有关其已退出子进程的基本信息至关重要。这些基本信息包括孩子的退出状态和资源使用情况。当父进程准备好获取有关死子进程的信息时,它会调用wait() 函数之一来等待子进程退出并获取退出状态和资源使用信息。
但是如果子进程在父进程等待之前退出会发生什么? 这就是僵尸进程变得必要的地方。操作系统不能只丢弃子进程;父进程的操作可能取决于知道子进程的退出状态或资源使用情况。即父进程可能需要知道子进程异常退出,或者它可能正在收集其子进程的 CPU 使用率统计信息等。因此,唯一的选择是保存该信息并在最终完成时将其提供给父进程致电wait()。这些信息就是僵尸进程,它是进程管理在 Unix/Linux 上工作方式的关键部分。僵尸进程允许父进程保证能够检索子进程的退出状态、记帐信息和进程 ID,无论父进程在子进程退出之前还是之后调用 wait()。
这就是为什么需要一个僵尸进程。
脚注:如果父进程从不调用wait(),那么当父进程终止时,子进程将重新成为init 进程的父进程,而init 将为子进程提供wait()。
【讨论】: