kill
到底做了什么?
我有一个父进程,它一个接一个地创建100(作为示例)子进程。在任何孩子的工作结束时,我用kill(pid_of_child, SIGKILL)
杀死了孩子,我在ps
输出中看不到。但是如果父进程出现问题并且我从父进程退出exit(1)
(此时只有1个孩子在那里 - 我可以在ps
中查看),那时我看到了很多<defunct>
个进程的ppid
是父进程的pid
。
怎么可能? kill
没有完全杀死子进程吗?
答案 0 :(得分:8)
kill
不会杀死任何。它将信号发送到目标进程。 SIGKILL
只是一个信号。现在,SIGKILL
的标准操作 - 实际上,唯一的操作,因为SIGKILL
无法被进程处理或忽略 - 是退出,这是真的。
“&lt; defunct&gt;”进程是一个尚未收集的子进程,这意味着父进程没有调用wait()
来检索子进程的退出状态。在父母呼叫wait()
之前,已经失效(或“僵尸”)的过程将会出现。
答案 1 :(得分:7)
每当进程结束时,无论结束如何(kill
或其他),它都将保留在内核的进程表中,直到其父进程检索其退出状态(使用wait
和朋友)。将它留在流程表中可以避免一些讨厌的竞争条件。
如果您的父进程已退出,则应将子进程重新分配给init
,这会定期收回其子进程。
答案 2 :(得分:1)
是的,SIGKILL终止进程,但无论如何(正常退出或终止),进程都有退出状态,需要为潜在的读者保留 - 因为进程表中的条目可能会保留到此已经完成了。请参阅http://en.wikipedia.org/wiki/Zombie_process。