4

究竟kill是做什么的?

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

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

4

3 回答 3

8

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

“<defunct>”进程是一个没有被收割的子进程,这意味着父进程没有调用wait()来检索子进程的退出状态。在父调用之前wait(),已失效(或“僵尸”)进程将一直存在。

于 2011-12-12T01:12:15.110 回答
7

每当一个进程结束时,无论它如何结束(kill或以其他方式结束),它都将留在内核的进程表中,直到其父进程检索到它的退出状态(与wait好友)。将它留在进程表中可以避免许多讨厌的竞争条件。

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

于 2011-12-12T01:11:51.663 回答
1

是的,SIGKILL 终止进程,但在任何情况下(正常退出或终止),进程都有一个退出状态,需要为潜在的读者保留它 - 因为进程表中的这样一个条目可能会保留到完成为止。请参阅http://en.wikipedia.org/wiki/Zombie_process

于 2011-12-12T01:11:25.097 回答