维基百科基本上提供了我需要知道的关于僵尸进程的所有可能信息,但只是关于它如何有用的简单线路......因为在父进程创建另一个子进程的情况下,PID中的冲突将不存在。
这实际上是如何“有用”的?如果要删除命名的僵尸进程而不是保留在那里,那么PID是不是可用?
还有其他原因可以解释为什么僵尸进程应该存在吗?
答案 0 :(得分:15)
僵尸进程实际上非常重要,绝对需要存在。首先,了解流程创建在Unix / Linux中的工作原理非常重要。创建新流程的唯一方法是让现有流程通过fork()
创建新的子流程。通过这种方式,系统上的所有进程都排列在一个很好的有序树的层次结构中。尝试在Linux系统上运行ps -Hu <your username>
以查看您拥有的进程的层次结构。
在许多程序中,父进程能够获取有关已退出的子进程的基本信息至关重要。该基本信息包括孩子的退出状态和资源使用情况。当父级准备好获取有关死子进程的信息时,它会调用其中一个wait()
函数来等待子进程退出并获取退出状态和资源使用信息。
但是,如果子进程在父进程等待之前退出,会发生什么? 这是僵尸进程变得必要的地方。操作系统不能只丢弃子进程;父进程的操作可以取决于知道子进程的退出状态或资源使用情况。即,父进程可能需要知道子进程异常退出,或者它可能正在为其子进程收集CPU使用情况统计信息等。因此,唯一的选择是保存该信息并使其最终可用于父进程。致电wait()
。这些信息是僵尸进程的信息,也是进程管理在Unix / Linux上运行的关键部分。僵尸进程允许父母保证能够检索子进程的退出状态,记帐信息和进程ID,,无论父进程在子进程退出之前还是之后调用wait()
。
这就是zombie进程 的必要条件。
脚注:如果父进程从不调用wait()
,那么当父进程终止时,子进程将重定位到init
进程,而init
将wait()
为{{1}}孩子。
答案 1 :(得分:5)
答案也在维基百科上,即:
仍需要此条目以允许父进程读取它 孩子的退出状态。
答案 2 :(得分:-3)
僵尸进程很有用。
Zombie进程允许父母保证能够检索子进程的退出状态,记帐信息和进程ID。
未清理其子僵尸的进程编程不正确。