究竟kill
是做什么的?
我有一个父进程,它一个接一个地创建 100 个(例如)子进程。在任何孩子的工作结束时,我都会杀死孩子,但我在输出kill(pid_of_child, SIGKILL)
中看不到它。ps
但是,如果父进程出现问题并且我退出父进程exit(1)
(此时只有 1 个子进程 - 我可以检查ps
),那么我会看到很多<defunct>
进程ppid
属于pid
父进程。
这怎么可能?没有kill
完全杀死子进程?
kill
不会杀死任何东西。它向目标进程发送信号。SIGKILL
只是一个信号。现在,标准动作SIGKILL
——实际上,唯一的动作,因为SIGKILL
不能被进程处理或忽略——是退出,这是真的。
“<defunct>”进程是一个没有被收割的子进程,这意味着父进程没有调用wait()
来检索子进程的退出状态。在父调用之前wait()
,已失效(或“僵尸”)进程将一直存在。
每当一个进程结束时,无论它如何结束(kill
或以其他方式结束),它都将留在内核的进程表中,直到其父进程检索到它的退出状态(与wait
好友)。将它留在进程表中可以避免许多讨厌的竞争条件。
如果您的父进程已退出,则应将子进程重新分配给init
,它会定期收割其子进程。
是的,SIGKILL 终止进程,但在任何情况下(正常退出或终止),进程都有一个退出状态,需要为潜在的读者保留它 - 因为进程表中的这样一个条目可能会保留到完成为止。请参阅http://en.wikipedia.org/wiki/Zombie_process。