首先调用fork()使子进程后台运行并由init接管,确保非组长进程;2. 调用setsid()创建新会话脱离终端控制;3. 再次fork可防止重新获取终端;4. chdir("/")和umask(0)设置根目录与文件权限;5. 关闭stdin、stdout、stderr并重定向至/dev/null;6. 忽略SIGHUP等信号避免意外终止;7. 进入主循环持续运行。

在C++中创建守护进程,本质是通过系统调用让程序脱离终端控制,以后台方式长期运行。以下是标准的守护进程创建步骤和实现方法。
1. 调用fork()并让父进程退出
这是为了使子进程成为后台进程,并由init进程(PID=1)接管。
说明: 第一次fork确保子进程不是进程组组长,为后续调用setsid()做准备。代码示例:
pid_t pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS); // 父进程退出
}
2. 创建新会话(setsid)
调用setsid()让子进程脱离控制终端,成为新的会话领导者和进程组领导者。
说明: 这一步能确保进程不再受终端关闭影响。代码示例:
if (setsid() < 0) {
exit(EXIT_FAILURE);
}
3. 再次fork防止重新获取终端
第二次fork可确保守护进程不能重新打开控制终端。
立即学习“C++免费学习笔记(深入)”;
说明: 即使守护进程尝试打开终端设备,也会失败,增强稳定性。代码示例:
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
}
4. 设置工作目录和文件权限掩码
将当前工作目录改为根目录,避免因挂载点导致问题;设置umask为0便于控制文件权限。
操作建议:- chdir("/") 切换到根目录
- umask(0) 重置文件创建掩码
5. 关闭不需要的文件描述符
守护进程不依赖标准输入、输出和错误,需关闭这些描述符。
常见做法:close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO);提示: 可重定向到/dev/null以避免资源浪费。
6. 处理信号(可选但推荐)
忽略SIGHUP等信号,防止被意外终止。
示例:signal(SIGHUP, SIG_IGN);
完整流程总结
一个典型的守护化进程创建顺序如下:
- fork → 父进程退出
- setsid()
- fork → 子进程继续,防止终端关联
- chdir("/") 和 umask(0)
- 关闭stdin、stdout、stderr
- 处理信号
- 进入主循环
基本上就这些。C++中无需特殊语法,关键是正确使用POSIX系统调用。只要按上述步骤操作,就能稳定创建守护进程。注意在Linux环境下测试,并结合日志记录调试问题。











