检查进程是否存在给定的PID
考虑到Linux进程的PID,我想从C程序中检查进程是否仍在运行。
以0作为信号发出kill(2)系统调用。 如果调用成功,则意味着存在具有此pid的进程。 
 如果调用失败,并且errno被设置为ESRCH ,则具有这样的pid的进程不存在。 
引用POSIX标准:
如果sig为0(空信号),则执行错误检查,但实际上没有信号发送。 空信号可以用来检查pid的有效性。
请注意,您在竞争条件下并不安全:目标进程可能已经退出,同时启动了另一个具有相同PID的进程。 或者检查后,stream程可能会很快退出,您可以根据过时的信息做出决定。
 只有当给定的pid是一个subprocess( fork从当前进程fork )时,才可以使用waitpid(2)和WNOHANG选项,或者尝试捕获SIGCHLD信号。 这些在比赛条件下是安全的,但只与儿童进程有关。 
使用procfs。
 #include <sys/stat.h> [...] struct stat sts; if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) { // process doesn't exist } 
轻松移植到
- 的Solaris
- IRIX
- Tru64 UNIX
- BSD
- Linux的
- IBM AIX
- QNX
- 从贝尔实验室计划9
  kill(pid, 0)是典型的方法,正如@ blagovest-buyukliev所说。 但是,如果您正在检查的进程可能由不同的用户拥有,并且您不想采取额外的步骤来检查是否errno == ESRCH ,事实certificate 
 (getpgid(pid) >= 0) 
是确定任何进程是否具有给定PID的有效一步方法(因为即使对于不属于您的进程,您也可以检查进程组标识)。
 您可以用0作为信号发出kill(2)系统调用。 
  kill -0没什么不安全的。 程序必须意识到,结果可能随时被淘汰(包括在杀死之前可以重新使用pid),就这些了。 而使用procfs,而不是使用pid,并以更笨重和非标准的方式这样做。 
作为/ proc文件系统方法的补充,您可以检查/ proc / <pid> / cmdline(假设它是从命令行启动的),看看它是否是您想要的进程。
 ps -p $PID > /dev/null 2>&1; echo $? 
 如果$PID进程仍在运行,该命令返回0 。 否则它返回1 。 
在OSXterminal上也可以使用这个命令。