Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244463
  • 博文数量: 39
  • 博客积分: 199
  • 博客等级: 二等列兵
  • 技术积分: 426
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-25 14:39
个人简介

博客已全部转移至个人站 www.jasonwho.com

文章分类

全部博文(39)

文章存档

2017年(2)

2014年(1)

2013年(28)

2010年(8)

分类: 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重定向到需要的地方。

阅读(1624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~