前言
最近在做的项目需要定期检测某个进程是否运行,若挂了自动重启,脑袋一拍觉得需要这样一个守护进程 来进行监控,于是顺便复习了一下守护进程。
正文
什么是守护进程?
守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。
—–《APUE》
我们需求就是默默地定期执行任务 与守护进程非常的匹配。
编写一个守护进程
守护进程需要
- 设置文件模式创建屏蔽字。
- 没有控制终端。
- 确定工作目录。
- 关闭不再需要的文件描述符。
- 告别标准输入输出
如何实现
文件模式屏蔽字
只需要通过umask()
即可,由继承(至于为什么是继承,请看后面)得到的文件模式创建屏蔽字可能已经被修改为拒绝某些权限,所以我们最好根据需要进行重新设置。
甩掉控制终端
我们希望守护进程在后台默默运行不受控制终端的控制。这里是通过setsid()
函数来实现。调用这个函数的效果是:
1)创建一个新会话(session)
2)创建一个新进程组。
3)调用进程成为 新会话 的首进程
4)调用进程成为 新进程组 的组长进程
5)调用进程失去控制终端
最后一条正是我们需要的效果,但这个函数也有前提条件。那就是调用函数不能是进程组的组长进程,为了达到这个条件,我们通常的做法是,首先调用fork()
然后父进程退出,由子进程来