考虑到Linux进程的pid,我想从C程序中检查进程是否仍在运行。
答案 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
}
轻松移植到
答案 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终端中使用此命令。