守护进程创建步骤:
- fork子进程,让父进程终止。
- 子进程调用 setsid() 创建新会话。
- 根据需要,改变工作目录位置 chdir()
- 根据需要,重设 umask 文件权限掩码
- 根据需要,关闭/重定向 文件描述符
- 守护进程业务逻辑
实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<pthread.h>
#include<sys/stat.h>
#include<fcntl.h>
void sys_err(const char *str){
perror(str);
exit(1);
}
int main(int argc, char *argv[]){
pid_t pid;
int ret, fd;
pid = fork();
if(pid > 0){
exit(0);
}
pid = setsid(); //创建新会话
if(pid == -1){
sys_err("setsid error");
}
ret = chdir("/home/tong01/Desktop/ubuntu20/student"); //改变工作目录位置
if(ret == -1){
sys_err("chdir error");
}
umask(0022); //改变文件访问权限掩码
close(STDIN_FILENO); //关闭文件描述符
fd = open("/dev/null", O_RDWR); //fd --> 0
if(fd == -1){
sys_err("open error");
}
dup2(fd, STDOUT_FILENO); //重定向 stdout和stderr
dup2(fd, STDERR_FILENO);
while(1); //模拟 守护进程业务
return 0;
}
运行
需要用kill命令停止