【问题标题】:Why is a zombie process necessary?为什么需要僵尸进程?
【发布时间】:2013-05-01 06:34:12
【问题描述】:

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

那么这实际上如何“有用”?如果指定的僵尸进程被删除而不是保留在那里,那么 PID 是否不可用?

或者还有什么其他原因导致僵尸进程应该存在?

【问题讨论】:

    标签: linux unix process fork zombie-process


    【解决方案1】:

    答案也在维基百科上,即:

    仍需要此条目以允许父进程读取其 孩子的退出状态。

    【讨论】:

      【解决方案2】:

      僵尸进程很有用。

      僵尸进程允许父进程保证能够检索子进程的退出状态、记帐信息和进程 ID。

      未清理其子僵尸的进程未正确编程。

      【讨论】:

      • 发送 SIGCHLD 到僵尸进程的父进程如何删除僵尸?你有这方面的参考吗?此外,每个创建在某个点终止的子进程的进程都会创建一个僵尸进程。所以声明“创建僵尸进程的程序没有正确编程”。也不正确。我想你的意思是“一个没有清理它的子僵尸的进程没有正确编程”
      • 在子进程退出时自动向父进程发送SIGCHLD。除非父进程被正确编程,即使用wait() 调用之一,重新发送它将产生零效果,如果它被正确编程,它将已经处理了原始信号,所以再次处理它只会混淆它并导致无论使用哪个wait() 调用都会出错。
      • 如果父 SIGCHLD 处理正确实现,则不必在 wait() 调用中导致错误。它只会导致不必要的信号处理程序调用。否则你是对的:如果孩子的状态发生变化,POSIX 兼容的操作系统将发送SIGCHLD,因此手动发送SIGCHLD 不会改善这种情况。
      【解决方案3】:

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

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

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

      这就是为什么需要一个僵尸进程

      脚注:如果父进程从不调用wait(),那么当父进程终止时,子进程将重新成为init 进程的父进程,而init 将为子进程提供wait()

      【讨论】:

        猜你喜欢
        • 2013-04-11
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 2017-03-15
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 2014-09-30
        相关资源
        最近更新 更多