【Linux系统编程】守护进程

    守护进程又称精灵进程,常常在系统启动时自启,仅在系统关闭时才终止,生存期比较长!一般都是在后台运行,不需要和用户交互。

    可通过ps -axj命令查看常用系统守护进程,其中最为常见的init进程,负责各运行层次间的系统服务。

    在说守护进程编程流程之前先来了解几个概念:

    会话:一个或多个进程组的集合。用户从登录到退出期间的所有进程都属于一个会话期。会话id = 会话首进程的pid

    进程组:一个或多个进程的集合。进程组的id=父进程的id,即父进程就是进程组长。

    创建守护进程的必要性:打开终端,运行的第一个程序为bash。若关闭终端,整个会话就会结束。为了防止会话意外结束或其他,可以创建一个新的会话。

    创建新会话的条件:只能是普通的组员进程才可创建新会话。不能是会话首进程或进程组长。

    守护进程编程流程:

    1.调用fork()创建子进程,然后退出父进程

    上边已经提到,创建新会话必须是普通的组员进程,而父进程一般是进程组长,因此要先执行fork()并退出父进程。

    2.调用setsid()在子进程中创建一个新会话

    使进程独立出来,脱离控制。

    3.执行fork()退出父进程,使其失去进程组长身份

    fork的目的是确保守护进程来即使打开一个终端设备,也不会自动控制终端。

    4.将当前目录更改为根目录,chdir("/")

    进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让”/”作为守护进程的当前工作目录,这样就可以避免上述的问题。

    5.调用umask()函数,设置进程的文件权限掩码为0

    文件权限掩码是指屏蔽掉文件权限中的对应位。比如,有个文件权限掩码是050,它就屏蔽了文件组拥有者的可读与可执行权限。由于使用fork函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。通常的使用方法为umask(0)。

    6.关闭不再需要的文件描述符

    同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。 
    在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。

    7.守护进程退出处理 
    当用户需要外部停止守护进程运行时,往往会使用 kill 命令停止该守护进程。所以,守护进程中需要编码来实现 kill 发出的signal信号处理,达到进程的正常退出。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值