为什么在守护进程时fork()两次?

时间:2015-07-17 21:46:44

标签: c unix fork posix daemon

我为什么会打电话给fork()两次,为什么第一次通话是在 setsid()之前执行

是的,如果调用者已经是进程组负责人,则不会创建新会话。但是,如果我不让(大)父母成为流程组组长呢?谁会为我做(不问我)? (好吧,也许1llum1n4t1,Sc13nt0l0gy,国家安全局,...;))

是的,第一个孩子应立即退出 不要创建僵尸进程。但是,(大)父母不能在分叉后退出吗?或者,一个或两个fprintf(stderr,...write(2,...调用(例如"成功启动守护程序xy")是否会成为大笔交易? (并且我不能以另一种方式阻止僵尸吗?)

总而言之,这是双重的 - fork() - "魔法"真的需要(不要麻烦)? 或者它只是传统或所谓的"最佳实践" (就像避免goto)? 或者它只是保证守护进程能够继续工作"历史" (当然我的意思是"在生产环境和#34;)平台上使用的时间太旧了,比如SVr4,BSD 3,RHEL 2或者一些蹩脚的32位嵌入式平台?

1 个答案:

答案 0 :(得分:10)

第一次调用fork(2)可确保该流程不是组长,因此该流程可以创建新会话并成为会话负责人。第一个fork(2)还有其他原因:如果守护程序是作为shell命令启动的,那么使用进程fork和父出口会使shell返回其提示并等待更多命令。

第二个fork(2)用于确保新进程不是会话领导者,因此无法(意外地)分配控制终端,因为守护进程不应该有控制终端。关于第二个分支,这里引用了 UNIX环境中的高级编程,第13章(守护程序进程):

  

在基于System V的系统中,有些人建议再次调用fork   此时,终止父节点,并继续守护进程   孩子这可以保证守护进程不是会话负责人,   这使得它无法获得控制终端   系统V规则。或者,避免获得控制权   终端,每次打开终端时一定要指定O_NOCTTY   设备

该书的第13.3节描述了在守护进程时使用的更多规则和模式,如果可以的话,值得花时间阅读它。