Windows/Linux下进程信息获取

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; // 进程IDprocessInfo.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); // 获取进程IDprocessInfo.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>
#endifstruct 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;
}
#endifvoid 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 _WIN32system("pause");#endifreturn 0;
}

四、结果

windows:

在这里插入图片描述

linux:

在这里插入图片描述


期待大家和我交流,留言或者私信,一起学习,一起进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/120781.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF 入门指南:从零开始学习网络安全竞赛

文章目录 写在前面CTF 简介和背景CTF 赛题类型介绍CTF 技能和工具准备好书推荐 写作末尾 写在前面 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几…

ip的标准分类---分类的Ip

分类的 IP 即将 IP 地址划分为若干个固定类&#xff0c;每一类地址都由两个固定长度的字段组成。 其中第一个字段是网络号&#xff08;net-id&#xff09;&#xff0c;它标志主机或路由器所连接的网络。一个网络号在整个因特网内必须是唯一的。 第二个字段是主机号&#xf…

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert

【Linux服务器】多人聊天群的实现----附代码

UDP构建服务器 预备知识 认识UDP协议 此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论. 传输层协议无连接不可靠传输面向数据报 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多…

【数学建模】2023华为杯研究生数学建模F题思路详解

强对流降水临近预报 我国地域辽阔&#xff0c;自然条件复杂&#xff0c;因此灾害性天气种类繁多&#xff0c;地区差异大。其中&#xff0c;雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以2022年为例&#xff0c;我国…

解密PDF密码

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

【Java 进阶篇】深入理解 SQL 聚合函数

在 SQL 数据库中&#xff0c;聚合函数是一组强大的工具&#xff0c;用于处理和分析数据。它们可以帮助您对数据进行统计、计算总和、平均值、最大值、最小值等操作。无论您是数据库开发者、数据分析师还是希望更好地了解 SQL 数据库的用户&#xff0c;了解聚合函数都是非常重要…

安防监控/视频汇聚平台EasyCVR云端录像不展示是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

lenovo联想笔记本电脑ThinkPad X13 AMD Gen2(20XH,20XJ)原装出厂Windows10系统镜像

联想原厂Win10系统&#xff0c;自带所有驱动、出厂主题壁纸、系统属性联想LOGO专属标志、Office办公软件、联想电脑管家等预装程序 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;dolg 适用于型号&#xff1a;20XL,20XJ,20XG,21A1,20XK,20XH,20XF,21A0 所需要…

【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准

关联文章: 各种时间类型和timezone关系浅析 一、测试目的和值 1. 测试一般的数据库不含time zone的类型的时区。 mysql timestamp(3) 类型postgres timestamp(3) 类型sqlserver datetime2(3) 类型oracle类型 TIMESTAMP(3) 类型 在以下测试之中均为ts字段 2.测试CDC中元数据…

基于 Python+Django 实现一个电商购物网站系统

随着互联网的高速发展&#xff0c;电子商务行业也正迎来了其黄金时代。如何搭建一个功能完备、体验良好的电商网站成了许多开发者的关心话题。 今天&#xff0c;我将带大家使用Python语言和Django框架&#xff0c;快速打造一个电商购物系统。如果你有一定的Python基础&#xf…