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