Linux 守护进程(Daemon process)

守护进程(Daemon)是一类在后台长期运行的特殊进程,一般在系统引导时开始启动,一直运行到系统关闭。守护进程一般用于提供某种服务,比如log打印守护进程syslogd,任务规划守护进程crond,实现Dbus总线功能的dbus守护进程等。
下面介绍一下如何创建一个守护进程,创建守护进程一般分为五个步骤:创建子进程并终止父进程、在子进程中创建新的会话、改变工作目录、重设文件创建掩码、关闭不需要的文件描述符。
1.创建子进程并终止父进程这一步实现了两点。第一,如果该守护进程是作为一条shell命令启动的,父进程终止会让那个shell认为该命令已经执行完毕。第二,子进程获得了一个新的进程ID,这保证了子进程不是一个进程组的组长进程,这是调用setid的先决条件。
if((pid=fork()) =-1) //若创建进程失败,则退出程序
{
perror(“fork error”);
exit(-1);
}
else if(pid>0) //进程id > 0,当前进程为父进程
exit(0); //退出父进程
else if(pid0) //进程id == 0,当前进程为子进程
{
//在子进程中进行后续的工作
}
2.在子进程中创建新的会话这一步可以使调用setsid的进程:a)成为新会话的首进程,b)成为一个新进程组的组长进程,c)没有控制终端,即不能通过终端来控制该进程
else if(pid
0)
{
setsid(); //在子进程中创建新会话
}
3.把当前工作目录改变为根目录从父进程继承过来的工作目录可能在一个挂载的文件系统中。由于守护进程通常在系统再引导之前是一直存在的,所以如果守护进程的当前工作目录在一个挂载的文件系统中,会导致该文件系统不能被卸载。
else if(pid0)
{
setsid(); //在子进程中创建新会话
chdir("/"); //改变当前工作目录
}
4.重设文件创建掩码文件创建掩码是指屏蔽掉文件创建时的对应位。由于使用fork系统调用新建的子进程继承了父进程的文件创建掩码,这就给该子进程使用文件带来了诸多的不便。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。
else if(pid
0)
{
setsid(); //在子进程中创建新会话
chdir("/"); //改变当前工作目录
umask(0); //重设文件权限掩码
}
5.关闭不需要的文件描述符用fork创建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程使用,但它们一样消耗系统资源,也可能导致所在的文件系统无法卸载。
else if(pid==0)
{
setsid(); //在子进程中创建新会话
chdir("/"); //改变当前工作目录
umask(0); //重设文件权限掩码
for(i=0;i<getdtablesize();i++)
close(i); //关闭打开的文件描述符
}
至此,守护进程就创建好了。从上面的创建步骤来看,守护进程与普通进程没有本质区别。因此,创建守护进样实际上是把一个普通进程按照上述的守护进程创建步骤改造成为守护进程。
既然守护进程不受控制终端的控制,那么如何处理守护进程的出错消息呢?我们不希望每个守护进程把它的出错消息写到一个单独的文件中,对一个系统管理人员来说,如果要关心哪个守护进程的错误消息写到哪一个记录文件中并定期检查,那么他一定会很头痛。因此,需要一个集中的守护进程出错记录设施,syslog就是这样一个设施,守护进程可以通过调用syslog函数来产生消息日志。
如果想看到更多相关分享,欢迎关注微信公众号“汽车软件后花园”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值