Server::Server() : m_lockFileName(Config::Instance()->lockFileName), m_pidFileName(Config::Instance()->pidFileName) { pid_t pid, sid, parent; int lfp = -1; struct stat sb; /* already a daemon */ if(getppid() == 1) return; if(m_lockFileName.size()) { if (stat(m_lockFileName.c_str(), &sb) != -1) { syslog(LOG_INFO, "another process running?"); if( getProcIdByName(__progname) > 0) { syslog(LOG_ERR, "exit"); exit(EXIT_FAILURE); } else { ::remove(m_lockFileName.c_str()); } } lfp = open(m_lockFileName.c_str(),O_RDWR|O_CREAT,0640); if(lfp < 0) { syslog(LOG_ERR, "unable to create lock file %s, code=%d (%s). exit", m_lockFileName.c_str(), errno, strerror(errno)); exit(EXIT_FAILURE); } } if(getuid() == 0 || geteuid() == 0) { struct passwd *pw = getpwnam(Config::Instance()->asUser.c_str()); if(pw) { syslog(LOG_NOTICE, "setting user to %s",Config::Instance()->asUser.c_str()); if(setuid(pw->pw_uid)) syslog(LOG_ERR,"error set uid"); } } signal(SIGCHLD,child_handler); signal(SIGUSR1,child_handler); signal(SIGALRM,child_handler); pid = fork(); if(pid < 0) { syslog(LOG_ERR, "unable to fork daemon, code=%d (%s). exit", errno, strerror(errno)); exit(EXIT_FAILURE); } if(pid > 0) { alarm(2); pause(); exit(EXIT_FAILURE); } parent = getppid(); signal(SIGCHLD,SIG_DFL); signal(SIGTSTP,SIG_IGN); signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGTERM,SIG_DFL); signal(SIGPIPE,SIG_IGN); signal(SIGRTMIN,SIG_DFL); umask(007); sid = setsid(); if(sid < 0) { syslog(LOG_ERR, "unable to create a new session, code %d (%s)", errno, strerror(errno)); // exit(EXIT_FAILURE); } if((chdir("/")) < 0) { syslog(LOG_ERR, "unable to change directory to %s, code %d (%s). exit", "/", errno, strerror(errno)); // exit(EXIT_FAILURE); } if(!freopen("/dev/null", "r", stdin)) syslog(LOG_ERR, "unable to change stdin"); if(Config::Instance()->debug) { if(freopen(Config::Instance()->debug_file.c_str(), "w", stdout)) syslog(LOG_ERR, "unable to change stdout to:%s",Config::Instance()->debug_file.c_str()); if(!freopen(Config::Instance()->debug_file.c_str(), "w", stderr)) syslog(LOG_ERR, "unable to change stdin %s",Config::Instance()->debug_file.c_str()); printf("start\n"); } else { if(freopen("/dev/null", "w", stdout)) syslog(LOG_ERR, "unable to change stdout"); if(!freopen("/dev/null", "w", stderr)) syslog(LOG_ERR, "unable to change stderr"); kill(parent, SIGUSR1); } struct sched_param param; param.sched_priority = 49; if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { syslog(LOG_ERR,"sched_setscheduler failed"); //exit(-1); } if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) { syslog(LOG_ERR,"mlockall failed"); //exit(-2); } writePid(m_pidFileName); syslog(LOG_NOTICE, "staring: done"); }
Process::Process(std::string proc_name) { proc_id_ = getProcIdByName(proc_name); proc_name_= proc_name; ROS_INFO("%s process id is %i.\n", proc_name.c_str(), proc_id_); }