检查进程是否存在给定的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上也可以使用这个命令。