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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:06:08