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

har*_*ari 4 c freebsd kill process defunct

到底kill是做什么的?

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

怎么可能?没有kill彻底杀死孩子的过程?

Ern*_*ill 8

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

在"<解散>"进程尚未孩子收获,这意味着父母已经不叫wait()取回孩子的退出状态.在父母打电话之前wait(),已经失效(或"僵尸")的过程会一直存在.

  • "现在,SIGKILL的标准行动是退出,这是真的." - 值得一提的是,它不能有"非标准动作",因为`SIGKILL`不能被捕获或忽略(例如,与`SIGTERM`形成对比,后者通常被捕获以执行干净的过程终止). (2认同)

Die*_*Epp 7

无论何时进程结束,无论结束如何(kill或以其他方式),它都将保留在内核的进程表中,直到其父进程检索其退出状态(使用wait和朋友).将它留在过程表中可以避免一些令人讨厌的竞争条件.

如果您的父进程已退出,则应重新分配子进程init,这会定期收回其子进程.