给出其pid,检查进程是否存在

时间:2012-02-05 21:00:23

标签: c linux pid

考虑到Linux进程的pid,我想从C程序中检查进程是否仍在运行。

6 个答案:

答案 0 :(得分:69)

发出kill(2)系统调用0作为信号。如果调用成功,则表示存在具有此pid的进程。

如果调用失败并且errno设置为ESRCH,则不存在具有此类pid的进程。

引用POSIX标准:

  

如果sig为0(空信号),则执行错误检查但不执行   信号实际上是发送的。空信号可用于检查   pid的有效性。

请注意,您在竞争条件下并不安全:目标进程可能已退出,同时已启动具有相同pid的另一个进程。或者,在您检查过程后,流程可能会很快退出,您可以根据过时的信息做出决定。

仅当给定的pid是子进程(fork'来自当前进程)时,您可以waitpid(2)使用WNOHANG选项,或尝试捕获{{ 1}}信号。这些都不受竞争条件的影响,但只与子进程有关。

答案 1 :(得分:15)

使用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

答案 2 :(得分:10)

kill(pid, 0)是典型的方法,正如@ blagovest-buyukliev所说。但是,如果您正在检查的流程可能由其他用户拥有,并且您不想采取额外步骤来检查是否errno == ESRCH,则结果是

(getpgid(pid) >= 0)

是一种有效的一步法,用于确定任何进程是否具有给定的PID(因为即使对于不属于您的进程,您也可以检查进程组ID)。

答案 3 :(得分:3)

您可以发出kill(2)系统调用0作为信号。

kill -0没什么不安全的。该程序 必须意识到结果可能随时变得过时 (包括在调用kill之前可以重用pid), 就这样。使用procfs代替 也使用pid, 并且以更加繁琐和非标准的方式这样做。

答案 4 :(得分:0)

作为/ proc文件系统方法的补充,您可以检查/ proc /&lt; pid&gt; / cmdline(假设它是从命令行启动的),看看它是否是您想要的进程。

答案 5 :(得分:-2)

0

如果$PID的进程仍在运行,则此命令将返回1。否则返回SELECT T.id, T.name, T.surname, T.email, sub.count FROM T LEFT JOIN (SELECT email, COUNT(*) AS count FROM T GROUP BY email) sub ON T.email = sub.email

也可以在OSX终端中使用此命令。