Answers:
僵尸进程已经死亡。你不能杀死他们。该kill
命令或系统调用对僵尸进程没有影响。(您可以让僵尸离开kill
,但您必须射击父母,而不是射击僵尸,正如我们稍后会看到的。)
僵尸进程实际上不是一个进程,它只是进程表中的一个条目。僵尸进程没有其他资源:它没有任何内存或任何正在运行的代码,它没有打开任何文件,等等。
当进程终止时,清除所有其他资源后,最后要做的就是进程表中的条目。该条目会保留,形成一个僵尸,以允许父进程跟踪子进程的退出状态。父级通过调用wait
syscall系列之一来读取退出状态。此时,僵尸消失了。wait
据说打来电话可以收割孩子,扩大了僵尸死了的比喻,但在某种程度上仍无法完全解决来世。父级也可以表示它不在乎(通过忽略SIGCHLD信号,或通过sigaction
使用SA_NOCLDWAIT
标志进行调用),在这种情况下,进程表中的条目将在子级死亡时立即删除。
因此,僵尸仅在进程死亡且其父进程尚未调用时才存在wait
。只要父级仍在运行,此状态就可以持续。如果父母在孩子之前死亡或在未读取孩子状态的情况下死亡,则将僵尸的父进程设置为PID为1的进程init
。的一项工作init
是wait
循环调用,从而获得其父级留下的任何僵尸进程。
一旦进程的父进程去世,该进程将成为一个孤儿-不管它是否是僵尸。孤儿会怎样?他们有了一个新父母,名为init
。init
将wait
在收集到的每个孤儿上进行收割,从而收获孤儿(也可能是僵尸)。
init
不。要精确,不会杀死任何进程。它只是wait
依靠孩子来收集自己的身份。