C++实现获取系统CPU状态并发布
#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温度或进程信息失败时进行处理。
- 可以根据实际需求调整代码逻辑,例如增加发布频率、添加其他系统监控指标等。
这段代码可以作为系统监控程序的一部分,用于实时监测系统状态并及时发现问题。
原文地址: https://www.cveoy.top/t/topic/lJ8 著作权归作者所有。请勿转载和采集!