创建守护进程的步骤
- 创建子进程
- 父进程退出
- 子进程当会长setsid()
- 切换工作目录 $HOME
- 设置掩码umask
- 关闭标准输入,或者重定向标准输出和标准错误。为了避免浪费资源
- 执行核心逻辑
- 退出
示例
#include <bits/types/FILE.h>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
pid_t pid = fork();
if (pid > 0) {
exit(0);
}
//成立一个新会话,丢弃原有控制终端
pid = setsid();
if (pid < 0) {
perror("setsid is error:");
exit(0);
}
//切换工作目录的意义是保证守护进程能稳定可靠的运行
//只要工作目录是不可卸载的目录就可以
chdir("/home/sivin");
//设置掩码
umask(0022);
//由于守护进程没有控制终端,不会与用户进行交互,因此可以关闭标准输入
close(STDIN_FILENO);
int emptyFd = open("/dev/null", O_RDWR);
dup2(emptyFd, STDOUT_FILENO);
dup2(emptyFd, STDERR_FILENO);
while(1) {
//执行守护进程的逻辑
}
return 0;
}