如何找到所有子进程?

2024-11-14 08:30:00
admin
原创
292
摘要:问题描述:在我正在从事的一个基于 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 源代码,然后在构建它之后链接到它。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用