给定 Linux 进程的 pid,我想要在 C 程序中检查该进程是否仍在运行。
以信号0
调用kill(2)
系统调用。如果调用成功,则意味着存在此pid的进程。
如果调用失败并且errno
设置为ESRCH
,则不存在具有该pid的进程。
引用POSIX标准:
如果sig为0(空信号),则执行错误检查但实际上不发送任何信号。空信号可用于检查pid的有效性。
请注意,您不能安全地避免竞争条件: 目标进程可能已经退出,并且与此同时启动了具有相同pid的另一个进程。或者进程可能在您检查它之后非常快地退出,您可能会根据过时的信息做出决定。
只有给定pid是子进程(从当前进程中fork
出来的进程)的情况下,您可以使用带有WNOHANG
选项的waitpid(2)
,或者尝试捕获SIGCHLD
信号。 这些对于子进程是安全的,但只与子进程相关。
kill
方法才是安全的。在这种情况下,进程 ID 属于您自己,直到您 wait
为止,它才能被重用。否则,任何使用 pid 都是严重的错误。 - R.. GitHub STOP HELPING ICEkill()
函数的手册页后,我得到了返回值-1,而不是预期的ESRCH。我做错了什么吗?perror()
显示“没有这个进程”。 - Marvin Effingkill(pid, 0)
是典型的方法,如@blagovest-buyukliev所说。但是如果您要检查的进程可能属于不同的用户,而且您不想采取额外的步骤来检查 errno == ESRCH
,那么结果表明:
(getpgid(pid) >= 0)
如果你想确定是否有任何进程具有给定的PID(即使你可以检查不属于你的进程的进程组ID),那么这是一种有效的一步方法。
kill(pid, 0)
也会返回true。 - the paul<unistd.h>
。 - ph_0#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
// process doesn't exist
}
轻松适用于
0
来调用kill(2)
系统调用。
kill -0
对程序没有任何不安全的影响。程序必须意识到结果随时可能会过时(包括在调用kill之前pid可能会被重新使用),这就是全部内容。而且,使用procfs也确实使用了pid,而且以一种更加繁琐和非标准的方式进行。ps -p $PID > /dev/null 2>&1; echo $?
如果进程使用$PID
仍在运行,则此命令返回0
。否则,它将返回1
。
在OSX终端中也可以使用此命令。
kill
方法相同的竞态条件的困扰。 - melpomene