c++守护进程demo
时间: 2023-10-02 13:13:27 浏览: 63
以下是一个简单的C++守护进程示例代码:
```c++
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
using namespace std;
void daemonize() {
pid_t pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
} else if (pid > 0) {
exit(EXIT_SUCCESS);
}
if (setsid() < 0) {
exit(EXIT_FAILURE);
}
signal(SIGCHLD, SIG_IGN);
signal(SIGHUP, SIG_IGN);
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
} else if (pid > 0) {
exit(EXIT_SUCCESS);
}
umask(0);
chdir("/");
for (int i = sysconf(_SC_OPEN_MAX); i >= 0; i--) {
close(i);
}
open("/dev/null", O_RDWR);
dup(0);
dup(0);
}
int main() {
daemonize();
// 守护进程的主要工作
return 0;
}
```
在main函数中,我们调用了daemonize()函数来实现守护进程的创建。daemonize()函数执行的操作如下:
1. 创建一个子进程,并在子进程中执行守护进程的主要工作;
2. 在子进程中调用setsid()函数,创建一个新的会话,并成为该会话的组长进程,使得守护进程脱离控制终端和登录会话;
3. 忽略SIGCHLD和SIGHUP信号,防止守护进程在子进程结束或者终端挂起时被终止;
4. 创建另一个子进程,并在其中执行工作;
5. 重设文件权限掩码为0,使得守护进程可以访问任何文件;
6. 将当前工作目录切换到根目录,以避免当前目录占用设备或者被删除的情况;
7. 关闭所有打开的文件描述符,以避免守护进程占用文件资源;
8. 将文件描述符0、1、2分别重定向到/dev/null,以避免守护进程产生输出。
守护进程的主要工作可以在daemonize()函数之后进行。