一、守护进程定义

        是在操作系统的后台持续运行的进程,独立于终端不受用户登录的影响,主要用来执行周期性的任务

二、核心特点

1.后台运行:不与终端关联,用户无法直接使用键盘或鼠标交互

2.生命周期长:通常在系统启动时创建,系统关机为止

3.自启动:无需用户手动触发,依赖系统的初始化机制

4.低资源占用:多数任务仅需在执行任务时占用资源,空闲时资源消耗低

三、会话&进程组

会话:一个进程或多个进程的集合

每个会话都会有一个会话首进程(SID=PID,SID是会话id),会话还会有一个控制终端(tty/0  tty/1)

从会话的首进程开始,创建的所有进程默认继承会话ID

进程组:一个进程或多个进程的集合

在进程组中有一个组长进程(PGID=PID),组内所有进程的PGID相同,组长进程退出进程组不影响其他进程

查看会话ID  getsid() 

查看组ID      getpgrp()

四、守护进程创建的核心目标

                 脱离终端控制,独立运行

五、守护进程编程流程

fork()->

1.fork 创建子进程,父进程退出

目标:让子进程成为孤儿进程,被系统接管,脱离与原终端的关联

实现:fork之后,在父进程中调用exit   (强制退出)

2.为子进程创建新会话

目的:让进程脱离原会话和终端的控制,成为新会话的首进程

实现:使用setsid(),创建新会话,使当前进程成为会话首进程,脱离原进程组,成为新进程组的组长,失去控制终端

3.再次创建子进程,父进程退出

目的:避免进程再次获取控制终端(会话首进程会重新打开控制终端),要确保守护进程不是会话的首进程

实现:再次fork,然后父进程退出,此时该子进程成为最终的守护进程

4.改变工作目录

目的:防止守护进程的工作目录被挂在的文件系统占用(导致无法卸载该文件系统)

实现:切换守护进程的工作目录到/(根目录下)     chdir( "/" )

5.重置文件的权限掩码

目的:清除继承的文件权限掩码,确保守护进程创建文件时拥有预期的权限

实现:调用  umask ( 0 )

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

目的:释放资源,避免占用终端相关的文件描述符(标准输入,标准输出,标准错误输出)

实现:close (0)  close (1)  close (2)

getdtablesize( ) 获取当前进程可打开的最大文件描述符的数量(文件描述符表的大小)

每个进程都拥有自己独立的文件描述符表,所以可以通过获取文件描述符的数量来关闭所有的文件描述符

代码示例

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐