创建守护进程

186 阅读1分钟

守护进程:

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;

}