#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cstdio>

struct ProcessInfo1 {
    std::string USER;
    int PID;
    float CPU;
    float MEM;
    int VSZ;
    int RSS;
    std::string TTY;
    std::string STAT;
    std::string START;
    std::string TIME;
    std::string COMMAND;
};

// 获取CPU使用率排名前几的进程信息
std::vector<ProcessInfo1> getTopProcesses_CPU(const int &numProcesses) {
    std::vector<ProcessInfo1> result;

    // 构建命令来获取前几个占用CPU和内存的进程
    std::string cmd = 'ps aux --sort=-%cpu,-%mem | head -n ' + std::to_string(numProcesses + 1);

    // 使用popen执行命令并读取输出
    FILE *pipe = popen(cmd.c_str(), 'r');
    if (!pipe) {
        std::cerr << 'Failed to run command' << std::endl;
        return result;
    }

    char buffer[1024];
    fgets(buffer, sizeof(buffer), pipe); // 读取并忽略标题行
    while (fgets(buffer, sizeof(buffer), pipe) != NULL) {
        ProcessInfo1 info;
        std::stringstream ss(buffer);
        ss >> info.USER >> info.PID >> info.CPU >> info.MEM >> info.VSZ >> info.RSS >> info.TTY >> info.STAT >> info.START >> info.TIME;
        getline(ss, info.COMMAND); // 读取命令行剩余部分
        result.push_back(info);
    }

    pclose(pipe);
    return result;
}

int main() {
    // 获取CPU使用率排名前5的进程
    std::vector<ProcessInfo1> topProcesses = getTopProcesses_CPU(5);

    // 打印进程信息
    for (const auto &process : topProcesses) {
        std::cout << 'USER: ' << process.USER << ', ';
        std::cout << 'PID: ' << process.PID << ', ';
        std::cout << 'CPU: ' << process.CPU << '%, ';
        std::cout << 'MEM: ' << process.MEM << '%, ';
        std::cout << 'COMMAND: ' << process.COMMAND << std::endl;
    }

    return 0;
}

代码说明:

  • ProcessInfo1 结构体用于存储进程信息,包括用户名、进程ID、CPU使用率、内存使用率等。
  • getTopProcesses_CPU 函数接受一个整数参数 numProcesses,表示要获取的进程数量。
  • 函数内部使用 ps aux --sort=-%cpu,-%mem | head -n 命令获取CPU使用率排名前 numProcesses + 1 的进程信息。
  • 使用 popen 函数执行命令并获取输出。
  • 使用 fgets 函数逐行读取输出,并使用 stringstream 解析每一行的信息,存储到 ProcessInfo1 结构体中。
  • 最后将所有进程信息存储到 std::vector 中并返回。

使用方法:

  1. 将代码保存为 .cpp 文件,例如 cpu_monitor.cpp
  2. 使用C++编译器编译代码:g++ cpu_monitor.cpp -o cpu_monitor
  3. 运行程序:./cpu_monitor

程序将打印CPU使用率排名前5的进程信息,包括用户名、进程ID、CPU使用率、内存使用率和命令。

注意:

  • 该代码示例仅获取CPU使用率排名前几的进程信息,如果需要获取所有进程信息,需要修改代码。
  • 该代码示例仅适用于Linux系统,不适用于其他操作系统。
  • 使用 popen 函数执行命令时,需要确保命令的安全性,避免潜在的安全风险。

希望这段代码可以帮助您监控Linux系统的CPU使用率。

使用C++获取和监控Linux系统CPU使用率

原文地址: https://www.cveoy.top/t/topic/FHi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录