如何找到所有子进程?

2024-11-14 08:30:00
admin
原创
73
摘要:问题描述:在我正在从事的一个基于 Linux 的项目中,我需要能够找到我的所有子进程。每次启动时都记录是不可行的——需要在事后找到它们。这需要纯 C,我想在不阅读的情况下做到这一点/proc。有人知道怎么做吗?解决方案 1:每次启动子进程时记录子进程通常是完全可行的。方便的是,父进程将子进程的 pid 值作为...

问题描述:

在我正在从事的一个基于 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 源代码,然后在构建它之后链接到它。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用