新父级是否总是"初始化",或者是否有某种方法可以控制谁成为新父级?
维基百科似乎表明它总是"init"。我真的希望情况并非如此。我已经尝试了我能想到的所有setpgid和setsid,但没有运气。现在我看到这篇维基百科文章,我需要建议。
在类 Unix 操作系统中,任何 孤立的进程将立即 被特殊初始化系统采用 过程。此操作称为 重新育儿并自动发生。 即使从技术上讲,这个过程 将"init"进程作为其父进程, 它仍然被称为孤立进程 自从最初的过程 创建它不再存在。 取自维基百科
我问的原因是因为我正在制作一个运行许多工作进程的 Mac 应用程序。我希望这些工作进程在任务管理器的进程层次结构中显示为主进程的子进程。一些工作线程以不同的用户身份运行,在Mac OS X上,我需要分叉两次才能将权限传递给子进程。因为我"双分叉"了目前作为deamons运行的工人,并且在查看任务管理器时,我看到工人将"init"作为他们的父进程。
孤儿总是被init
收养。没有Unix
方法可以将父进程更改为某些非初始化进程。
从 Linux 3.4 开始,这不再是严格正确的。仍然没有可移植的Unix方法可以做到这一点,但正如Andy Lutomirski指出的那样,Linux 3.4为prctl
增加了PR_SET_CHILD_SUBREAPER
。
实际上,子收割者为其履行了
init(1)
的角色 后代进程。
在 Linux 上,您可以使用 PR_SET_CHILD_SUBREAPER 来指示您的孤立后代应该重新成为您的父级,而不是 init。
我认为retyr可以执行您想要的操作。看看吧:
https://linux.die.net/man/1/reptyr
https://github.com/nelhage/reptyr