上一篇
在Linux系统中,C++守护进程(daemon)是一种在后台运行、不与任何终端关联的特殊程序。它们常用于实现服务器、日志记录器、监控工具等Linux后台服务。本教程将手把手教你如何用C++编写一个标准的守护进程,即使你是编程小白也能轻松上手!

守护进程(Daemon)是脱离终端并在后台持续运行的进程。它启动后不再受用户登录/登出影响,通常由系统初始化脚本或systemd启动。典型的守护进程包括Web服务器(如Apache)、数据库服务(如MySQL)等。
根据POSIX标准,创建一个规范的守护进程需完成以下操作:
fork() 创建子进程,父进程退出setsid() 创建新会话fork() 防止进程重新获取控制终端/)umask)下面是一个完整的、可直接编译运行的C++守护进程实现:
#include <iostream>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <signal.h>#include <cstring>// 守护进程主函数void daemonize() { pid_t pid, sid; // 第一步:fork() 创建子进程 pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } if (pid > 0) { // 父进程退出 exit(EXIT_SUCCESS); } // 第二步:创建新会话 sid = setsid(); if (sid < 0) { exit(EXIT_FAILURE); } // 第三步:再次 fork() 防止获得控制终端 pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } if (pid > 0) { exit(EXIT_SUCCESS); } // 第四步:更改工作目录到根目录 if ((chdir("/")) < 0) { exit(EXIT_FAILURE); } // 第五步:重设 umask umask(0); // 第六步:关闭标准文件描述符 close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); // 可选:重定向日志到文件 int log_fd = open("/var/log/my_daemon.log", O_CREAT | O_WRONLY | O_APPEND, 0644); if (log_fd != -1) { dup2(log_fd, STDOUT_FILENO); dup2(log_fd, STDERR_FILENO); close(log_fd); }}// 信号处理函数(用于优雅退出)volatile sig_atomic_t keep_running = 1;void signal_handler(int sig) { keep_running = 0;}int main() { // 注册信号处理器 signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); // 转换为守护进程 daemonize(); // 主循环:这里可以写你的业务逻辑 while (keep_running) { // 模拟工作:每10秒写入一次日志 std::cout << "[INFO] Daemon is running... PID: " << getpid() << std::endl; sleep(10); } std::cout << "[INFO] Daemon shutting down gracefully." << std::endl; return 0;}将上述代码保存为 daemon.cpp,然后使用g++编译:
g++ -o my_daemon daemon.cpp运行守护进程:
./my_daemon查看进程是否在后台运行:
ps aux | grep my_daemon停止守护进程(发送SIGTERM信号):
killall my_daemon掌握基础后,你可以进一步学习:
systemd 管理你的守护进程(现代Linux发行版推荐方式)/etc/my_daemon.conf)通过本教程,你已经掌握了C++ daemon实现的核心技术。无论是开发网络服务还是系统工具,这项系统编程教程中的技能都将为你打下坚实基础。动手试试吧,让自己的程序在后台默默守护系统!
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124101.html