C++ 后台进程 daemon
bool Switcher::Daemon() { base::YamlConfig config; if (!config_.ReadConfig(config_file_)) { fprintf(stderr, "read config file fail.\n"); return false; } bool is_daemon = config_.Get<bool>(kService, "is_daemon"); if (!is_daemon) { return true; } if (fork() != 0) { exit(0); } setsid(); if (fork() != 0) { exit(0); } close(0); close(1); close(2); open("/dev/null", O_RDWR); dup(0); dup(0); std::string stdout_log_path; if(config_.Get<std::string>(kService, kStdoutLogPath, &stdout_log_path)) { string filename = stdout_log_path + "." + DateString_(); int fd = open(filename.c_str(), O_WRONLY | O_APPEND | O_CREAT, 0644); if (fd != -1) { // 将STDOUT, STDERROR 重定向到文件 dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); close(fd); } } return true; }