关于流程生命周期的问题

Bod*_*sha 2 process system-calls exit wait

我已经设法对流程生命周期中的系统调用wait(2)_exit(2)系统调用进行了质疑。

我关于wait(2)系统调用的问题是......父进程是否将它发布给内核?还是内核将其发布给父进程?并且是_exit(2)从子进程到父进程的 [ ] 系统调用问题吗?还是子进程_exit(2)向内核发出 [ ] ?

我尝试谷歌搜索并观看 youtube 视频以获得答案......但我从未看到任何特定于此的东西。

ica*_*rus 5

系统调用总是由进程对内核进行。

所以要回答具体问题。

  1. 父进程wait调用内核。
  2. 子进程exit调用内核。

以下是对所发生情况的简化视图。

当进程调用exit内核时,将参数 (the return code)存储在内部进程表中,销毁与该进程关联的所有其他资源(分配的内存、打开的文件描述符)并将进程标记为zombie.

当父进程调用wait内核时,内核会检查是否有子进程处于zombie状态。如果是,那么它return code从内部进程表中获取存储,释放表中的槽并从wait系统调用返回return code. 如果子zombie进程不在状态,则内核会阻塞父进程,直到子进程调用exit.

当任何进程调用时,exit任何剩余的子进程都reparented将指向 PID 为 1 的进程,因此除第一个进程之外的所有进程总是有一个父进程。

PID 1 启动所有运行(网络服务、串行线路上的侦听器、gui 登录程序),然后进入无限循环调用,wait因此内核进程表不会被僵尸填满。

我简化了很多事情,这些天你可以要求内核重新父进程而不是进程号 1 a subreaper,有很多wait调用形式(wait、waitid、waitpid、wait3、wait4(man pages),与ptrace系统调用的交互,销毁分配的资源意味着什么等。

  • 另一种机制可用。每当进程退出时,内核都会向父进程发送 SIGCHLD 信号。默认操作是家长忽略这一点。但是,父级可以选择为 SIGCHLD 提供信号处理程序,并在每个子级首次可用时获取其退出状态。这使得父级在有更有用的工作要做时不会挂起等待。 (2认同)