僵尸进程是在Unix / Linux系统中创建的。我们可以通过kill
命令将其删除。
但是Linux中是否有任何内置的清理机制来处理僵尸进程?
僵尸进程已经死亡。你不能杀死他们。该kill
命令或系统调用对僵尸进程没有任何影响。(您可以用来使僵尸消失kill
,但您必须射击父母,而不是射击僵尸,正如我们稍后会看到的那样。)
僵尸进程实际上不是一个进程,它只是进程表中的一个条目。僵尸进程没有其他资源:它没有任何内存或任何正在运行的代码,它没有打开任何文件,等等。
当进程终止时,在清除所有其他资源之后,最后要做的就是进程表中的条目。该条目会保留,形成一个僵尸,以允许父进程跟踪子进程的退出状态。父级通过调用wait
syscall系列之一来读取退出状态。此时,僵尸消失了。wait
据说打来电话可以收割孩子,扩大了僵尸死了的比喻,但在某种程度上仍无法完全解决来世的问题。父级也可以指示它不在乎(通过忽略SIGCHLD信号,或通过sigaction
使用SA_NOCLDWAIT
标志进行调用),在这种情况下,进程表中的条目将在子级死亡时立即删除。
因此,僵尸仅在进程已死亡且其父级尚未调用时才存在wait
。只要父级仍在运行,此状态就可以持续下去。如果父级在孩子之前死亡或在未读取孩子状态的情况下死亡,则僵尸的父级进程将设置为PID为1的进程init
。的工作之一init
是wait
循环调用,从而获得其父级留下的任何僵尸进程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句