有人可以解释一下,当父进程通过 收到死子进程的退出状态时wait
,谁实际上重新分配了子进程的内存并将其从进程表中删除?
答案1
操作进程表和内存映射始终是内核的工作。当某个进程进行系统调用时,内核就会采取行动。当进程退出时,它使用的所有资源(包括内存,进程表中的条目除外)都将被删除 - 这就是系统_exit
调用的作用。然后,当父进程调用wait
或时waitpid
,该系统调用的部分工作是清理进程表条目。父进程可以决定wait
在需要时调用(如果父进程是init
,则它wait
几乎一直调用)。
答案2
内核假定父进程有兴趣了解它所分叉的任何子进程的结果。当子进程终止时,它会自动SIGCHLD
向父进程发送信号。如果父进程明确忽略该SIGCHLD
信号,则子进程将立即被清理并完全移除(并且不会变成僵尸进程)。否则,子进程将变成僵尸进程,直到父进程调用其中一个函数wait
从子进程中检索终止状态。
如果未检索到状态,孩子仍然是僵尸。但是,如果父进程在子进程之前退出,则子进程将被init
(进程 1)采用,该进程会立即收集状态,从而有效地删除僵尸进程。