如何在C语言中查找进程是否正在运行?

9

我想了解一个进程是否正在运行。我不想使用任何system("")命令。有没有基于C的函数可以让你知道一个进程是否正在运行?

我想提供进程名称并想知道它是否正在运行。

谢谢。


我认为你需要更具体地说明你想要做什么。你知道相关进程的PID或名称吗? - Gordon Bailey
您可能想查看相关问题:https://dev59.com/QFDTa4cB1Zd3GeqPIVUf - rayd09
4个回答

13

可以使用kill(2)命令:

 #include <sys/types.h>
 #include <signal.h>

 int kill(pid_t pid, int sig);

如果sig是0,则不会发送信号,但仍会执行错误检查;这可用于检查进程ID或进程组ID的存在。 因此,只需在要检查的进程的进程ID上调用kill(pid,0),并查看是否收到错误(ESRCH)。

@cegfault:没错。一个名称并不能真正告诉你“进程”,因为可能有许多具有相同名称的进程。我认为OP的问题缺少几个重要的细节。 - Kerrek SB
我能够按照您的方法获取到我的进程的pid,这确实帮了我很大的忙。 - Kitcha
@KerrekSB 如果我想检查本地进程的存在,那么这个方法很有效。但是如何检查另一台机器上的进程是否存在呢?我可以通过rsh连接到那台机器。 - werk
@werk:哇,这是一个完全不同的问题,任何答案可能都不适合你的问题。原则上,您希望以某种方式登录到机器上,然后执行本地步骤,但听起来您可能想要一些现有的分布式作业管理系统,而不是自己编写! - Kerrek SB
@KerrekSB谢谢!这正是我想的。同时我会尝试Boost MPI。 - werk
显示剩余5条评论

2
在Linux上,另一种方法是检查/proc目录的内容。编号的目录是进程ID,而包含cmdline文件的子目录显示命令的名称。
例如,如果/proc/1234/cmdline包含值foo,则进程foo的ID为1234。您可以使用C中的标准文件访问函数以此方式将名称映射到PID。有关更多信息,请参见proc(5)

1

0

您可以扫描/proc文件系统以获取所有当前正在运行的进程,并查看cmdline条目是否与您想要的特定进程匹配。

但是,存在竞争条件。在您决定该进程正在运行之后,该进程可能会死亡。

确定您的进程是否仍在运行的可靠方法是成为启动该进程的人。然后,当子进程死亡时,您将收到SIGCHLD,并且您可以使用waitpid(-1,..)来找出哪个子进程已经死亡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接