首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C和C++从父进程中获取子进程列表(跨平台,无命令行)

在云计算领域中,使用C和C++从父进程中获取子进程列表是一个跨平台的需求。为了实现这个功能,可以使用操作系统提供的进程管理相关的API来实现。

在Linux系统中,可以使用fork()函数创建子进程,并使用waitpid()函数来等待子进程的退出。通过遍历父进程的进程表,可以获取到所有子进程的信息。

在Windows系统中,可以使用CreateProcess()函数创建子进程,并使用EnumProcesses()函数来遍历父进程的进程表。通过获取到的进程ID,可以获取到子进程的信息。

以下是一个示例代码,展示了如何使用C和C++从父进程中获取子进程列表的方法:

代码语言:txt
复制
#ifdef _WIN32
#include <windows.h>
#include <tlhelp32.h>
#else
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#endif

#include <iostream>
#include <vector>

#ifdef _WIN32
std::vector<DWORD> GetChildProcesses(DWORD parentProcessId) {
    std::vector<DWORD> childProcesses;

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot != INVALID_HANDLE_VALUE) {
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(PROCESSENTRY32);

        if (Process32First(hSnapshot, &pe32)) {
            do {
                if (pe32.th32ParentProcessID == parentProcessId) {
                    childProcesses.push_back(pe32.th32ProcessID);
                }
            } while (Process32Next(hSnapshot, &pe32));
        }

        CloseHandle(hSnapshot);
    }

    return childProcesses;
}
#else
std::vector<pid_t> GetChildProcesses(pid_t parentProcessId) {
    std::vector<pid_t> childProcesses;

    FILE* fp = popen("ps -eo pid,ppid", "r");
    if (fp != nullptr) {
        char line[256];
        fgets(line, sizeof(line), fp); // Skip the header line

        while (fgets(line, sizeof(line), fp) != nullptr) {
            pid_t pid, ppid;
            sscanf(line, "%d %d", &pid, &ppid);

            if (ppid == parentProcessId) {
                childProcesses.push_back(pid);
            }
        }

        pclose(fp);
    }

    return childProcesses;
}
#endif

int main() {
    pid_t parentProcessId = getpid();

#ifdef _WIN32
    std::vector<DWORD> childProcesses = GetChildProcesses(parentProcessId);
#else
    std::vector<pid_t> childProcesses = GetChildProcesses(parentProcessId);
#endif

    std::cout << "Child Processes:" << std::endl;
    for (const auto& childProcess : childProcesses) {
        std::cout << childProcess << std::endl;
    }

    return 0;
}

这段代码中,根据编译平台选择不同的实现方式。在Windows平台下,使用CreateToolhelp32Snapshot()函数和Process32First()Process32Next()函数来遍历进程表。在Linux平台下,使用popen()函数执行ps命令,并解析输出来获取进程信息。

这个功能可以在以下场景中应用:

  1. 进程监控和管理:通过获取子进程列表,可以监控和管理子进程的状态和行为。
  2. 父子进程通信:通过获取子进程列表,可以建立父子进程之间的通信机制,实现进程间的数据交换和同步。
  3. 资源管理:通过获取子进程列表,可以对子进程进行资源分配和调度,实现更好的资源管理。

腾讯云提供了一系列云计算相关的产品,如云服务器、云数据库、云存储等,可以满足不同场景下的需求。具体产品介绍和相关链接地址可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

初识Tornado

HTTP服务器 异步编程 WebSockets 二、初识Tornado 2.1 安装 安装 pip install tornado 关于使用平台的说明 Tornado应该运行在类Unix平台,在线上部署时为了最佳的性能扩展性...2.关于多进程 虽然tornado给我们提供了一次开启多个进程的方法,但是由于: 每个子进程都会从父进程复制一份IOLoop实例,如果在创建进程前我们的代码动了IOLoop实例,那么会影响到每一个进程...multiple 选项变量的值是否可以为多个,布尔类型,默认值为False,如果multiple为True,那么设置选项变量时值与值之间英文逗号分隔,而选项变量则是一个list列表(若默认值输入均未设置...追加命令行参数的方式是--myoption=myvalue 新建opt.py,我们代码来看一下如何使用: ? ?...= "myothervalue" 我们代码来看一下如何使用,新建配置文件config,注意字符串列表按照python的语法格式: port = 8000 test= ["python","c++

72811

【愚公系列】2021年12月 Python教学课程 26-系统编程

系统相关 os 模块提供了一些操作系统相关的变量,可以在平台的时候提供支持,便于编写移植性高,可用性好的代码。...Linux 是 C 写的,底层的 libc 库系统调用的接口都是 C API,Python 的 os 模块包括了对这些接口的 Python 实现,通过 Python 的 os 模块,可以调用 Linux...“”…") filenames - 目录树的文件组成的列表 如果可选参数 topdown = True 或者没有指定,则采用自顶向下的方式进行目录遍历,也就是从父目录向子目录逐步深入遍历,如果 topdown...os.popen(command, [mode, [bufsize]]) 开启一个进程执行 command 参数指定的命令,在父进程进程之间建立一个管道 pipe,用于在父子进程间通信。...必须是一个字符串,字符串参数列表 stdin、stdout stderr:进程的标准输入、输出错误。

85420

【Windows 逆向】CheatEngine 工具 ( 汉化版 CE 工具推荐 | 编写简单 C++ 程序 | C++ 程序执行分析 | 使用 CE 修改上述 C++ 程序 )

文章目录 一、汉化版 CE 工具推荐 二、编写简单 C++ 程序 三、C++ 程序执行分析 四、使用 CE 修改上述 C++ 程序 一、汉化版 CE 工具推荐 ---- 推荐一个汉化版的 CE 工具 :...+ 程序 ---- CE 工具可以查找 , 并修改软件内存 ; 首先 , 需要启动一个软件 , 这里我们自己编写一个简单程序 ; 在 Visual Studio 2019 创建 Windows 平台的...\n"; int number = 0; printf("number=%d", number); // 从命令行输入字符, 实际意义, 只是为了设置程序间隔 getchar...(); number = 123; printf("number=%d", number); // 从命令行输入字符, 实际意义, 只是为了设置程序间隔 // 在此处阻塞时...放大镜按钮 , 搜索当前运行的进程 ; 搜索后 , 会弹出一个进程列表窗口 , 窗口中会显示所有正在运行的进程 ; 在控制台运行的命令行 , 有程序名称 CE_Demo.exe 程序 ; 在进程列表中找到该程序

1.7K10

Python 执行系统命令

system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个进程在系统上执行命令行进程的执行结果无法影响主进程。...3、Popen.communicate(input=None):与进程进行交互。向stdin发送数据,或从stdoutstderr读取数据。可选参数input指定发送到进程的参数。...同样,如果希望从stdoutstderr获取数据,必须将stdoutstderr设置为PIPE。 4、Popen.send_signal(signal):向进程发送信号。...5、Popen.terminate():停止(stop)进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束进程。...10、Popen.pid:获取进程进程ID。 11、Popen.returncode:获取进程的返回值。如果进程还没有结束,返回None。

1.6K10

【Linux】翻山越岭——进程地址空间

文章目录 一、是什么 写时拷贝 二、为什么 三、怎么做 区域划分调整 一、是什么 回顾我们学习C/C++时的地址空间: 有了这个基本框架,我们对于语言的学习更加易于理解,但是地址空间究竟是什么❓我们对其并不了解...所以,对于我们刚开始的现象很好解释了: 父进程进程都有自己的独立的进程地址空间,且都有自己的页表结构,进程由父进程创建,所以进程的地址空间是从父进程拷贝而来,刚开始的g_val经过映射指向同一个物理内存...,保证了进程的独立性,而对于上面我们所说的父进程进程而言,进程的地址空间从父进程拷贝,页表都指向同一块物理内存,但是即使此时的数据是共享的,在修改数据的时候也会发生我们所说的写时拷贝,保证了进程的独立性...也就是在整个CPU运行过程,CPU并没有见到物理地址,的都是虚拟地址。 另外,对于磁盘内可执行程序编译好,这个可执行程序的地址不叫虚拟地址,是逻辑地址。...补充: 对于区域划分,进程地址空间的划分实际上是这个样子: 0-3G是用户空间,而命令行参数环境变量是在用户空间的,这也是为什么我们可以在main()函数通过第三个参数env获取环境变量的原因。

72330

《Linux操作系统编程》 第六章 Linux进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

理解:Linux进程创建时环境变量、命令行参数的设置,理解父进程等待进程结束获得进程返回值的原理; 掌握:fork函数的使用,以及父子进程间的关系,掌握exec系列函数。...▪ I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备进程使用的文件列表。...为要复制资源的标志,描述需要从父进程继承那些资源。...- int execv(const char *pathname, char *const argv[]); ▪ 参数 - pathname:要执行程序的绝对路径名 - argv:数组指针维护的程序命令行参数列表...fork()创建新进程时,进程从父进程继承了哪些资源? 答:进程复制/拷贝父进程的PCB、用户空间(数据段、堆栈),父子进程共享正文段(只读)。

13110

进程控制第二弹(进程程序替换)

进程执行一个全新的程序 首先父进程进程的PCB、虚拟内存构建好后,通过页表映射到物理内存。...所以重新开辟内存,将ls代码加载到物理内存,修改进程的映射关系。至此,只要程序替换成功,彻底将进程进程分开了。....); execl,l:list,列表 path:需要执行的路劲,需要带路劲 后面的参数:在命令行怎么执行 例如: execl("/usr/bin/ls","ls","-l","-a",NULL...<<endl; return 0; } 运行结果: 结论:我们平时自己运行的程序,命令行参数环境变量是父进程给你的,父进程自己有一个环境变量表,创建进程时把对应的信息传递给进程...父进程本身就有一批环境变量,从“爷爷进程”来的,即bash 这个传参,如果传的是自定义的环境变量,那么就整体替换所有环境变量 传环境变量有三种情况: 全新的给进程 老的环境变量给进程,environ

6310

C++ Qt开发:QProcess进程管理模块

Qt 是一个平台C++图形界面开发库,利用Qt可以快速开发平台窗体应用程序,在Qt我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QProcess...当你在使用Qt进行平台应用程序开发时,经常需要与外部进程进行交互,这时就可以利用Qt的QProcess模块。...QProcess模块提供了启动控制外部进程的功能,能够执行外部命令、运行其他可执行文件,以及与外部进程进行通信。通过QProcess,可以方便地执行命令行命令、调用系统工具、执行脚本等。...这些函数提供了控制进程的各种方法,可以实现启动、监视、控制与外部进程进行交互的功能。进程控制模块可以实现对特定进程的启动关闭,本章将以执行命令行为例,通过调用Start()可以拉起一个第三方进程。...1.1 获取进程信息此处我们以输出系统进程信息为例,通常可以调用tasklist /FO CSV来获取系统进程列表,并将其输出为CSV格式,通过调用如下函数则可以获取到系统进程信息。

15510

tornado 简易教程

Tornado应该运行在类Unix平台,在线上部署时为了最佳的性能扩展性,仅推荐LinuxBSD(因为充分利用Linux的epoll工具BSD的kqueue工具,是Tornado不依靠多进程/多线程而达到高性能的原因...2.关于多进程 虽然tornado给我们提供了一次开启多个进程的方法,但是由于: 每个子进程都会从父进程复制一份IOLoop实例,如过在创建进程前我们的代码动了IOLoop实例,那么会影响到每一个进程...,势必会干扰到进程IOLoop的工作; 所有进程是由一个命令一次开启的,也就无法做到在不停服务的情况下更新代码; 所有进程共享同一个端口,想要分别单独监控每一个进程就很困难。...multiple 选项变量的值是否可以为多个,布尔类型,默认值为False,如果multiple为True,那么设置选项变量时值与值之间英文逗号分隔,而选项变量则是一个list列表(若默认值输入均未设置..."myvalue"myotheroption = "myothervalue" 我们代码来看一下如何使用,新建配置文件config,注意字符串列表按照python的语法格式: port = 8000itcast

1.2K20

你想要的WebAssembly入门与实践

正式开始(要凑字数,理解) Node.js有C++插件,Addon模块,还能调用C#插件,go插件,还能跟他们通信 我show一段我之前写的代码吧.进程调起c#插件,然后通信....(其实这个是我写的当时windows平台的截图插入到自研的文本编辑器,桌面软件) `// Node.js主进程调起子进程 await screen_window(); //function screen_window...Electron,虽然分主进程渲染进程,但是主进程阻塞,同样会阻塞渲染进程,GC也是会阻塞的。...原子操作使开发人员能多个线程使用共享的内存了。...,然后处理后,就可以获取到exports出来的内容了 想要更深入了解的,可以参考下webAssemblyffmpeg实现前端转码 导出一个入口函数到上层js 传入函数参数来控制ffmpeg命令行参数

2.6K20

震撼!全网第一张源码分析全景图揭秘Nginx

不管是C/C++技术栈,还是PHP,Java技术栈,从事后端开发的朋友对nginx一定不会陌生。 ?...看到这篇文章的你有福了,笔者花了不少时间,把这件事给做了,先来看个全貌(限于平台图片尺寸设定,这里只能看个大概,想获取高清大图请看文末): ? 下面选取一些关键部分来一窥神秘的nginx。...主进程启动 nginx主进程启动后,进行一系列的初始化,包括但不限于: 命令行参数解析 时间初始化 日志初始化 ssl初始化 操作系统相关初始化 一致性hash表初始化 模块编号处理 ?...每个模块有一个支持的命令解析列表,在初始化过程,主进程将会遍历所有模块的命令列表,进行配置文件的命令解析,如经常用的ngx_http_proxy_module: ?...总结 nginx不仅是一款优秀的高性能web服务器,对于C/C++技术栈的同学来说,还是一个很好的学习对象,其良好的架构设计,优美的代码风格经典的编程技法无一不值得细细品来。

89710

探索父进程进程

: 通过getpid()得到的PIDps指令获取进程PID是一致的,都是5258 一个进程属性,除了有自己的进程PID还有父进程PID,ps指令查询到的PPID是当前进程的父进程的PID,可以是函数...调用fork函数创建进程,实际上是在操作系统多了一个进程,一样的,它也需要先创建一个属于自己的PCB对象,进程的PCB对象大部分都是以父进程的PCB对象为模板创建的,即直接从父进程的PCB对象那拷贝过来的...在代码,fork函数的返回值我们变量id来接收:pid_t id=fork(),为什么id可以同时有两个值? 在任何平台进程在运行的时候都是具有独立性的。...也就是说一个进程退出、失败、崩溃了,都不会影响其他进程。父进程进程也是两个进程,也具有独立性,父子进程不能访问同一份数据,数据在代码执行过程可能会被修改。...也就是说,进程多少数据,就会拷贝多少数据,效率大大提高。

8410

C++ 资源大全:标准库、Web框架、人工智能等 | 最全整理

C++ 资源列表,内容包括: 标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等 目录 进程间通信 Json 日志 机器学习 数学 内存分配 多媒体 网络 PDF 物理学 映射...GLib: GLib提供C编写的库应用的核心代码块。 JUCE: 包罗万象的C++类库,用于开发平台软件。 Kigs framework: C++免费开源的模块化、多功能、平台的RAD框架。...Boost.Program_options: 通过常见的方法,例如命令行配置文件,来获取程序选择项的库。 Clara: 用于C++11及更高版本的易于使用、可组合的命令行解析器。...sha1collisiondetection: 用于检测文件SHA-1冲突的库命令行工具。 Tink: 多语言、平台的库,提供安全、易于正确使用且难以滥用的加密API。...meta: C++的非侵入性且宏的运行时映射系统,只包含头文件。 Nameof: 只包含头文件的的C++ 17库,提供名称宏函数以获取变量、类型、函数、宏枚举的简单名称。

4900

【linux命令讲解大全】189.常用的Linux命令详解

setsid 在新的会话运行程序 补充说明 setsid 命令进程从父进程继承了:SessionID、进程组ID打开的终端。进程如果要脱离这些,代码可通过调用 setsid 来实现。...而命令行或脚本可以通过使用命令 setsid 来运行程序实现。setsid 帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程隶属的会话。...选项 -c, --ctty: 将控制终端设置为当前控制终端 -f, --fork: 总是 fork -w, --wait: 等待程序退出,并使用相同的返回 实例 可见 setsid 的使用也是非常方便的...而不使用默认配置文件 -k:向 squid 服务器发送指令 -s:启用 syslog 日志 -z:创建缓存目录 -C:不捕获致命信号 -D:不进行 DNS 参数测试 -N:以非守护进程模式运行 -X:强制进入完全调试模式...语法 squidclient [选项] [参数] 选项 -a:不包含 “accept:header” -r:强制缓存重新加载 URL -s:安静模式,不输出信息到标准输出设备 -h:从指定主机获取 URL

8410

Windows内核之进程基本含义以及进程的创建「建议收藏」

启动函数完毕例如以下任务: 检索指向新进程的完整命令行的指针 检索指向新进程的环境变量的指针 对C/ C + +执行期的全局变量进行初始化。...3.2 进程的前一个实例句柄 C++代码总是将NULL赋值给WinMain函数的第二个參数HINSTANCEhPreInstance,这种原因是在16位的程序对这个參数有保留使用,那么保留它就方便转用...4 进程命令行 LPTSTR GetCommandLine();获取命令行字符串 5 进程的环境变量 每一个进程都有一个与它相关的环境变量块,环境块是进程的地址空间中分配的一个内存块...当进程内核对象创建后,系统赋予该对象一个独一二的标识号。系统的其它不论什么进程内核对象都不能使用这个同样的ID号。线程内核对象的情况也一样。...当一个线程内核对象创建时,该对象被赋予一个独一二的、系统范围的ID号。进程ID线程ID共享同样的号码池。这意味着进程线程不可能拥有同样的ID 。

59610

将PythonR整合进一个数据分析流程

命令行执行执行进程 为了更好地理解在执行进程的时候发生了什么,值得重新考虑当命令行运行一个Python 或 R进程更多的细节。...在这种方式下运行命令行脚本是有用的,但如果希望这个方法执行多个连续却相互独立脚本时,就变得繁琐,并且容易出错。然而,这可能让一个Python或R进程直接去执行另一个类似的命令。...(pattern) #把所产生的元素列表合成一个新命令行 # 分割字符串并打印 print('\n'.join(ans)) 在R调用Python 当用R执行进程时,建议使用 R 的system2函数来执行并获取输出...这是因为内置的系统函数平台不兼容,非常难使用。 建立要执行的命令是类似于上面的 Python 例子,然而system2 期望命令根据它的参数被分解开来。...这允许一个父进程调用另一个进程作为进程,并获取任何输出到标准输出的结果。

2.4K80

Pythonsubprocess的Popen来调用系统命令

參数cwd用于设置进程的当前文件夹。 參数env是字典类型,用于指定子进程的环境变量。假设env = None,进程的环境变量将从父进程中继承。...參数startupinfo与createionflags仅仅在windows下效,它们将被传递给底层的CreateProcess()函数, 于设置进程的一些属性,如:主窗体的外观,进程的优先级等等...Popen.communicate(input=None) 与进程进行交互。向stdin发送数据,或从stdoutstderr读取数据。可选參数input指定发送到进程的參数。...相同,如 果希望从stdoutstderr获取数据,必须将stdoutstderr设置为PIPE。 Popen.send_signal(signal) 向进程发送信号。...Popen.pid 获取进程进程ID。 Popen.returncode 获取进程的返回值。假设进程还没有结束,返回None。

1.7K20

将PythonR整合进一个数据分析流程

命令行执行执行进程 为了更好地理解在执行进程的时候发生了什么,值得重新考虑当命令行运行一个Python 或 R进程更多的细节。...在这种方式下运行命令行脚本是有用的,但如果希望这个方法执行多个连续却相互独立脚本时,就变得繁琐,并且容易出错。然而,这可能让一个 Python或R进程直接去执行另一个类似的命令。...(pattern) #把所产生的元素列表合成一个新命令行 # 分割字符串并打印 print(‘\n’.join(ans)) 在R调用Python 当用R执行进程时,建议使用 R 的system2...这是因为内置的系统函数平台不兼容,非常难使用。 建立要执行的命令是类似于上面的 Python 例子,然而system2 期望命令根据它的参数被分解开来。...这允许一个父进程调用另一个进程作为进程,并获取任何输出到标准输出的结果。 来源:大数据文摘

3.1K80

python执行DOS命令的3种方法小

参数cwd用于设置进程的当前目录。 参数env是字典类型,用于指定子进程的环境变量。如果env = None,进程的环境变量将从父进程中继承。...参数startupinfo与createionflags只在windows下效,它们将被传递给底层的CreateProcess()函数, 于设置进程的一些属性,如:主窗口的外观,进程的优先级等等。...Popen.communicate(input=None) 与进程进行交互。向stdin发送数据,或从stdoutstderr读取数据。可选参数input指定发送到进程的参数。...同样,如 果希望从stdoutstderr获取数据,必须将stdoutstderr设置为PIPE。 Popen.send_signal(signal)  向进程发送信号。...Popen.pid  获取进程进程ID。 Popen.returncode  获取进程的返回值。如果进程还没有结束,返回None。

2K20
领券