Mercurial > hg > svcore
changeset 101:ce1d385f4f89
* Use kill(pid, 0) instead of /proc or sysctl blather for looking up pids
* Add OpenProcess call for Win32
author | Chris Cannam |
---|---|
date | Fri, 05 May 2006 12:34:51 +0000 |
parents | 2b1a16e38d2d |
children | 0a846f83a4b7 |
files | base/System.cpp |
diffstat | 1 files changed, 17 insertions(+), 68 deletions(-) [+] |
line wrap: on
line diff
--- a/base/System.cpp Fri May 05 11:35:47 2006 +0000 +++ b/base/System.cpp Fri May 05 12:34:51 2006 +0000 @@ -15,17 +15,8 @@ #include "System.h" -#ifdef __APPLE__ -#include <sys/types.h> -#include <sys/sysctl.h> -#else #ifndef _WIN32 -#include <unistd.h> -#include <cstdio> -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#endif +#include <signal.h> #endif #include <iostream> @@ -53,66 +44,24 @@ ProcessStatus GetProcessStatus(int pid) { -#ifdef __APPLE__ - - // See - // http://tuvix.apple.com/documentation/Darwin/Reference/ManPages/man3/sysctl.3.html - // http://developer.apple.com/qa/qa2001/qa1123.html - - int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0, 0 }; - name[3] = pid; - - int err; - size_t length = 0; - - if (sysctl(name, 4, 0, &length, 0, 0)) { - perror("GetProcessStatus: sysctl failed"); +#ifdef _WIN32 + DWORD handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if (!handle) { + return ProcessNotRunning; + } else { + CloseHandle(handle); + return ProcessRunning; + } +#else + if (kill(getpid(), 0) == 0) { + if (kill(pid, 0) == 0) { + return ProcessRunning; + } else { + return ProcessNotRunning; + } + } else { return UnknownProcessStatus; } - - if (length > 0) return ProcessRunning; - else return ProcessNotRunning; - -#elsif _WIN32 - - return UnknownProcessStatus; - -#else - - char filename[50]; - struct stat statbuf; - - // Looking up the pid in /proc is worth a try on any POSIX system, - // I guess -- it'll always compile and it won't return false - // negatives if we do this first check: - - sprintf(filename, "/proc/%d", (int)getpid()); - - int err = stat(filename, &statbuf); - - if (err || !S_ISDIR(statbuf.st_mode)) { - // If we can't even use it to tell whether we're running or - // not, then clearly /proc is no use on this system. - return UnknownProcessStatus; - } - - sprintf(filename, "/proc/%d", (int)pid); - - err = stat(filename, &statbuf); - - if (!err) { - if (S_ISDIR(statbuf.st_mode)) { - return ProcessRunning; - } else { - return UnknownProcessStatus; - } - } else if (errno == ENOENT) { - return ProcessNotRunning; - } else { - perror("stat failed"); - return UnknownProcessStatus; - } - #endif }