杀 - 它会立即杀死这个过程吗?

时间:2011-12-12 01:05:52

标签: c process freebsd kill defunct

kill到底做了什么?

我有一个父进程,它一个接一个地创建100(作为示例)子进程。在任何孩子的工作结束时,我用kill(pid_of_child, SIGKILL)杀死了孩子,我在ps输出中看不到。但是如果父进程出现问题并且我从父进程退出exit(1)(此时只有1个孩子在那里 - 我可以在ps中查看),那时我看到了很多<defunct>个进程的ppid是父进程的pid

怎么可能? kill没有完全杀死子进程吗?

3 个答案:

答案 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