1 bool 2 ServerProcess::isAlreadyRunning() 3 { 4 #ifndef __linux__ 5 WarningLog(<<"can't check if process already running on this platform (not implemented yet)"); 6 return false; 7 #else 8 if(mPidFile.size() == 0) 9 { 10 // if no PID file specified, we do not make any check 11 return false; 12 } 13 14 pid_t running_pid; 15 std::ifstream _pid(mPidFile.c_str(), std::ios_base::in); 16 if(!_pid.good()) 17 { 18 // if the file doesn't exist or can't be opened, just ignore 19 return false; 20 } 21 _pid >> running_pid; 22 _pid.close(); 23 24 StackLog(<< mPidFile << " contains PID " << running_pid); 25 26 Data ourProc = Data("/proc/self/exe"); 27 Data otherProc = Data("/proc/") + Data(running_pid) + Data("/exe"); 28 char our_exe[513], other_exe[513]; 29 int buf_size; 30 31 buf_size = readlink(ourProc.c_str(), our_exe, 512); 32 if(buf_size < 0 || buf_size == 512) 33 { 34 // if readlink fails, just ignore 35 return false; 36 } 37 our_exe[buf_size] = 0; 38 39 buf_size = readlink(otherProc.c_str(), other_exe, 512); 40 if(buf_size < 0 || buf_size == 512) 41 { 42 // if readlink fails, just ignore 43 return false; 44 } 45 other_exe[buf_size] = 0; 46 47 if(strcmp(our_exe, other_exe) == 0) 48 { 49 ErrLog(<<"already running PID: " << running_pid); 50 return true; 51 } 52 return false; 53 #endif 54 }