我们今天来谈谈守护进程那些事~~~
一、什么是守护进程
守护进程也称为精灵进程,它是在后台运行的一种特殊进程,它独立于控制终端,自成进程组,自成会话,它在后台周期性地执行某种任务或者等待某种事件的发生。
在Linux中,操作系统与用户的交流是通过终端来联系的,从此开始运行的进程都与这个终端关联起来,一旦这个终端关闭了,运行的进程也就随之关闭了,但是守护进程就突破了这种限制,它独立于终端也就意味着跟终端没有联系,它运行的信息不会在终端显示,终端的消息也不会对它产生影响。
二、如何创建一个守护进程
1. 调用umask将文件模式创建屏蔽字设置为0;
2. 调用fork创建子进程,让父进程退出。原因:保证子进程不是一个进程组的组长;
3. 调用setsid创建一个会话。这样会产生三个结果:a:调用进程成为新会话的首进程;b:调用进程成为一个进程组的组长进程;c:调用进程没有控制终端。
4. 将当前工作目录更改为根目录;
5. 关闭不再需要的文件描述符;
6. 忽略SIGCHLD信号。
为什么可以fork一次也可以fork两次?
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
系统也提供了创建守护进程的方法,daemon()第一个参数表示是否需要变更根目录,第二个参数表示是否需要关闭文件描述符。
三、查看守护进程
使用ps axj可以查看系统中的守护进程,可以发现TTY这一列是?,表示没有终端。
在创建守护进程时,让父进程退出了,所以守护进程也是孤儿进程被1号进程领养。