守护进程及守护进程输出

int daemon_init(const char* pname, int facility){umask(0);pid_t pid;if((pid = fork()) < 0)return -1;else if(pid > 0)_exit(0); // parent terminates// child 1 continues// become session leaderif(setsid() < 0)return -1;// ignore SIGHUP// signal(SIGHUP, SIG_IGN);struct sigaction sa;sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if(sigaction(SIGHUP, &sa, nullptr) < 0)_exit(0);if((pid = fork()) < 0)return -1;else if(pid > 0)_exit(0);// child 1 terminates// child 2 continueshelpguy::daemon_flag = 1;// changes working directorychdir("/");// close off file descriptorsrlimit rl;if(getrlimit(RLIMIT_NOFILE, &rl) < 0)return -1;int fdMax = rl.rlim_max == RLIM_INFINITY ? 1024 : rl.rlim_max;for(int i = 0; i < fdMax; ++i)close(i);// redirect stdin, stdout and stderr to /dev/nullopen("/dev/null", O_RDONLY);open("/dev/null", O_RDWR);open("/dev/null", O_RDWR);openlog(pname, LOG_PID, facility);return 0;}

,就微笑着同清风合力染绿大地,这样才算善待生命,不负年华。

守护进程及守护进程输出

相关文章:

你感兴趣的文章:

标签云: