如何找到所有子进程?

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用