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

kill究竟做了什么?

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

怎么可能? kill不完全杀死孩子的过程?

kill不会杀死任何东西 。 它将信号发送到目标进程。 SIGKILL只是一个信号。 现在, SIGKILL的标准操作 – 实际上,唯一的操作,因为进程无法处理或忽略SIGKILL – 是退出,这是真的。

”进程是一个尚未收到的子进程,这意味着父进程没有调用wait()来检索子进程的退出状态。 在父调用wait() ,失效(或“僵尸”)进程将会挂起。

无论何时进程结束,无论结束如何( kill或其他),它都将保留在内核的进程表中,直到其父进程检索其退出状态(使用wait和friends)。 将它留在过程表中避免了许多令人讨厌的竞争条件。

如果您的父进程已退出,则应将子进程重新分配给init ,后者会定期收回其子进程。

是的,SIGKILL终止进程,但无论如何(正常退出或终止),进程都有退出状态,需要为潜在的读者保留 – 因为进程表中的条目可能会保留,直到完成为止。 见http://en.wikipedia.org/wiki/Zombie_process 。