Unix 什么';反对双重分叉守护进程和会话领导者的原因是什么?

Unix 什么';反对双重分叉守护进程和会话领导者的原因是什么?,unix,daemon,Unix,Daemon,(有关:大约1000个与进程后台监控相关的问题。) “因为史蒂文斯这么说”,我一直在基地做“双叉” 当然,这是可行的,99.9%的时间它没有明显的区别,但它的效率比我希望的守护进程要低一些,守护进程应该尽可能快地启动(和关闭/重新启动),其间的停机时间尽可能少。 不,fork仍然不是一个精确的轻量级系统调用,所以如果没有绝对紧迫的理由做两次,我很乐意跳过一次 我理解中间父级退出的单个fork的用途(从技术上讲,这已经是两个fork,一个由shell完成),这将孤立守护进程,使init采用它,并允

(有关:大约1000个与进程后台监控相关的问题。)

“因为史蒂文斯这么说”,我一直在基地做“双叉”

当然,这是可行的,99.9%的时间它没有明显的区别,但它的效率比我希望的守护进程要低一些,守护进程应该尽可能快地启动(和关闭/重新启动),其间的停机时间尽可能少。
不,
fork
仍然不是一个精确的轻量级系统调用,所以如果没有绝对紧迫的理由做两次,我很乐意跳过一次

我理解中间父级退出的单个fork的用途(从技术上讲,这已经是两个fork,一个由shell完成),这将孤立守护进程,使init采用它,并允许假定的shell返回提示符(或继续执行批处理文件,等等)

setsid()
现在将把守护进程放在一个新的会话中,因此根据定义,它将位于与终端使用的会话不同的会话中。您之所以关心这一点,是因为关闭外壳/终端会杀死守护进程,否则这可能是不可取的。
守护进程现在也是该新会话的会话负责人(进程负责人和唯一进程)

现在。。。您需要拨出第二次(实际上是第三次)时间来保证守护进程不是会话负责人,因为这显然是一件坏事。很难找到一个好的解释来解释为什么这是一件坏事,但它可能允许意外打开一个终端,并使其成为守护进程的控制终端。我想,这也意味着当终端关闭时,它会被杀死

这是我不明白的部分。突然,我甚至不知道如何打开一个控制终端(打开
/dev/tty
?),也不知道我为什么要这样做,也不知道它是如何意外发生的,更何况
chroot
会使在
/dev
中打开随意的文件有点困难,即使是故意的,假设某个守护进程根据未经验证的用户请求天真地打开文件,而您正试图故意恶意

因此,我到底想用第二把叉子来防御什么?作为会议主持人实际上是一个实际问题,而不是完全理论问题吗?

参见