我找到了答案,并为该处理程序设置SIGCHLD
并引入了信号处理wait
程序。这样,每当父进程kill
成为子进程时,都会调用此处理程序并调用wait
以获取子进程。- 动机是清除进程表条目。
我仍然看到一些子进程运行了几秒钟,即使它的父进程没有死亡。- 这怎么可能?
我通过ps
. 准确地ps -o user,pid,ppid,command -ax
和greping父进程,子进程和已失效。
一个进程在退出后立即失效(僵尸)(从一个信号,调用到exit
,从返回main
,等等)。它保持僵尸状态,直到wait
被其父级打开。
因此,所有进程在退出时至少会短暂地变成僵尸。
如果父进程在调用之前需要一点时间(因为它正在做其他工作,或者只是因为调度程序还没有给它 CPU 时间)wait
,那么你会看到僵尸一段时间。如果父级从不调用wait
,那么当它最终退出时,init
(pid 1) 将采用它的僵尸子级,并调用wait
它们。
只有当它的父进程没有死亡并且还没有等待它时,子进程才会失效(成为僵尸) 。如果原来的父进程死亡,那么子进程的父进程 ID 为 1,该进程的主要任务是等待其(继承的)子进程死亡并将它们从进程列表中删除,这样它们就不是僵尸了。(注意:孤儿或守护进程由 PID 1 自动继承;它不会分配给进程层次结构的祖父母或曾祖父母。)
在子进程死亡和父进程通过wait()
(或waitpid()
,waitid()
或任何其他变体)收集退出信息的时间之间,它是进程列表中的僵尸,如defunct
所示ps
。
但是要回答您的问题的标题:
(而且它只有在它的父母没有死的情况下才能失效。)