linux - 为什么需要僵尸进程?

标签 linux unix process fork zombie-process

Wikipedia 基本上提供了我需要知道的关于僵尸进程的所有可能信息,但只是简单的一行说明了它的用处......因为如果父进程创建另一个子进程,PID 冲突将不存在.

这到底有什么“用处”?如果命名的僵尸进程被删除而不是保留在那里,那么 PID 是否可用?

或者是否还有其他原因导致僵尸进程存在?

最佳答案

僵尸进程实际上非常重要,绝对需要存在。首先,了解进程创建在 Unix/Linux 中是如何工作的很重要。创建新进程的唯一方法是让现有进程通过 fork() 创建新的子进程。 .这样,系统上的所有进程都排列在一个漂亮有序的树状层次结构中。尝试运行 ps -Hu <your username>在 Linux 系统上查看您拥有的进程的层次结构。

在许多程序中,父进程能够获得有关其已退出的子进程的基本信息是非常重要的。这些基本信息包括 child 的退出状态和资源使用情况。当父进程准备好获取有关死掉的子进程的信息时,它会调用 wait() 之一等待 child 退出并获取退出状态和资源使用信息的函数。

但是如果子进程在父进程等待之前就退出了怎么办? 这就是僵尸进程变得必要的地方。操作系统不能直接丢弃子进程;父进程的操作可能取决于了解子进程的退出状态或资源使用情况。即父进程可能需要知道子进程异常退出,或者它可能正在为其子进程收集 CPU 使用统计信息等。因此,唯一的选择是保存该信息并在父进程最终执行时将其提供给父进程调用wait() .这个信息就是僵尸进程是什么,它是进程管理如何在 Unix/Linux 上工作的关键部分。僵尸进程允许保证父进程能够检索子进程的退出状态、记帐信息和进程 ID,无论父进程是否调用 wait()在子进程退出之前或之后。

这就是僵尸进程的必要原因。

脚注:如果父进程从不调用 wait() , 然后子进程被重新设置为 init父进程死亡时的进程,以及initwait()为了 child 。

关于linux - 为什么需要僵尸进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16416793/

相关文章:

c - Linux 设备驱动程序中的事件代码 (EVIOCG*)

c - gethostbyname 问题

c++ - fork() 没有按预期工作

linux - Linux gcc 支持 coreleft 函数吗?

unix - 在unix中获取逗号分隔的不同值

c - prctl(PR_SET_PDEATHSIG) 竞争条件

具有匹配文件名的 Linux mv

linux - 如何将 Systemd 服务标准输出从 ExecStart 传输到 shell,例如。 bash ?

linux - 将 'srm' 设置为默认命令,而不是 linux 中的 'rm'

linux - grep 无法匹配另一个文件中的 1 个文件的内容