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

har*_*ari 4 c signals freebsd process defunct

杀 - 它会立即杀死这个过程吗?

我找到了答案,SIGCHLDwait为该处理程序设置了一个信号处理程序.这样,每当父进程执行kill子进程时,就会调用此处理程序并调用它wait获取子进程. - 动机是清除进程表条目.

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

我看到了这个ps.准确地ps -o user,pid,ppid,command -ax和父母的过程,子过程和失效.

der*_*ert 6

一个进程在退出时立即停止(僵尸)(从信号,呼叫exit,从其返回main,等等).它一直保持僵尸,直到wait它的父母为止.

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

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


Jon*_*ler 5

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

该儿童死亡和父收集经由所述出口信息的时间之间wait()(或waitpid(),或waitid()或任何其他变体的),它是在进程列表僵尸,示出为defunct通过ps.

但要回答你的问题标题:

  • 是的,一个过程可以在父母死亡的情况下解散.

(如果其父母没有去世,它只能解散.)