如何找到所有子进程?
- 2024-11-14 08:30:00
- admin 原创
- 73
问题描述:
在我正在从事的一个基于 Linux 的项目中,我需要能够找到我的所有子进程。每次启动时都记录是不可行的——需要在事后找到它们。这需要纯 C,我想在不阅读的情况下做到这一点/proc
。有人知道怎么做吗?
解决方案 1:
每次启动子进程时记录子进程通常是完全可行的。方便的是,父进程将子进程的 pid 值作为创建它的 fork 调用的返回值传递。
正如手册页所述:
pid_t fork(void);
如果您能告诉我们为什么您认为它不可行,那将会很有帮助。
解决方案 2:
我发现您的评论很奇怪,记录进程的创建是不可行的,但如果您真的不能(可能是因为您不知道将创建多少个进程并且不想保留realloc
内存),那么我可能会打开所有与 glob 匹配的文件/proc/[1-9]*/status
并查找显示我的进程 ID 在PPid: <num>
哪里的行。<num>
解决方案 3:
你可以使用 popen
类似于。(希望语法足够接近)
#包括 <stdio.h>
#包括 <unistd.h>
#包括 <stdlib.h>
int main(int argc,char *argv[])
{
文件 *fp = popen("ps -C *此处输入您的程序名称* --format '%P %p'" , "r");
如果 (fp == NULL)
{
printf("错误!
");
}
char 父ID[256];
字符进程ID[256];
while (fscanf(fp, "%s %s", parentID, processID) != EOF)
{
printf("PID: %s 父进程: %s
", processID, parentID);
// 检查 parentID 以查看它是否属于你的进程
}
pclose(fp);
返回1;
}
解决方案 4:
你可以试试这个
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
char str[50] = "ps -o pid --ppid ";
char ppid [7];
sprintf(ppid,"%d",getpid());
strcat(str,ppid);
system(str);
注意:这一段代码需要在父进程中
基本上ps -o pid --ppid <parent_id>
给出了父进程具有 PID 的所有子进程的 pid <parent_id>
。现在,我们可以通过使用来获取父进程的 PID getpid()
,它返回pid_t
并隐式转换为整数。sprintf()
将其转换为字符串,然后将结果与连接起来str
以获取由执行的完整命令system()
。
解决方案 5:
您可以解析包含父进程 ID 的进程列表 (ps -ax?)。这可能可以通过一个简单的 shell 脚本来完成。
解决方案 6:
如果您尝试获取所有子进程的特定目的,即等待它们退出,则可以使用 waitpid(-1,...):
while (true) {
// Wait for any child exiting
int child_status;
const int child_pid = waitpid(-1, &child_status, 0);
// check child_status
}
解决方案 7:
如果您想要跟踪 fork 事件并提取子进程的 pid 以进行调试,有多种方法可以实现,包括:
使用 GDB
使用 strace
使用 systemtap
使用内核事件连接器(不确定它们到底是什么)
解决方案 8:
需要调整此存储库中的代码以纯 C 语言编写以满足您的要求,如果您同意这样做,如果您从项目内的我的存储库中删除所有未使用的功能,那么将其转换为纯 C 语言应该并不难。
但这对于那些希望支持多平台和/或喜欢 C++ 的人来说更有用。
查看函数pids_from_ppid(ppid)
https://github.com/time-killer-games/enigma-dev/blob/548dc16e96a2a32f8ad9045a4ee18b0206516e62/ENIGMAsystem/SHELL/Universal_System/Extensions/ProcInfo/procinfo.h#L101
返回一个字符串,其中每个子进程 ID 由管道“|”字符作为分隔符分隔。
Ubuntu 和 debian 用户需要安装 libprocps-dev 来弥补缺少的标头。
sudo apt-get 安装 libprocps-dev libx11-dev
libx11-dev 依赖项是可选的,因为源中的所有 X11 代码都可以省略,并且这里的问题仍然会得到解答,所以如果您需要 wayland 并且不需要 X11 支持,您应该删除 X11 相关代码,因为它与这个问题无关。
对于那些真正喜欢/需要 X11 和/或 C++ 的人来说,它可以在 Windows、Mac、Linux 和 FreeBSD 上开箱即用。由于依赖 libutil 依赖项,对其他 BSD 的支持并不容易实现。但它只是在内部使用 sysctl(),因此理论上您应该能够编译 FreeBSD 的 github 存储库中可用的其他 BSD 上的 libutil 源代码,然后在构建它之后链接到它。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件