什么是“收货人”流程?


38

在某些答案中使用了“更便宜”一词。搜索Google还会列出“仅使用”一词的条目。

我如何理解什么是“次级”?


3
我以前从没听过这个词。您可以包括一些上下文参考吗?
Celada

5
这是一个:我在unix.stackexchange.com/a/177361/5132的答案中使用了它。
JdeBP 2015年

相关的问题,也许我应该在这里而不是在serverfault上发布serverfault.com/questions/747070/…–
artfulrobot

Answers:


49

这是作为系统调用prctl()的标志在Linux内核3.4中实现的。

prctl(2)联机帮助页:

[...]子收割者履行init(1)其后代流程的角色。在孤立的过程终止后(即其直接父级已经终止)并标记为具有次级收割者,最近的尚存祖先次级收割者将收到 SIGCHLD信号,并能够wait(2)在该过程中发现其终止状态。

流程可以将自身定义为的子收割者prctl(PR_SET_CHILD_SUBREAPER)。如果是这样,不是init(PID 1)将成为孤立子进程的父项,而是被标记为次要收割者的最近的在世祖父母将成为新的父项。如果没有活着的祖父母,那就init做。

实施这一机制的原因是,用户空间服务经理/主管(如upstartsystemd)需要跟踪他们开始服务。许多服务是通过双重分支来守护的,并隐式地重新关联到PID1 。服务管理器将不再能够为其接收SIGCHLD信号,并且不再负责通过收割子代wait()。在PID 1清除重新父级处理的那一刻,有关子项的所有信息都会丢失。现在,服务管理器进程可以将自身标记为一种“子初始化”,并且现在可以继续作为已启动服务创建的所有孤立进程的父级。所有SIGCHLD信号都将传递给服务经理。

在Linux中,通常通过分叉两次创建守护程序,而在分叉孙子之后退出中间进程。这是避免僵尸进程的常用技术。初始化脚本会调用一个孩子。那孩子再次分叉,因此立即退出。该孙子将由收养init,该孙子不断呼吁wait()收集其孩子的出境状况,以免造成僵尸。借助子收割者的概念,用户空间服务管理器现在成为了新的父项,而不是init


因此,我可以认为该过程“收获”了“子”过程吗?或者,该过程是“子”收割者,因为“主”收割者是init吗?只是想着这个词是如何产生的。感谢您的回答!
kenchew

3
在上面的Linux内核3.4链接之后, 此实现的提交注释具有更多详细信息。(敬畏隐藏在git注释中的细节)
kenchew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.