Windows/Linux下进程信息获取

这篇具有很好参考价值的文章主要介绍了Windows/Linux下进程信息获取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Windows/Linux下进程信息获取,目前可获取进程名称、进程ID、进程状态

理论分析:

Windows版本获取进程列表的API:

  • CreateToolhelp32Snapshot()

    • 创建进程快照,对应当前系统所有进程的实时状态。
    • 参数TH32CS_SNAPPROCESS表示只捕获进程信息。
  • Process32First()

    • 获取快照中第一个进程的ProcessEntry信息。
  • Process32Next()

    • 循环获取快照中下一个进程的ProcessEntry信息。
  • PROCESSENTRY32

    • 该结构体定义了每一个进程项的信息,如进程ID、名称等。

Linux版本获取进程列表的API:

  • opendir(“/proc”)

    • 打开/proc文件夹,该文件夹下每个数字子目录对应一个进程。
  • readdir()

    • 迭代读取/proc下的每个目录项。
  • DT_DIR

    • 判断目录项类型,仅取子目录项。
  • stat文件

    • 每个进程子目录下都有一个stat文件,包含进程状态信息。

详细分析:

  • Windows使用CreateToolhelp32Snapshot获取运行进程的快照。

  • 通过Process32First和Process32Next依次遍历快照中的每个进程项。

  • 获取进程项结构PROCESSENTRY32中的名称和ID字段。

  • Linux通过遍历/proc目录获取每个以数字为名的进程子目录。

  • 判断子目录项类型后,打开每个子目录下的stat文件。

  • 解析stat文件内容获取进程名称和状态。


一、windows部分

先稍微解析下:

std::vector<ProcessInfo> getRunningProcesses() {
    std::vector<ProcessInfo> processList; // 进程信息向量
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 获取进程快照
    if (snapshot != INVALID_HANDLE_VALUE) {
        PROCESSENTRY32 processEntry; // 进程条目信息结构体
        processEntry.dwSize = sizeof(PROCESSENTRY32); // 设置结构体大小
        if (Process32First(snapshot, &processEntry)) { // 遍历快照中的第一个进程
            do {
                ProcessInfo processInfo; // 进程信息结构体
                processInfo.name = processEntry.szExeFile; // 进程名称
                processInfo.id = processEntry.th32ProcessID; // 进程ID
                processInfo.status = "Running"; // 运行状态
                processList.push_back(processInfo); // 加入向量
            } while (Process32Next(snapshot, &processEntry)); // 遍历下一个进程
        }
        CloseHandle(snapshot); // 关闭快照
    }
    return processList; // 返回进程向量
}

二、Linux部分

std::vector<ProcessInfo> getRunningProcesses() {
    std::vector<ProcessInfo> processList; // 定义进程信息向量
    DIR* dir = opendir("/proc"); // 打开/proc目录
    if (dir != nullptr) { 
        struct dirent* entry; // 定义目录条目结构体
        while ((entry = readdir(dir)) != nullptr) { // 遍历目录条目
            if (entry->d_type == DT_DIR) { // 如果是目录
                std::string processDirName = entry->d_name; // 获取目录名
                if (processDirName.find_first_not_of("0123456789") == std::string::npos) { // 如果目录名全是数字
                    std::string statFilePath = "/proc/" + processDirName + "/stat"; // 拼接状态文件路径
                    std::ifstream statFile(statFilePath); // 打开状态文件
                    if (statFile.is_open()) {
                        std::string name; // 进程名称
                        char status; // 进程状态
                        statFile >> name >> status; // 读取进程信息
                        ProcessInfo processInfo; // 定义进程信息结构体
                        processInfo.name = name.substr(1, name.length() - 2); // 获取进程名
                        processInfo.id = std::stoi(processDirName); // 获取进程ID
                        processInfo.status = (status == 'R') ? "Running" : "Idle"; // 获取状态
                        processList.push_back(processInfo); // 加入向量
                    }
                }
            }
        }
        closedir(dir); // 关闭目录
    }
    return processList; // 返回进程向量
}  

三、完整代码

#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <chrono>
#include <string>

#ifdef _WIN32
    #include <windows.h>
    #include <tlhelp32.h>
    #include <Psapi.h>
#else
    #include <fstream>
    #include <sstream>
    #include <sys/types.h>
    #include <dirent.h>
    #include <unistd.h>
    #include <sys/resource.h>
    #include <sys/stat.h>
    #include <sys/sysinfo.h> 
    #include <sys/time.h>
#endif

struct ProcessInfo {
    std::string name;
    int id;
    std::string status;
};

#ifdef _WIN32
std::vector<ProcessInfo> getRunningProcesses() {
    std::vector<ProcessInfo> processList;
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (snapshot != INVALID_HANDLE_VALUE) {
        PROCESSENTRY32 processEntry;
        processEntry.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(snapshot, &processEntry)) {
            do {
                ProcessInfo processInfo;
                processInfo.name = processEntry.szExeFile;
                processInfo.id = processEntry.th32ProcessID;
                processInfo.status = "Running";
                processList.push_back(processInfo);
            } while (Process32Next(snapshot, &processEntry));
        }
        CloseHandle(snapshot);
    }
    return processList;
}

#else
std::vector<ProcessInfo> getRunningProcesses() {
    std::vector<ProcessInfo> processList;
    DIR* dir = opendir("/proc");
    if (dir != nullptr) {
        struct dirent* entry;
        while ((entry = readdir(dir)) != nullptr) {
            if (entry->d_type == DT_DIR) {
                std::string processDirName = entry->d_name;
                if (processDirName.find_first_not_of("0123456789") == std::string::npos) {
                    std::string statFilePath = "/proc/" + processDirName + "/stat";
                    std::ifstream statFile(statFilePath);
                    if (statFile.is_open()) {
                        std::string name;
                        char status;
                        statFile >> name >> status;
                        ProcessInfo processInfo;
                        processInfo.name = name.substr(1, name.length() - 2);
                        processInfo.id = std::stoi(processDirName);
                        processInfo.status = (status == 'R') ? "Running" : "Idle";
                        processList.push_back(processInfo);
                    }
                }
            }
        }
        closedir(dir);
    }
    return processList;
}
#endif

void displayProcessInfo(const std::vector<ProcessInfo>& processList) {
    for (const auto& process : processList) {
        std::cout << "Process Name: " << process.name << std::endl;
        std::cout << "Process ID: " << process.id << std::endl;
        std::cout << "Process Status: " << process.status << std::endl;
        std::cout << "-----------------------------" << std::endl;
    }
}

int main() {
    std::vector<ProcessInfo> processes = getRunningProcesses();
    displayProcessInfo(processes);

    #ifdef _WIN32
    system("pause");
    #endif
    return 0;
}

四、结果

windows:

Windows/Linux下进程信息获取,windows,linux

linux:

Windows/Linux下进程信息获取,windows,linux


期待大家和我交流,留言或者私信,一起学习,一起进步!文章来源地址https://www.toymoban.com/news/detail-730285.html

到了这里,关于Windows/Linux下进程信息获取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows获取硬件信息

    因项目需要,一直在网上调研获取Windows硬件信息的解决方案,要求稳定性高、可靠性强、兼容性好。在网上绝大多数的博主推荐使用WMIC获取硬件信息,WMIC是微软官方推出的一款Windows Management Instrumentation (WMI)命令行实用工具,在使用了一段时间后发现,WMIC在一些机器上会出

    2024年01月16日
    浏览(46)
  • 获取windows硬件、软件信息的方法

    1,方法1 systeminfo 该命令是Windows中用于显示关于计算机及其操作系统的详细配置信息,包括操作系统配置、安全信息、产品 ID 和硬件属性,如 RAM、磁盘空间和网卡和补丁信息等。 例如,我们把信息格式化,加以利用方法如下 : 上面输出的信息分为表头,正文两行输出,我

    2024年02月04日
    浏览(43)
  • Windows下获取设备管理器列表信息-setupAPI

    在与硬件打交道时,经常需要知道当前设备连接的硬件信息,以便连接正确的硬件,比如串口通讯查询连接的硬件及端口,一般手工的方式就是去设备管理器查看相应的信息,应用程序如何读取这一部分信息呢,Windows下的SetupAPI系列就可以解决这个问题 主要是3个API的使用

    2024年02月05日
    浏览(38)
  • 释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[2.项目讲解篇],支持Linux/Windows部署安装

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月03日
    浏览(48)
  • 释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[1.安装部署篇],支持Linux/Windows部署安装

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月05日
    浏览(74)
  • 释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[1.安装部署篇--简洁版],支持Linux/Windows部署安装

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目

    2024年02月06日
    浏览(48)
  • linux shell pgrep命令使用方法(pgrep指令)获取进程号、统计进程数量(学会区分Linux进程进程名)

    按照我之前,在脚本中,获取除脚本自身进程之外与脚本同名进程号的方法: 这种方法有很大问题,莫名奇妙的,它无法正常过滤掉grep的进程(这里面还有点复杂,我一时半会也搞不明白咋回事,据说是grep会开子进程,并非grep那个子进程,而是开了一个与脚本相同的进程,

    2024年02月07日
    浏览(50)
  • Windows10批处理获取电脑的详细信息并保存在指定路径

    一、使用WMIC查询电脑硬件信息 1、命令行使用WMIC查询Windows系统的硬件信息命令 二、创建批处理文件获取电脑的详细信息 ①新建一个文本文件,然后修改该文本文件的名称为(获取本机详细信息)后缀名为(.bat) ②批处理文件的内容为: ③选中(获取本机详细信息.bat)文

    2024年02月07日
    浏览(48)
  • Linux 下获取进程所在文件的路径

    以top进程为例: top进程的pid为31386 ,可以通过查看 /proc/pid/exe: 在Linux系统中,每个进程都有一个/proc/pid/exe文件,它是一个符号链接文件,指向当前进程的可执行文件。 更具体地说,/proc/pid/exe文件是一个符号链接文件,它的内容是一个指向当前进程可执行文件的绝对路径的

    2024年02月09日
    浏览(50)
  • 【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:进程的概念,进程管理初识(描述、管理进程),查看进程的基础方法,获取进程标识符(pid、ppid),fork进程创建(分流应用) 🚢🚢作者简介:计算机海洋的新进船长一枚,请多多

    2023年04月27日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包