c++如何通过解析/proc/meminfo获取系统实时内存状态并实时存入【实战】

浅磊酱_2011

浅磊酱_2011

2026-04-05

692人浏览

原创

直接读取/proc/meminfo是最轻量可靠的linux内存监控方式,通过open()+readline()获取毫秒级数据,用find()或sscanf()解析memtotal等关键字段,单位为kb,需注意memavailable兼容性及单位转换。

c++如何通过解析/proc/meminfo获取系统实时内存状态并实时存入【实战】

直接读取 /proc/meminfo 是最轻量、最可靠的 Linux 内存监控方式

Linux 下没有比直接解析 /proc/meminfo 更实时、更权威的用户态内存数据来源。它不依赖 libprocps 或 sysconf() 等抽象层,避免了采样延迟和统计口径差异(比如 MemAvailable 在内核 3.14+ 才引入,而 free 命令可能回退计算)。只要你的程序运行在 Linux 上且有读取权限,open() + readline() 就能拿到毫秒级新鲜的数据。

用 std::ifstream 逐行解析关键字段,别用正则或全文匹配

解析目标不是“完整复刻 free 输出”,而是提取你真正关心的几个字段:比如 MemTotal:、MemFree:、MemAvailable:、Buffers:、Cached:、SwapTotal:、SwapFree:。用 std::string::find() 或 sscanf() 比正则快一个数量级,也更稳定——/proc/meminfo 格式固定,没必要过度工程化。

示例核心逻辑:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
std::ifstream proc("/proc/meminfo");
std::string line;
long mem_total = 0, mem_free = 0, mem_avail = 0;
while (std::getline(proc, line)) {
    if (line.rfind("MemTotal:", 0) == 0) sscanf(line.c_str(), "MemTotal: %ld", &mem_total);
    else if (line.rfind("MemFree:", 0) == 0)  sscanf(line.c_str(), "MemFree: %ld", &mem_free);
    else if (line.rfind("MemAvailable:", 0) == 0) sscanf(line.c_str(), "MemAvailable: %ld", &mem_avail);
}
// 单位是 kB,如需字节 × 1024

实时存入要考虑刷新频率、线程安全与写入开销

频繁打开/关闭 /proc/meminfo(比如每 100ms)基本无压力,但若每次解析后都 fwrite() 到磁盘文件,I/O 会成为瓶颈。更合理的做法是:

  • 用 std::chrono::steady_clock 控制采样间隔(推荐 500ms–2s,太密无意义,/proc/meminfo 本身也不是纳秒级更新)
  • 内存数据先存入环形缓冲区或双缓冲 std::vector,由单独写线程批量落盘(避免主线程阻塞)
  • 写入格式选 CSV 或 JSON 行格式(jq 可直接处理),别用二进制——调试时打不开就废了
  • 注意 std::ofstream 默认不自动 flush,用 std::endl 或 .flush() 确保崩溃前数据不丢失

容易被忽略的坑:MemAvailable 不一定存在、单位混淆、进程自身 RSS 干扰判断

/proc/meminfo 的字段兼容性必须检查:

  • 内核 MemAvailable: 行不存在,需回退用 MemFree + Buffers + Cached - Shmem 估算(Shmem: 字段也要判空)
  • 所有数值单位是 kB,不是字节也不是 MB——乘错 1024 就差一个数量级
  • 不要把本进程的 /proc/self/statm 和系统级 /proc/meminfo 混为一谈;前者是进程虚拟内存映射,后者是全局物理内存状态
  • 如果程序以容器方式运行,/proc/meminfo 显示的是宿主机值,除非挂载了 cgroup v2 的 memory.current 接口

真实场景中,MemAvailable 的缺失和单位误读占内存监控误报的七成以上。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2035

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2982

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1016

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3379

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5819

3

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4609

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3729

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

426

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习