c 获取linux内存大小
- 行业动态
- 2025-02-19
- 2
bash,grep MemTotal /proc/meminfo,
“这条命令会显示系统的总
内存大小(以 KB 为单位)。
在Linux系统中,获取内存大小是一项常见的任务,无论是对于系统管理员进行系统监控和维护,还是对于开发人员优化程序性能都非常重要,下面将介绍几种在C语言中获取Linux内存大小的方法:
1、使用sysinfo
系统调用
原理:通过包含<sys/sysinfo.h>
头文件并调用sysinfo
函数,可以获取系统的内存信息,该函数会填充一个struct sysinfo
结构体,其中包含了总内存和可用内存等信息。
示例代码
#include <stdio.h> #include <sys/sysinfo.h> int main() { struct sysinfo si; sysinfo(&si); printf("Totalram: %lu MB ", si.totalram / 1024 / 1024); printf("Freeram: %lu MB ", si.freeram / 1024 / 1024); return 0; }
解释:上述代码中,首先定义了一个struct sysinfo
类型的变量si
,然后调用sysinfo(&si)
函数获取系统信息并存储到si
中,接着通过si.totalram
和si.freeram
获取总内存和可用内存的大小,并将其从字节转换为MB(除以1024两次)后打印出来。
2、读取/proc/meminfo
文件
原理:/proc/meminfo
是一个虚拟文件,包含了系统内存的详细信息,通过读取该文件并解析其中的内容,可以获取内存大小等相关信息。
示例代码
#include <stdio.h> #include <stdlib.h> int main() { FILE *file = fopen("/proc/meminfo", "r"); if (!file) { perror("Failed to open /proc/meminfo"); return EXIT_FAILURE; } char line[256]; unsigned long long total_memory = 0; unsigned long long free_memory = 0; while (fgets(line, sizeof(line), file)) { if (sscanf(line, "MemTotal: %llu kB", &total_memory) == 1) { continue; } if (sscanf(line, "MemFree: %llu kB", &free_memory) == 1) { continue; } } fclose(file); printf("Total physical memory: %llu MB ", total_memory / 1024); printf("Free physical memory: %llu MB ", free_memory / 1024); return 0; }
解释:上述代码中,先以只读方式打开/proc/meminfo
文件,如果文件打开失败,则打印错误信息并退出程序,然后定义一个字符数组line
用于存储文件中的每一行内容,以及两个无符号长长整型变量total_memory
和free_memory
用于存储总内存和可用内存的大小(单位为kB),接着使用while
循环和fgets
函数逐行读取文件内容,并通过sscanf
函数解析包含“MemTotal”和“MemFree”的行,将其对应的值存储到total_memory
和free_memory
中,最后关闭文件,并将内存大小从kB转换为MB后打印出来。
3、使用dmidecode
命令
原理:dmidecode
命令可以显示系统硬件的详细信息,包括内存信息,通过在C语言程序中调用该命令并捕获其输出,可以获取内存插槽的大小等信息。
示例代码
#include <stdio.h> #include <stdlib.h> int main() { system("sudo dmidecode -t memory > meminfo"); FILE *file = fopen("meminfo", "r"); if (!file) { perror("Failed to open meminfo"); return EXIT_FAILURE; } char line[256]; unsigned long long memory_size = 0; while (fgets(line, sizeof(line), file)) { if (strstr(line, "Size:")) { if (sscanf(line, "Size: %llu kB", &memory_size) == 1) { break; } } } fclose(file); printf("Memory size in slot: %llu MB ", memory_size / 1024); return 0; }
解释:上述代码中,首先使用system
函数调用sudo dmidecode -t memory
命令,并将其输出重定向到meminfo
文件中,然后以只读方式打开meminfo
文件,并定义相关变量用于存储内存大小信息,接着逐行读取文件内容,查找包含“Size:”的行,并通过sscanf
函数解析出内存大小(单位为kB),最后将其转换为MB并打印出来。
以下是两个相关问题及解答:
1、为什么在读取/proc/meminfo
文件时需要以超级用户权限运行?
答:一般情况下,读取/proc/meminfo
文件不需要超级用户权限,但如果在某些受限的环境中或者系统配置了特殊的权限限制,可能需要超级用户权限才能访问该文件,不过,为了确保程序的通用性和稳定性,建议在可能的情况下尽量以超级用户权限运行相关操作。
2、使用sysinfo
系统调用获取内存信息和使用/proc/meminfo
文件获取内存信息有什么区别?
答:sysinfo
系统调用是直接通过系统接口获取内存信息,效率相对较高,且获取的信息较为简洁明了,主要侧重于总内存和可用内存等关键信息,而读取/proc/meminfo
文件则是解析系统提供的详细内存信息文件,能够获取更全面的内存相关信息,但解析过程相对复杂一些,在实际使用中,可以根据具体需求选择合适的方法。
在C语言中获取Linux内存大小有多种方法,每种方法都有其特点和适用场景,开发者可以根据具体需求选择最适合的方法来实现对Linux内存大小的获取,以便更好地进行系统管理和程序优化等工作。