linux9.守护进程

01 概述

  • 守护进程就是运行在后台的一种特殊进程,常见的守护进程包括系统日志进程syslogd、Web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程的名称通常以d结尾,如上,或:sshd、xinetd、crond等。
  • 守护进程一般在系统启动时开始运行,除非强制终止,否则直到系统关机都保持运行;而且守护进程经常以root权限运行,因为它们要使用特殊的端口(1~1024)或访问某些特殊的资源。
  • 守护进程的父进程是init进程,因为它真正的父进程在创建出子进程后就先于子进程退出了,所以它是一个由init继承的孤儿进程。

02 守护进程的创建

  • 基本概念:
    (1)进程组:一个或多个进程的集合,每个进程都有一个进程组ID,这个ID就是进程组长的进程ID;
    (2)会话期:一个或多个进程组的集合,每个会话有唯一一个会话首进程,会话ID为会话首进程ID;
    (3)控制终端:每一个会话可以有一个单独的控制终端,与控制终端连接的会话首进程就是控制进程。这时候,与当前终端交互的就是前台进程组,其它都是后台进程组。
    (4)setsid函数:用于创建一个新的会话期;
#include<unistd.h>
pid_setsid(void);

调用setsid函数后:
(1)摆脱原会话的控制,该进程变成新会话期的首进程;
(2)摆脱原进程组,称为一个新进程组的组长;
(3)摆脱终端控制:如果在调用setsid函数前,该进程有终端控制,那么与该终端的联系被解除。如果该进程是一个进程组的组长,此函数返回错误。
所以,只有当前进程不是一个进程组长时,才会成功创建一个新的会话期。

  • 创建守护进程的一般步骤
    (1)通过fork函数创建子进程,父进程通过exit函数退出;
    因为守护进程是脱离控制终端的,所以完成上述步骤后,就会在shell终端里造成程序已经运行完毕的假象。之后的所有工作都在子进程中完成,而用户在shell终端里则可以执行其它命令,从而在形式上做到了与控制终端的脱离,在后台工作。
    (2)在子进程中调用setsid函数,创建新的会话;
    上一步,在调用了fork函数后,子进程全盘复制了父进程的会话期、进程组和控制终端等,虽然父进程退出了,但会话期、进程组和控制终端等并没有改变,因此,这还不是真正意义上的独立,而setsid函数能够使进程完全独立出来。
    (3)再次通过fork函数创建一个子进程并让父进程退出;
    (4)在子进程中调用chdir函数,让根目录“/”成为子进程的工作目录;
    (5)在子进程中调用umask函数,设置进程的文件权限掩码为0;
    (6)在子进程中关闭任何不需要的文件描述符;
    (7)守护进程退出处理:使用kill命令。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值