守护进程:
daemon通常运行于操作系统后台,脱离控制终端。一般不与用户进行直接交互,周期的执行某件事或者周期的等待某个信号发生。并且不受登录用户注销影响。
创建守护进程步骤:
1. fork()创建子进程,并让父进程终止;
2. 子进程使用setsid()函数创建新会话;
3. 子进程使用chdir()函数改变守护工作目录位置;
4. 根据需求,子进程使用umask()修改文件权限掩码,影响新文件的创建权限;
5. 根据需求,子进程关闭或者重定向文件描述符;
6. 实现守护进程完成的业务逻辑。
~~ 代码 ~~
/**
*@brief : daemon
*@date : 2022-03-20
**/
#include <iostream>
#include <errno.h>
#include <string>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
using std::cout;
using std::endl;
//error print func
void sysError(const std::string str) {
cout << str << endl;
exit(1);
}
int main(int argc, char* argv[]) {
pid_t pid;
int ret, fd;
ret = fork();
if (ret < 0) {
sysError("fork error");
} else if (ret > 0) {
exit(0);
} else {
pid = setsid();
if (pid == -1) {
sysError("setsid error");
}
ret = chdir("/home/user");
if (ret == -1) {
sysError("chdir error");
}
umask(0022);
fd = open("dev/null", O_RDWR);
close(STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
while(1) {
// do something
}
}
return 0;
}