1、守护进程是什么
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。守护进程也称精灵进程
守护进程是一个在后台运行并且不受任何终端控制的进程。它不能和用户交互
与其他后台进程不同,守护进程始终独立于其他会话,自成会话组,不受系统登录和注销的影响。
TPGID一栏是-1都是没有控制终端的进程,也就是守护进程。COMMAND一栏中用括起来的表示内核线程。没有空间代码,没有程序名和命令行。
2、守护进程如何创建
守护进程创建步骤
(1)调用umask将文件模式创建屏蔽字设置为0
(2)创建子进程,终止父进程
调用fork,父进程退出。(1)如果进程是由shell命令启动的,退出父进程,shell认为该进程已经结束。(2)保证子进程不是一个进程组组长
(3)在子进程中创建新会话
调用setsid函数创建一个新的会话。(1)调用进程会成为新会话的首进程。(2)调用进程会成为进程组组长。(3)调用进程没有控制终端。(再次fork一次,保证daemon进程,之后不会打开tty设备)
(4)改变工作目录 chdir("/")将工作目录改为根目录
(5)重设文件创建掩码
(6)关闭文件描述符 一般来说就是关闭默认的0,1,2三个文件描述符 防止受到上层目录删除的影响
(7)忽略SIGCHLD信号。
3、代码如何编写关键步骤是那些?
创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。
创建一个会话,当前进程成为会话首进程,会话ID就是当前进程ID。
创建一个新的进程组,当前进程就是组长进程,进程组ID就是当前进程ID。
如果当前进程有一个控制终端,则该进程失去控制终端,成为没有控制终端的进程。再次用命令ps ajx查看进程发现多了几个守护进程。
4、为什么创建守护进程时有人fork两次
第一次fork:这里第一次fork的作用就是让shell认为这条命令已经终止,不用挂在终端输入上;再一个是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长(会报错Operation not permitted),如果不fork子进程,那么此时的父进程是进程组组长,无法调用setsid。所以到这里子进程便成为了一个新会话组的组长。
第二次fork:第二次fork是为了避免后期进程误操作而再次打开终端。因为打开一个控制终端的前提条件是该进程必须为会话组组长,而我们通过第二次fork,确保了第二次fork出来的子进程不会是会话组组长。