守护进程

守护进程

       守护进程也叫“精灵进程”,是运行在后台的一种特殊程进程。它独立与控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。Linux大多数服务器都是用守护进程实现的。

 

守护进程的特点

       Linux系统启动时会启动很多服务进程,这些服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,然后在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直运行着。

 

创建守护进程

 

   pid_t  setsid(void);

       该函数调用成功时返回新创建的会话id,出错返回1。调用这个函数之前,当前进程不允许时进程组的Leader,方法是先fork然后再调用setsid。调用完之后,创建了一个新的会话,当前进程成为会话Leader;创建了一个新的进程组,当前进程成为该进程组的Leader。

       具体过程:1.调用mask将文件模式创建屏蔽字设置为0;2.调用fork,父进程退出(①如果该守护进程作为一条简单的shell命令启动,那么父进程终止使得shell认为该命令已经结束;②保证子进程不是一个进程组的组长进程);3.调用setsid创建一个新会话,setsid会导致:①调用进程成为一个会话的组长进程;②调用进程成为一个进程组的组长进程;③调用进程没有控制终端(再fork一次,保证daemon进程不会打开tty设备);4.当前目录改为根目录;5.关闭不需要的文件描述符;6.忽略SIGCHLD信号(自动会忽略)。

 

 

关于fork的问题

    在上面创建守护进程的代码中fork了两次,为什么?

      (1)第一次fork的作用:
       第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
 
      (2)第二次fork的作用:
       虽然当前关闭了和终端的联系,但之后可能会因为误操作而打开终端。因为只有会话首进程能打开终端设备,因此再fork一次,把父进程退出,这样再次fork的子进程就作为守护进程继续运行,保证该守护进程不是会话的首进程,从而保证守护进程不会打开tty设备。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值