#include <string>
#include <vector>
#include <mutex>

// ... 其他头文件和命名空间 ...

// 定义进程信息结构体
typedef struct {
    std::string COMMAND;
    float CPU;
    float MEM;
    float VSZ;
} ProcessInfo1;

// 定义CPU信息结构体
struct CpuInfo
{
    struct 
    {
        float data;
    } cpu, mem, vsz;
};

// ... 其他代码 ...

void MONITOR_BASE::show_cpu_status()
{
    std::vector<ProcessInfo1> process_info = getTopProcesses_CPU(MONITOR_CONSTANT::FIFTY);
    LOG(INFO) << 'CPU Temperature: ' << getCpuTemperature() << '℃';

    for (auto &ele : process_info)
    {
        if (isSubstring(std::string(std::getenv('AUTO_ROOT')), ele.COMMAND) && ele.COMMAND != '')
        {
            LOG(INFO) << 'Process(' << getLastElement(ele.COMMAND)
                      << ') take CPU(' << ele.CPU
                      << '%), MEM(' << ele.MEM
                      << '%), VSZ(' << ele.VSZ / 1024 << ' MB)';
            std::string process_name = getLastElement(ele.COMMAND);
            float cpu = ele.CPU;
            float mem = ele.MEM;
            float vsz = ele.VSZ;
            module_cpu_info(process_name, cpu, mem, vsz);
            // clear_cpu_info_(process_name);
            pub_memory_.publish(cpu_info_);
        }
    }
}

void MONITOR_BASE::module_cpu_info(std::string process_name, float cpu, float mem, float vsz)
{
    static std::mutex cpu_mutex; // 定义静态互斥锁

    std::string check_process_cmd = 'pidof ' + process_name;
    FILE *pipe = popen(check_process_cmd.c_str(), 'r');
    char buffer[128];
    std::string result = '';
    while (fgets(buffer, sizeof(buffer), pipe) != nullptr)
    {
        result += buffer;
    }
    pclose(pipe);

    bool process_exists = !result.empty();

    // 加锁保护对 cpu_info_ 的访问
    std::lock_guard<std::mutex> lock(cpu_mutex);

    if (process_exists)
    {
        // 进程存在,更新 cpu_info_ 的值
        if (process_name == 'auto_ad_monitor_node')
        {
            cpu_info_.auto_ad_monitor_node.cpu.data = cpu;
            cpu_info_.auto_ad_monitor_node.mem.data = mem;
            cpu_info_.auto_ad_monitor_node.vsz.data = vsz;
        }
        else if (process_name == 'auto_ad_memory_monitor')
        {
            cpu_info_.auto_ad_memory_monitor.cpu.data = cpu;
            cpu_info_.auto_ad_memory_monitor.mem.data = mem;
            cpu_info_.auto_ad_memory_monitor.vsz.data = vsz;
        }
        // ... 其他进程 ...
    }
    else
    {
        // 进程不存在,将对应的 cpu_info_ 值清零
        if (process_name == 'auto_ad_memory_monitor')
        {
            cpu_info_.auto_ad_memory_monitor.cpu.data = 0;
            cpu_info_.auto_ad_memory_monitor.mem.data = 0;
            cpu_info_.auto_ad_memory_monitor.vsz.data = 0;
        }
        // ... 其他进程 ...
    }
}

这段代码展示了如何使用C++获取系统CPU状态并发布。

主要功能:

  • 获取CPU温度。
  • 获取指定进程的CPU占用率、内存占用率和虚拟内存大小。
  • 将获取到的信息存储到结构体中。
  • 使用互斥锁保护对共享数据的访问。
  • 通过ROS话题发布CPU信息。

代码说明:

  • show_cpu_status() 函数获取系统CPU温度和进程信息,并调用 module_cpu_info() 函数更新 cpu_info_ 结构体。
  • module_cpu_info() 函数根据进程名更新或清零 cpu_info_ 结构体中的对应值,并使用互斥锁 cpu_mutex 保证线程安全。
  • pub_memory_.publish(cpu_info_); 将更新后的CPU信息发布到ROS话题。

改进建议:

  • 可以将进程名和对应的 cpu_info_ 成员变量使用map进行关联,简化代码逻辑。
  • 可以使用更完善的错误处理机制,例如在获取CPU温度或进程信息失败时进行处理。
  • 可以根据实际需求调整代码逻辑,例如增加发布频率、添加其他系统监控指标等。

这段代码可以作为系统监控程序的一部分,用于实时监测系统状态并及时发现问题。

C++实现获取系统CPU状态并发布

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

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