当前位置: 首页 > news >正文

**守护进程(Daemon)** 是一种在后台运行的特殊进程

在 Unix/Linux 系统中,守护进程(Daemon) 是一种在后台运行的特殊进程,它独立于控制终端,通常用户登录/注销的影响,通常用于提供持续的系统服务(如 Web 服务器、数据库服务等)。

守护进程的核心特点

  1. 后台运行:脱离终端控制,在后台持续执行。
  2. 独立于终端:不与任何终端关联,即使启动它的终端关闭,进程仍继续运行。
  3. 生命周期长:通常在系统启动时开始运行,直到系统关闭才终止。
  4. 无用户交互:运行过程中不需要用户输入,通过配置文件或信号进行管理。
  5. 父进程为 init 或 systemd:启动后会与父进程脱离,由系统初始化进程(如 initsystemd)接管。

守护进程的典型应用

  • 网络服务:如 nginx(Web 服务器)、sshd(SSH 服务)。
  • 系统服务:如 crond(定时任务服务)、syslogd(日志服务)。
  • 后台处理:如数据库服务(mysqld)、文件索引服务等。

如何创建守护进程(编程角度)

创建守护进程需要遵循特定的步骤(称为"守护化"),核心是脱离终端并建立新的进程环境:

  1. 创建子进程,父进程退出
    父进程退出后,子进程成为孤儿进程,由 init 进程接管,脱离终端控制。

  2. 子进程创建新会话(setsid())
    调用 setsid() 使子进程成为新会话的首领,彻底脱离原终端。

  3. 改变当前工作目录(chdir())
    通常切换到根目录(/),避免占用可卸载的文件系统。

  4. 重设文件权限掩码(umask())
    清除权限掩码,确保创建文件时拥有预期的权限。

  5. 关闭不需要的文件描述符
    关闭标准输入(stdin)、标准输出(stdout)、标准错误(stderr),避免与终端产生关联。

简单示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>void create_daemon() {pid_t pid = fork();if (pid < 0) {perror("fork failed");exit(1);}if (pid > 0) {  // 父进程退出exit(0);}// 子进程创建新会话if (setsid() < 0) {perror("setsid failed");exit(1);}// 再次 fork 避免子进程成为会话首领(可选,增强安全性)pid = fork();if (pid < 0) {perror("fork failed");exit(1);}if (pid > 0) {exit(0);}// 改变工作目录到根目录chdir("/");// 重设文件权限掩码umask(0);// 关闭所有打开的文件描述符for (int fd = sysconf(_SC_OPEN_MAX); fd >= 0; fd--) {close(fd);}// 重定向标准输入/输出/错误到/dev/nullopen("/dev/null", O_RDWR);  // stdin (0)dup(0);                     // stdout (1)dup(0);                     // stderr (2)
}int main() {create_daemon();// 守护进程核心逻辑(此处示例为无限循环)while (1) {sleep(1);  // 模拟持续运行的服务}return 0;
}

如何管理守护进程

  • 查看:通过 ps -ef | grep 进程名 查看(通常名称以 d 结尾,如 sshdhttpd)。
  • 启动:系统服务通常通过 systemctl start 服务名 启动。
  • 停止:通过 systemctl stop 服务名 或发送信号(如 kill -TERM 进程ID)。
  • 日志:守护进程的输出通常写入日志文件(如 /var/log/ 目录下),而非终端。

守护进程是 Linux 系统中提供长期服务的基础,其设计确保了服务的稳定性和独立性。

http://www.lryc.cn/news/623791.html

相关文章:

  • 为什么神经网络在长时间训练过程中会存在稠密特征图退化的问题
  • Linux中聚合链路与软件网桥配置指南
  • 深入了解linux系统—— 线程控制
  • AI 编程在老项目中的困境与改进方向
  • 【Linux | 网络】高级IO
  • 63.不同路径
  • 分治-归并-315.计算右侧小于当前元素的个数-力扣(LeetCode)
  • C++ vector的使用
  • C语言(12)——进阶函数
  • 北京JAVA基础面试30天打卡12
  • 语音转文字,如何提升内容创作效率?
  • 智能汽车领域研发,复用云原始开发范式?
  • WebSocket--精准推送方案(二):实时消息推送-若依项目示例
  • 在职老D渗透日记day19:sqli-labs靶场通关(第26a关)get布尔盲注 过滤or和and基础上又过滤了空格和注释符 ‘)闭合
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十一节:网关安全-对称与非对称加密
  • 告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验
  • 【165页PPT】锂电池行业SAP解决方案(附下载方式)
  • 自动驾驶中的传感器技术34——Lidar(9)
  • 定时器中断点灯
  • 记一次安装OpenStack(Stein)-nova报错问题解决
  • 42 C++ STL模板库11-容器4-forward_list
  • 利用标准IO实现寻找文件中字符出现最多次数
  • Opencv 形态学与梯度运算
  • python的软件工程与项目管理课程组学习系统
  • 【LeetCode题解】LeetCode 33. 搜索旋转排序数组
  • Android studio gradle有关设置
  • 一周学会Matplotlib3 Python 数据可视化-多子图及布局实现
  • java之 junit4单元测试Mockito的使用
  • 魔改chromium源码——解除 iframe 的同源策略
  • 《Nursing Research》(护理SCI)LaTeX模板详细教程:从入门到投稿(一)