(相关:大约1000个与守护进程相关的问题。)
我在"基础上永远做双叉,因为史蒂文斯这么说" 。
当然,这是有效的,并且99.9%的时间没有明显的区别,但它的效率略低于我想要的守护进程,它应该以尽可能快的速度启动(和关闭/重启)可以实现尽可能少的停机时间
不,fork
仍然不是一个轻量级的系统调用,所以如果没有两次绝对紧迫的原因,我很乐意跳过它一次。
我理解单个fork与中间父级退出的目的(技术上,已经两个分叉,一个由shell完成),这个孤立守护进程,使init采用它,并允许假定的shell返回提示符(或继续执行批处理文件,无论如何)。
setsid()
现在将守护进程放在新会话中,因此根据定义,它将位于与终端使用的会话不同的会话中。你关心这一点,因为关闭shell /终端会杀死守护进程,否则这可能是不可取的
守护进程现在也该新会话的会话负责人(以及进程负责人和唯一进程)。
现在......你要分叉第二个(实际上是第三个)时间来保证守护进程不会话领导者,因为这显然是一件坏事。找到一个很好的解释为什么它是一件坏事有点困难,但可能它允许意外打开终端并使其成为守护进程的控制终端。我想,这也意味着当该终端关闭时它会被杀死。
在这里,我们处理的是我不理解的部分。出乎意料的是,我甚至不知道如何打开一个控制终端(打开/dev/tty
?),也不知道为什么我要这样做,也不知道如何在意外发生,甚至更多所以chroot
即使故意在/dev
中打开随意文件也会有些困难,假设例如守护进程根据未经验证的用户请求天真地打开文件,并且您试图故意恶意。
因此,我究竟想用这个第二个叉子来防范这个问题?会议领导者实际上是一个实际的,不是完全理论的问题吗?