守护 进程
一、守护进程定义
是在操作系统的后台持续运行的进程,独立于终端不受用户登录的影响,主要用来执行周期性的任务
二、核心特点
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( ) 获取当前进程可打开的最大文件描述符的数量(文件描述符表的大小)
每个进程都拥有自己独立的文件描述符表,所以可以通过获取文件描述符的数量来关闭所有的文件描述符
代码示例

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

所有评论(0)