【问题标题】:Can a child process go <defunct> without its parent process dying?子进程可以在其父进程不死的情况下运行 <defunct> 吗?
【发布时间】:2012-01-18 21:20:03
【问题描述】:

kill - does it kill the process right away?

我找到了答案,并为SIGCHLD 设置了一个信号处理程序,并在该处理程序中引入了wait。这样,每当父进程kills 成为子进程时,就会调用此处理程序并调用waitreap 子进程。 - 动机是清除进程表条目。

我仍然看到一些子进程运行了几秒钟,即使它的父进程没有死亡。 - 这怎么可能?

我通过ps 看到这个。准确地说是ps -o user,pid,ppid,command -ax 和 greping 父进程、子进程和已失效。

【问题讨论】:

    标签: c process signals freebsd defunct


    【解决方案1】:

    一个进程在退出后立即失效(僵尸)(从信号,调用exit,从main返回,等等)。它保持僵尸状态,直到 wait'd 被其父级启用。

    因此,所有进程在退出时至少会短暂地变成僵尸。

    如果父进程在调用wait 之前需要一点时间(因为它正在做其他工作,或者只是因为调度程序还没有给它CPU 时间),那么你会看到僵尸一段时间。如果父级从不调用wait,那么当它最终退出时,init(pid 1)将收养它的僵尸子级,并对它们调用wait

    【讨论】:

      【解决方案2】:

      子进程只有在其父进程还没有死亡并且还没有等待它时才会失效(变成僵尸)。如果原来的父进程死亡,那么子进程的父进程 ID 为 1,该进程的主要任务是等待其(继承的)子进程死亡并将它们从进程列表中删除,这样它们就不是僵尸了。 (注意:孤儿或守护进程由 PID 1 自动继承;它不会被分配给进程层次结构的祖父母或曾祖父母。)

      在子进程死亡和父进程通过wait()(或waitpid(),或waitid()或任何其他变体)收集退出信息的时间之间,它是进程列表中的僵尸,显示为defunctps

      但要回答你的问题的标题:

      • 是的,一个进程可以在其父进程不死的情况下终止。

      (而且它只有在它的父母没有死的情况下才能失效。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-14
        • 2015-08-06
        • 1970-01-01
        • 2013-06-11
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多