守护进程(daemon)

什么是守护进程

一种在后台运行的特殊进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

守护进程通常在系统开始时运行,在系统关闭时才结束。

特征

  • 生存期长: 通常在系统启动时创建, 系统关闭时才结束。
  • 在后台运行: 没有控制终端, 不与用户直接交互。
  • 脱离控制终端: 不受终端登出、关闭等操作的影响。
  • 通常以超级用户(root) 权限运行。
  • 周期性执行任务或等待响应某些事件。

守护进程的创建步骤

  • 创建子进程(fork()),父进程退出 。 (让子进程成为孤儿进程,被 init 进程(PID为1的进程)收养。

    js 复制代码
    pid_t pid = fork();
    if(pid < 0) {
    	exit(EXIT_FAILURE);
    }else if(pid > 0){
    	exit(EXIT_SUCCESS);
    }
  • 在子进程中创建新会话。使用 setsid() 函数创建新会话,使子进程成为新会话的首进程。可以确保进程不再与原来的控制终端相关联。

    js 复制代码
    if(setsid() < 0){
    	exit(EXIT_FAILURE);
    }

    关于 setsid() 的用法:

    • 创建一个新的会话,并设置该进程的会话ID为新的会话ID。
    • 使调用进程成为新会话的会话领头进程,并且脱离任何之前的会话和进程组。
    • 创建一个新的进程组,其中调用进程是新进程组的领头进程。
    • 通常,新会话的标准输入、输出和错误输出会被重定向到/dev/null,但这不是setsid命令的内置行为,需要用户通过重定向操作来实现。

    原文链接:https://blog.csdn.net/bianchengxiaoma/article/details/140272326

  • 改变当前工作目录。通常将工作目录改为根目录,以避免占用可能被卸载的文件系统。

    js 复制代码
    if(chdir("/") < 0){
    	exit(EXIT_FAILURE);
    }
  • 重设文件权限掩码

    js 复制代码
    umask(0)
  • 关闭打开的文件描述符。 关闭所有从父进程即成的打开的文件描述符,包括标准输入、标准输出和标准错误。

    js 复制代码
    for ( int i = 0; i < MAXFD; i ++){
    	close(i);

守护进程的应用场景

  • 系统日志(syslogd): 记录系统事件和应用程序日志。
  • 网络服务(httpd, sshd): 提供 Web 服务、远程登录等功能。
  • 定时任务(crond): 定期执行预定的任务。
  • 打印服务(cupsd): 管理打印任务和打印机。
  • 数据库服务(mysqld):管理数据库的运行和数据存取。
  • 设备管理(udevd): 动态管理/dev 目录下的设备文件。
  • 名称解析(named): 提供 DNS 服务。
相关推荐
古法老登瞎折腾7 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.8 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu8 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈10 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
云上先途110 小时前
企业 AI 服务部署周期多久,会不会影响原有业务运转?
大数据·运维·人工智能
执伞人ONLY11 小时前
AI知识库自动化知识加工没做对,人工整理永远追不上知识产生
运维·人工智能·自动化
slongzhang_11 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮11 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节
无足鸟ICT12 小时前
【RHCA+】who命令(查看已登陆用户)
linux·运维·服务器
Escalating_xu12 小时前
【Linux 网络编程】应用层协议 HTTP(下):Header、连接管理与 C++ HTTP 服务器
linux·服务器·网络