守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程脱离终端的主要原因有两点:
(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。
(2)(如其他用户登录该终端后,以前的守护进程的错误信息不应出现)由终端上的一些键所产生的信号(如中断信号),不应对以前从该终端上启动的任何守护进程造成影响。要注意守护进程与后台运行程序(即加&启动的程序)的区别。
编写一个守护进程:
1.创建子进程 fork()
父进程退出,所有工作在子进程中进行形式上脱离了控制终端
2.子进程创建新会话 setsid()
使子进程完全独立出来,脱离控制
3.改变进程的工作目录 chdir()
防止占用可卸载的文件系统,也可以换成其他路径
4.指定文件掩码 umask()
防止继承的文件创建屏蔽字拒绝某些权限
5.将0/1/2重定向 /dev/null dup2()
关闭文件描述符,继承的打开文件不会用到,浪费系统资源,无法卸载
6.守护进程主逻辑
7.守护进程退出处理程序模型
代码示例: