Linux/C环境下如何通过PID获取进程可用内存并存储到变量
获取进程内存使用情况的两种实现方式
在Linux环境下,你可以通过读取/proc文件系统的相关文件来获取进程内存数据,无需调用外部终端命令,适合在C程序内直接处理。以下是两种常用实现:
方法一:读取/proc/[pid]/statm
/proc/[pid]/statm文件以空格分隔的数字形式提供内存统计,每个字段的单位是页面大小(可通过sysconf(_SC_PAGESIZE)获取)。
代码示例
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t pid = getpid(); char statm_path[64]; snprintf(statm_path, sizeof(statm_path), "/proc/%d/statm", pid); FILE *fp = fopen(statm_path, "r"); if (!fp) { perror("Failed to open statm file"); return 1; } // statm字段:总内存、常驻内存、共享内存、代码段、数据段等 unsigned long total_pages, resident_pages, shared_pages, text_pages, lib_pages, data_pages, dt_pages; fscanf(fp, "%lu %lu %lu %lu %lu %lu %lu", &total_pages, &resident_pages, &shared_pages, &text_pages, &lib_pages, &data_pages, &dt_pages); fclose(fp); // 转换为字节 long page_size = sysconf(_SC_PAGESIZE); unsigned long total_mem = total_pages * page_size; unsigned long resident_mem = resident_pages * page_size; unsigned long shared_mem = shared_pages * page_size; // 可将这些值存入变量用于后续计算 printf("总内存: %lu bytes\n", total_mem); printf("常驻内存(RSS): %lu bytes\n", resident_mem); printf("共享内存: %lu bytes\n", shared_mem); return 0; }
字段说明
total_pages: 进程使用的总页面数(虚拟内存大小)resident_pages: 常驻内存页面数(RSS,实际物理内存占用)shared_pages: 共享内存页面数(比如与其他进程共享的库内存)
方法二:读取/proc/[pid]/status
/proc/[pid]/status文件以键值对形式展示更易读的内存信息,比如VmRSS(常驻内存)、VmSize(虚拟内存)等字段,单位通常是KB。
代码示例
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <string.h> int main() { pid_t pid = getpid(); char status_path[64]; snprintf(status_path, sizeof(status_path), "/proc/%d/status", pid); FILE *fp = fopen(status_path, "r"); if (!fp) { perror("Failed to open status file"); return 1; } char line[256]; unsigned long vm_rss_kb = 0; unsigned long vm_size_kb = 0; // 逐行读取,匹配目标字段 while (fgets(line, sizeof(line), fp)) { if (strncmp(line, "VmRSS:", 6) == 0) { sscanf(line, "VmRSS: %lu kB", &vm_rss_kb); } else if (strncmp(line, "VmSize:", 7) == 0) { sscanf(line, "VmSize: %lu kB", &vm_size_kb); } // 可根据需求添加其他字段,如VmData、VmExe等 } fclose(fp); // 转换为字节(可选) unsigned long vm_rss_bytes = vm_rss_kb * 1024; unsigned long vm_size_bytes = vm_size_kb * 1024; printf("虚拟内存(VmSize): %lu bytes\n", vm_size_bytes); printf("常驻内存(VmRSS): %lu bytes\n", vm_rss_bytes); return 0; }
常用字段说明
VmSize: 进程的虚拟内存总大小VmRSS: 进程实际占用的物理内存(常驻集大小)VmData: 数据段内存大小(堆+栈)VmExe: 可执行代码段内存大小
注意事项
- 这两种方法仅适用于Linux系统,
/proc是Linux特有的虚拟文件系统 - 读取
/proc文件不需要特殊权限(只要是进程的所有者,或者有足够权限) - 页面大小可通过
sysconf(_SC_PAGESIZE)动态获取,避免硬编码4096(不同系统可能不同) - 如果需要监控其他进程的内存,只需替换
pid为目标进程ID即可
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

