Steps to create a daemon
- create child process
- parent process exits
- When the child process is the chairman setsid()
- Switch working directory $HOME
- set mask umask
- Close standard input, or redirect standard output and standard error. To avoid wasting resources
- Execute the core logic
- quit
example
#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;
}