摆脱僵尸的唯一方法是使其成为父系,wait()
以便它可以报告其退出状态。您可以通过发送SIGCHLD
给父母(假设父母编写正确)来做到这一点。
如果您有僵尸,这通常意味着父母的书写方式不正确(因为孩子SIGCHLD
在死亡而成为僵尸时已经发送给了父母),因此下一步就是杀死父母。
诸如pstree
(带有该-p
选项)之类的工具可以向您显示僵尸的血统,因此您知道哪个进程是父进程。
当父母去世时,僵尸将被收养init
,这总是wait()
让孩子死去,并乐于杀死所有收养的僵尸。
如果父进程实际上是init
(PID 1),那么您将处于永远不会发生的情况。您可以尝试发送SIGCHLD
到init
,但实际上不必这样做,并且如果这样做不起作用,则唯一的办法就是重新启动,因为系统init
已损坏且无法正常工作。
(这些是“ shot弹枪”选项。)
一些更有创意的人比我还拿出了这个选项,如果你想避免杀死父进程:
- 确定僵尸和父进程的PIDS
(对于本例,假设僵尸是PID 3101,父进程是PID 3100)
- 火起来
gdb
和attach
父:
attach 3100
- 呼吁
waitpid
僵尸:
call waitpid(3101,0,0)
- 从上级(
detach
)分离并退出调试器。
(这是一种微调的狙击步枪。)