僵尸进程是在 Unix/Linux 系统中创建的。我们可以通过kill
命令删除它们。
但是Linux中有没有内置的清理机制来处理僵尸进程呢?
答案1
僵尸进程已经死亡。你不能杀死他们。命令kill
或系统调用对僵尸进程没有影响。 (你可以让僵尸离开kill
,但你必须射击父母,而不是僵尸,我们稍后会看到。)
僵尸进程并不是真正的进程,它只是进程表中的一个条目。没有与僵尸进程关联的其他资源:它没有任何内存或任何正在运行的代码,它不保存任何打开的文件等。
当一个进程死亡时,在所有其他资源都被清理之后,最后消失的是进程表中的条目。该条目被保留,形成僵尸,以允许父进程跟踪子进程的退出状态。父级通过调用其中之一来读取退出状态wait
系统调用家族;此时,僵尸消失了。wait
据说打电话收获孩子,延伸了僵尸已死但在某种程度上仍未完全进入来世的隐喻。父级还可以表明它不关心(通过忽略 SIGCHLD 信号,或者通过调用sigaction
带有SA_NOCLDWAIT
标志),在这种情况下,当子进程死亡时,进程表中的条目将立即被删除。
因此,僵尸仅在进程死亡且其父进程尚未调用时才存在wait
。只有当父进程仍在运行时,此状态才会持续。如果父进程先于子进程死亡或者在没有读取子进程状态的情况下死亡,则僵尸进程的父进程将被设置为PID为1的进程,即init
。的工作之一init
是wait
循环调用,从而获取其父进程留下的任何僵尸进程。
答案2
你不是kill
僵尸进程,因为它已经死了。
僵尸进程必须wait
由其父进程编辑,以便收集其退出状态。
Linux 中唯一的“内置清理机制”适用于任何父进程在收集其子进程的退出状态之前死亡的情况。在这种情况下,每个子进程都由进程继承init
,进程将wait
在子进程上收集其退出状态并删除其在进程表中的条目。
答案3
一旦进程的父进程死亡,该进程就会成为孤儿进程 - 无论它是否是僵尸进程。孤儿会怎样?他们有了一个新的父母,名叫init
。init
将作用wait
于它收集的每个孤儿,从而收获孤儿(也可能是僵尸)。
答案4
不,没有内置的僵尸清理机制。一旦父母被杀,僵尸就会进入僵尸天堂。在此之前,操作系统会让它们将退出状态返回给父级。