#include "Process.h" bool CProcess::IS_DAEMON = false; CProcess::CProcess() : m_pid(-1), m_launched(false) { } CProcess::~CProcess() { } bool CProcess::Daemon() { if (IS_DAEMON == false && daemon(1, 0) == -1) { cerr << "Error detaching"; return false; } IS_DAEMON = true; return true; } bool CProcess::IsProcessRun(const char* pname) { char tempBuffer[512]; FILE * fd = NULL; bool bRun = false; snprintf(tempBuffer, sizeof(tempBuffer), "pgrep -x %s | sort", pname); fd = popen(tempBuffer, "r"); if (fd == NULL) { cerr << "[ERR] Process check failed. [popen error][" << strerror(errno) << "]" << endl; // ¿À·ù ¹ß»ý½Ã true ¹ÝȯÇÏ¿© ÇÁ·Î¼¼½º ½ÇÇà ¹æÁöó¸® return true; } else { void(*intsave)(int) = signal(SIGINT, SIG_IGN); void(*quitsave)(int) = signal(SIGTERM, SIG_IGN); void(*chldave)(int) = signal(SIGCHLD, SIG_IGN); memset(tempBuffer, 0x00, sizeof(tempBuffer)); while (fgets(tempBuffer, sizeof(tempBuffer) - 1, fd) != NULL) { string tempPid(tempBuffer); //Trim(tempPid); pid_t pid = atoi(tempPid.c_str()); if (pid > 0) { bRun = true; break; } } signal(SIGINT, intsave); signal(SIGTERM, quitsave); signal(SIGCHLD, chldave); pclose(fd); return bRun; } } bool CProcess::IsCurrentProcessRun(const char* pname) { char tempBuffer[512]; FILE * fd = NULL; bool bRun = false; snprintf(tempBuffer, sizeof(tempBuffer), "pgrep -x %s | sort", pname); fd = popen(tempBuffer, "r"); if (fd == NULL) { cerr << "[ERR] Process duplication check failed. [popen error][" << strerror(errno) << "]"<< endl; // ¿À·ù ¹ß»ý½Ã true ¹ÝȯÇÏ¿© ÇÁ·Î¼¼½º ½ÇÇà ¹æÁöó¸® return true; } else { memset(tempBuffer, 0x00, sizeof(tempBuffer)); while (fgets(tempBuffer, sizeof(tempBuffer) - 1, fd) != NULL) { string tempPid(tempBuffer); //Trim(tempPid); pid_t pid = atoi(tempPid.c_str()); if (pid != getpid()) { cerr << "[info] Process duplication found. pid[" << pid << "]" << endl; bRun = true; break; } } pclose(fd); return bRun; } } pid_t CProcess::Fork() { m_pid = ::fork(); if (m_pid >= 0) m_launched = true; return m_pid; } void CProcess::SetThreadSignal(int signum) { sigset_t sig, old; sigemptyset(&sig); sigaddset(&sig, signum); sigprocmask(SIG_BLOCK, &sig, &old); } void CProcess::UnSetThreadSignal(int signum) { sigset_t sig, old; sigemptyset(&sig); sigaddset(&sig, signum); sigprocmask(SIG_UNBLOCK, &sig, &old); }