方法一:
bool daemonize() { pid_t pid = fork(); if ( pid < 0 ) { return false; } else if ( pid > 0 ) { exit( 0 ); } umask( 0 ); pid_t sid = setsid(); if ( sid < 0 ) { return false; } if ( ( chdir( "/" ) ) < 0 ) { /* Log the failure */ return false; } close( STDIN_FILENO ); close( STDOUT_FILENO ); close( STDERR_FILENO ); open( "/dev/null", O_RDONLY ); open( "/dev/null", O_RDWR ); open( "/dev/null", O_RDWR ); return true; }
方法二:
void daemon_run() { int pid; signal(SIGCHLD, SIG_IGN); //1)在父进程中,fork返回新创建子进程的进程ID; //2)在子进程中,fork返回0; //3)如果出现错误,fork返回一个负值; pid = fork(); if (pid < 0) { std::cout << "fork error" << std::endl; exit(-1); } //父进程退出,子进程独立运行 else if (pid > 0) { exit(0); } //之前parent和child运行在同一个session里,parent是会话(session)的领头进程, //parent进程作为会话的领头进程,如果exit结束执行的话,那么子进程会成为孤儿进程,并被init收养。 //执行setsid()之后,child将重新获得一个新的会话(session)id。 //这时parent退出之后,将不会影响到child了。 setsid(); int fd; fd = open("/dev/null", O_RDWR, 0); if (fd != -1) { dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); } if (fd > 2) close(fd); }