博客已全部转移至个人站 www.jasonwho.com
全部博文(39)
分类: C/C++
2013-01-21 16:23:37
今天看FastDFS的代码,读到daemon_init时看到了熟悉的二次Fork,记忆有点模糊,想复习下究竟,结果网上很多贴子针对第二次Fork都引用了原APUE中的说明:
#保证了精灵进程不是对话期首进程,可以防止它取得控制终端
至于防止的细节却很难看到。而我们在实际使用中,似乎使用一次Fork,配合setsid就完全可以达到我们的daemon目的,而且在glibc中也都有现成的daemon函数实现,完全没有必要自己去写。因此在此对daemon稍作总结:
1、daemon第一次fork后,父进程退出,子进程的过继给init避免了僵死;
2、通过setsid,使子进程达到三个目的:
(a)成为新对话期的首进程;(b)成为一个新进程组的首进程;(c)没有控制终端
3、根据应用程序实际情况,如果能说清楚子进程“可能取得”控制终端的话,再进行第二次fork,使步骤1中子进程退出;如果实际场景中根本没有这类情况出现,我觉得就直接使用系统提供的daemon吧,毕竟系统的还是比较好用!
4、关闭相应的0,1,2或使用dup重定向到需要的地方。