daemon进程(转)

转自:http://www.pythoner.cn/home/blog/double-fork-when-creating-daemon/Daemon进程

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。

常见的Apache服务器(httpd),MySQL服务端(mysqld),作业规划进程(crond)都是以守护进程的方式运行于Linux系统中。

创建Daemon

守护进程最重要的特性是常驻后台运行,因此必须要与当前的运行环境完全隔离,这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等.。

为何两次Fork

这是创建Daemon进程的大致步骤及作用:

  • 第一次fork(产生父子进程,父进程退出,子进程与父进程控制终端脱离)

  • 子进程setsid(子进程成为会话组长,与父进程会话脱离)

  • 第二次fork(产生子孙进程,子进程退出,孙进程成为Daemon最终进程)

  • 切换工作目录、设置文件创建掩模、关闭所有打开文件句柄等

原则上来说在第一次fork后,子进程即与父进程的控制终端脱离关系,父进程退出后,子进程被init接管,基本达到了Daemon进程要求。但还差了一点,子进程与父进程还在同一个会话组,因此子进程需要调用setsid以达到与父进程会话脱离。也就是这个setsid,使子进程成为了新的会话组组长,却导致了新的问题产生:在Linux中会话组长可以重新申请打开一个控制终端。为了彻底与控制终端断绝关系,我们需要一个非会话组长的进程,子进程的子进程正是我们要的。

伪代码:

 
  
  1. void InitAsDaemon()
  2. {
  3. if (Fork() > 0)
  4. exit(0);
  5. setsid();
  6. if (Fork() > 0)
  7. exit(0);
  8. chdir("/");
  9. umask(0);
  10. }





转载于:https://www.cnblogs.com/ZhangJinkun/p/4555029.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值