You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:43