linux下使用C语言程序获取某进程占用内存

linux下使用C语言程序获取某进程占用内存

1、原理

linux下的/proc/进程号/status文件中,有该进程的内存信息

例如

lpp@DESKTOP-MSTJE3D:/proc/1$ cat status
Name:   init
Umask:  0000
State:  S (sleeping)
Tgid:   1
Ngid:   0
Pid:    1
PPid:   0
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 128
Groups:
NStgid: 1
NSpid:  1
NSpgid: 0
NSsid:  0
VmPeak:     1252 kB
VmSize:      904 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:       792 kB
VmRSS:       528 kB
RssAnon:              60 kB
RssFile:             468 kB
RssShmem:              0 kB
VmData:      156 kB
VmStk:       132 kB
VmExe:       444 kB
VmLib:         4 kB
VmPTE:        40 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
CoreDumping:    0
THP_enabled:    1
Threads:        2
SigQ:   0/49209
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: fffffffc7ff9fefe
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 000001ffffffffff
CapEff: 000001ffffffffff
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
NoNewPrivs:     0
Seccomp:        0
Seccomp_filters:        0
Speculation_Store_Bypass:       thread vulnerable
Cpus_allowed:   ff
Cpus_allowed_list:      0-7
Mems_allowed:   1
Mems_allowed_list:      0
voluntary_ctxt_switches:        164
nonvoluntary_ctxt_switches:     0

其中上述信息中

VmPeak: 表示进程所占用最大虚拟内存大小
VmSize: 表示进程当前虚拟内存大小
VmLck: 表示被锁定的内存大小
VmHWM: 表示进程所占用物理内存的峰值
VmRSS: 表示进程当前占用物理内存的大小(与procrank中的RSS)
VmData: 表示进程数据段的大小
VmStk: 表示进程堆栈段的大小
VmExe: 表示进程代码的大小
VmLib: 表示进程所使用共享库的大小
VmPTE: 表示进程页表项的大小

因此要获取某个进程的内存,只需要读取其对应文件的VmRSS字段即可。

2、C语言代码

#include 
#include 
#include 
#include 
#define VMRSS_LINE 21 // VMRSS所在行, 注:根据不同的系统,位置可能有所区别.
#define pid_t int

int get_phy_mem(const pid_t p)
{
    char file[64] = {0};       //文件名
    FILE *fd;                  //定义文件指针fd
    char line_buff[256] = {0}; //读取行的缓冲区
    sprintf(file, "/proc/%d/status", p);
    fprintf(stderr, "current pid:%d\n", p);
    fd = fopen(file, "r"); //以R读的方式打开文件再赋给指针fd
    //获取vmrss:实际物理内存占用
    int i;
    char name[32]; //存放项目名称
    int vmrss;     //存放内存
    //读取VmRSS这一行的数据
    for (i = 0; i < VMRSS_LINE - 1; i++)
    {
        char *ret = fgets(line_buff, sizeof(line_buff), fd);
    }
    char *ret1 = fgets(line_buff, sizeof(line_buff), fd);
    sscanf(line_buff, "%s %d", name, &vmrss);
    fprintf(stderr, "====%s:%d====\n", name, vmrss);
    fclose(fd); //关闭文件fd
    return vmrss;
}

int main()
{
    int pid_number = getppid(); //获取当前进程号
    get_phy_mem(pid_number);
    return 0;
}

3、程序运行结果

在这里插入图片描述

当前程序pid号为3625,内存大小5072KB

4、参考文章

http://blog.cvosrobot.com/?post=541 内存管理统计的一些知识

https://blog.csdn.net/weixin_38606457/article/details/125392137 查看某个进程占用空间大小 VmHWM VmRSS终极总结
https://www.nhooo.com/note/qag46g.html Linux系统下利用C程序输出某进程的内存占用信息

你可能感兴趣的:(linux,c语言)