答案1
系统调用总是由进程对内核进行。
所以回答具体问题。
- 父进程调用
wait
内核。 - 子进程调用
exit
内核。
以下是所发生情况的简化视图。
当进程调用时,exit
内核将参数(return code
)存储在内部进程表中,销毁与该进程关联的所有其他资源(分配的内存、打开的文件描述符)并将该进程标记为zombie
.
当父进程调用内核时,wait
内核会检查是否有任何子进程处于zombie
状态。如果是这样,那么它return code
从内部进程表中获取存储的内容,释放表中的槽并从wait
系统调用中返回,传回return code
.如果子进程未处于zombie
状态,则内核会阻塞父进程,直到子进程调用exit
。
当任何进程调用时exit
,任何剩余的子进程都将reparented
指向 PID 为 1 的进程,因此除第一个进程之外的所有进程始终都有一个父进程。
PID 1 启动一切运行(网络服务、串行线路上的侦听器、GUI 登录程序),然后进入无限循环调用,wait
这样内核进程表就不会被僵尸填满。
有一个很多我已经简化了一些事情,现在您可以要求内核将进程重新设置为进程号 1 以外的进程副收割者,调用的形式有很多种wait
(wait、waitid、waitpid、wait3、wait4(手册页),与交互跟踪系统调用,破坏分配的资源意味着什么等等。