根据进程 pid 检查进程是否存在
- 2024-11-12 08:36:00
- admin 原创
- 23
问题描述:
给定一个 Linux 进程的 pid,我想从 C 程序检查该进程是否仍在运行。
解决方案 1:
发出一个以 作为信号kill(2)
的系统调用0
。如果调用成功,则意味着存在具有此 pid 的进程。
如果调用失败并errno
设置为ESRCH
,则不存在具有此类 pid 的进程。
引用 POSIX 标准:
如果 sig 为 0(空信号),则执行错误检查但实际上不发送任何信号。空信号可用于检查 pid 的有效性。
请注意,您无法避免竞争条件:目标进程可能已退出,而与此同时另一个具有相同 pid 的进程已启动。或者,在您检查后,进程可能很快退出,而您可以根据过时的信息做出决定。
只有当给定的 pid 属于子进程(fork
从当前进程开始)时,您才可以使用waitpid(2)
选项WNOHANG
,或尝试捕获SIGCHLD
信号。这些方法不会出现竞争条件,但仅与子进程相关。
解决方案 2:
kill(pid, 0)
是典型的方法,正如@blagovest-buyukliev 所说。但是如果你正在检查的进程可能属于不同的用户,并且你不想采取额外的步骤来检查是否errno == ESRCH
,那么结果就是
(getpgid(pid) >= 0)
是一种有效的单步方法,用于确定任何进程是否具有给定的 PID(因为即使对于不属于您的进程,您也可以检查进程组 ID)。
解决方案 3:
使用 procfs。
#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
// process doesn't exist
}
轻松便携至
索拉里斯
艾瑞克斯
Tru64 UNIX
北达科他州
Linux
IBM AIX
微软
贝尔实验室的 Plan 9
解决方案 4:
您可以发出作为信号的kill(2)
系统调用。0
没有什么不安全的kill -0
。程序必须意识到结果可能随时过时(包括在调用 kill 之前可以重用 pid),仅此而已。而使用 procfs也会使用 pid,并且使用的方式更麻烦、更不标准。
解决方案 5:
作为 /proc 文件系统方法的附录,您可以检查 /proc/<pid>/cmdline(假设它是从命令行启动的)以查看它是否是您想要的进程。
解决方案 6:
ps -p $PID > /dev/null 2>&1; echo $?
0
如果进程仍在运行,则此命令返回$PID
。否则返回1
。
也可以在 OSX 终端中使用此命令。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件