我知道一些(所有?)守护进程在启动时会分叉.我的印象是,将子进程作为权限较低的用户运行,特别是如果守护进程类似于HTTP服务器.
为什么这有必要呢?如果没有分支子进程,进程是否无法启动并删除其权限?它是"强制性的"分叉,还是有其他特殊原因(除了运行多个子工作进程)?
我是新手,非常感谢我能得到的所有帮助.
P S*_*ved 20
我认为守护进程有几个原因:
一个原因是将进程与启动它的任何shell分离.有些炮弹(例如Bash)会在退出时杀死儿童,除非采取特殊的,特定于炮弹的预防措施.分叉是避免这种情况的通用方法.
另一个原因是报告守护程序已成功启动.
假设它没有分叉.你怎么知道守护进程已成功启动?您不能只读取和解析守护程序输出,因为守护程序管理程序应该以通用方式执行.所以唯一的方法是获取程序的返回代码.
实际上,如果守护程序无法启动(例如,它找不到配置文件),您会立即知道.但是,嘿,如果一个守护进程已成功启动,它可能永远不会返回!因此,您的守护程序管理器无法知道守护程序是否仍在尝试启动或已启动,并且正在运行.Fork可以解决问题,如果fork运行良好,分叉程序将返回成功.
至于特权,投下他们以后execve是不是这样做之前安全的要少得多execve.这是fork方便的另一个原因.
守护进程必须分叉两次,因为它们必须独立于其他进程,即没有办法杀死守护进程杀死另一个进程,并且必须在后台运行,而不是连接到终端.
在启动时,守护进程叉和父进程死亡.这使得分叉进程成为子进程init,因此基本上它与其他进程无关.
在第二个分支上,孩子不再是过程领导者,而是与终端分离.
其他好的做法可能适用,阅读简单守护进程的源代码可能很有见地.