如何在C++11代码中获取Linux系统整体内存与CPU使用率?
嘿,这个问题我刚好有实操经验!在Linux(比如Ubuntu)下用C11获取系统整体的内存和CPU使用率,最直接可靠的方式就是读取/proc伪文件系统里的信息——这是Linux内核暴露系统状态的标准接口,不需要依赖任何第三方库,完全用标准C就能实现。下面分两部分给你详细拆解:
获取系统内存使用率
Linux把所有内存相关的实时数据都存在/proc/meminfo里,我们只需要读取这个文件,提取几个关键字段就能算出使用率。常见的计算逻辑是:实际占用内存 = 总内存 - 空闲内存 - 缓冲内存 - 缓存内存,再用这个值除以总内存得到百分比(不同工具的统计口径可能略有差异,这个是最贴近用户感知的“实际占用”)。
以下是完整的C++11代码:
#include <iostream> #include <fstream> #include <string> #include <map> double get_system_memory_usage() { std::ifstream meminfo("/proc/meminfo"); if (!meminfo.is_open()) { std::cerr << "Failed to open /proc/meminfo" << std::endl; return -1.0; } std::map<std::string, unsigned long long> mem_data; std::string key; unsigned long long value; std::string unit; // 逐行解析meminfo的字段 while (meminfo >> key >> value >> unit) { // 去掉字段名末尾的冒号,比如"MemTotal:"变成"MemTotal" if (!key.empty() && key.back() == ':') { key.pop_back(); } mem_data[key] = value; } // 提取关键内存数据(单位:KB) unsigned long long total = mem_data["MemTotal"]; unsigned long long free = mem_data["MemFree"]; unsigned long long buffers = mem_data["Buffers"]; // SReclaimable是可回收的slab缓存,也算作可用内存 unsigned long long cached = mem_data["Cached"] + mem_data["SReclaimable"]; unsigned long long used = total - free - buffers - cached; return (static_cast<double>(used) / total) * 100.0; } int main() { double usage = get_system_memory_usage(); if (usage >= 0) { std::cout << "System Memory Usage: " << usage << "%" << std::endl; } return 0; }
获取系统CPU消耗情况
CPU使用率的计算稍微特殊一点——它是一段时间内的平均占用率,所以我们需要两次读取/proc/stat文件,计算两次采样之间的CPU状态变化。/proc/stat的第一行cpu开头的记录,包含了系统启动以来CPU在不同状态下的总时间(单位是jiffies,通常是1/100秒)。
以下是完整的C++11代码:
#include <iostream> #include <fstream> #include <string> #include <chrono> #include <thread> // 辅助函数:读取CPU总时间和空闲时间 bool read_cpu_times(unsigned long long& total_time, unsigned long long& idle_time) { std::ifstream stat("/proc/stat"); if (!stat.is_open()) { std::cerr << "Failed to open /proc/stat" << std::endl; return false; } std::string cpu; unsigned long long user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice; stat >> cpu >> user >> nice >> system >> idle >> iowait >> irq >> softirq >> steal >> guest >> guest_nice; if (cpu != "cpu") { std::cerr << "Failed to find cpu line in /proc/stat" << std::endl; return false; } // 总时间是所有CPU状态的总和,空闲时间包括idle和iowait total_time = user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice; idle_time = idle + iowait; return true; } double get_system_cpu_usage() { unsigned long long total1, idle1; if (!read_cpu_times(total1, idle1)) { return -1.0; } // 等待1秒,获取这段时间内的CPU状态变化 std::this_thread::sleep_for(std::chrono::seconds(1)); unsigned long long total2, idle2; if (!read_cpu_times(total2, idle2)) { return -1.0; } unsigned long long total_diff = total2 - total1; unsigned long long idle_diff = idle2 - idle1; if (total_diff == 0) { return 0.0; } // 计算使用率:(总时间变化 - 空闲时间变化) / 总时间变化 * 100% return (static_cast<double>(total_diff - idle_diff) / total_diff) * 100.0; } int main() { double usage = get_system_cpu_usage(); if (usage >= 0) { std::cout << "System CPU Usage: " << usage << "%" << std::endl; } return 0; }
补充说明
- 编译方式:直接用g编译即可,指定C11标准:
g++ -std=c++11 memory_monitor.cpp -o memory_monitor,CPU监控程序同理。 - 持续监控:如果需要实时追踪系统状态,可以把这两个函数放到循环里定期调用,调整sleep的时间就能控制采样频率。
- 权限问题:
/proc下的文件对所有用户可读,不需要root权限就能读取。
内容的提问来源于stack exchange,提问作者Grigor Gevorgyan
相关产品推荐
相关产品推荐

