子进程可以在没有父进程死亡的情况下<defunct>吗?</defunct>

时间:2011-12-12 22:27:56

标签: c process signals freebsd defunct

kill - does it kill the process right away?

我找到了答案,并为SIGCHLD设置了一个信号处理程序,并在该处理程序中引入了wait。这样,只要父进程kill是子进程,就会调用此处理程序并调用wait收割子进程。 - 动机是清除流程表条目。

即使没有父进程死亡,我仍然会看到一些子进程持续几秒钟。 - 这怎么可能?

我通过ps看到了这一点。准确ps -o user,pid,ppid,command -ax并为父进程,子进程和已解散而烦恼。

2 个答案:

答案 0 :(得分:6)

进程在退出后立即停止(僵尸)(从信号,呼叫exit,从main返回,无论如何)。它会保持僵尸状态,直到其父母wait为止。

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

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

答案 1 :(得分:5)

子进程只有在其父进程没有死亡且尚未等待时才会失效(成为僵尸)。如果原始父母死亡,则孩子的父母成为进程ID 1,该进程的主要任务是等待其(继承的)子女死亡并将其从进程列表中删除,以便他们不是僵尸。 (注意:孤立的子节点或守护进程由PID 1自动继承;它不会被分配给进程层次结构中的祖父母或曾祖父母。)

在孩子死亡和父母通过wait()(或waitpid(),或waitid()或任何其他变体)收集退出信息之间,它是一个僵尸流程列表,defunct显示为ps

但要回答你问题的标题:

  • 是的,如果没有父母的死亡,这个过程就会失效。

(如果其父母没有去世,它只会失效。)