Пример #1
0
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, &param) == -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");
}
Пример #2
0
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_);
}