从进程表中删除僵尸进程

从进程表中删除僵尸进程

有人可以解释一下,当父进程通过 收到死子进程的退出状态时wait,谁实际上重新分配了子进程的内存并将其从进程表中删除?

答案1

操作进程表和内存映射始终是内核的工作。当某个进程进行系统调用时,内核就会采取行动。当进程退出时,它使用的所有资源(包括内存,进程表中的条目除外)都将被删除 - 这就是系统_exit调用的作用。然后,当父进程调用wait或时waitpid,该系统调用的部分工作是清理进程表条目。父进程可以决定wait在需要时调用(如果父进程是init,则它wait几乎一直调用)。

答案2

内核假定父进程有兴趣了解它所分叉的任何子进程的结果。当子进程终止时,它会自动SIGCHLD向父进程发送信号。如果父进程明确忽略该SIGCHLD信号,则子进程将立即被清理并完全移除(并且不会变成僵尸进程)。否则,子进程将变成僵尸进程,直到父进程调用其中一个函数wait从子进程中检索终止状态。

如果未检索到状态,孩子仍然是僵尸。但是,如果父进程在子进程之前退出,则子进程将被init(进程 1)采用,该进程会立即收集状态,从而有效地删除僵尸进程。

相关内容