守护进程

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出来的子进程不会是会话组组长。



    

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值