守护进程(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 服务。
相关推荐
2603_954708311 小时前
微能网的核心硬件协调控制装置有哪些功能?
大数据·运维·人工智能·架构·能源
Lucas_coding1 小时前
SSH 常见用法(四):使用 SCP 和 SFTP 远程传输文件
运维·ssh
流浪0011 小时前
Linux系统篇44——线程(九) 互斥锁的接口与原理,从 xchgb 的原子交换说起
linux·操作系统·线程·互斥锁·互斥锁原理
Fcy6481 小时前
Linux下 网络层IP协议详解
linux·运维·tcp/ip
zhangx1234_2 小时前
javaEE 多线程1
java·linux·服务器
沙滩上的一颗石头2 小时前
裴讯N1刷Armbian后写入EMMC引导失败解决方法
linux
NPE~2 小时前
CMDB科普:配置管理数据库——运维相关
运维·数据库·科普·cmdb·配置管理数据库
陌上花开缓缓归以3 小时前
arm linux ddr 内存布局
linux·arm开发
龙腾-虎跃3 小时前
Linux 趣味实战|纯 Bash Shell 脚本实现俄罗斯方块终端小游戏(完整源码资源)
linux·运维·bash