Linux系统下利用C程序输出某进程的内存占用信息
前言
大家应该都遇到过一种情况,在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考,下面介绍一种通过Linux下的伪文件系统/proc计算某进程内存占用的程序实现方法.下面话不多说了,来一起看看详细的介绍吧。
实现分析
首先,为什么会有所谓的伪文件呢.Linux系统的文件类型大致可分为三类:普通文件,目录文件和伪文件.伪文件不是用来存储数据的,因此这些文件不占用磁盘空间,只是存在于内存中./proc让你可以与内核内部数据进行交互,获取有关进程的有用信息.
下面主要介绍一下/proc下面的四个文件:/proc/stat,/proc/meminfo,/proc/
/proc/stat存放系统的cpu时间,该文件包含了所有cpu活动的信息.
cpu72389289116811114866431374067000 cpu01760845237862888996210030000 cpu11872492645982858448911015000 cpu2168036583726288710722007000 cpu31925485547002852099032013000 ... ... ...
/proc/meminfo存放系统的内存信息,通过文件中各个变量的名字便可知其代表的信息.
MemTotal:4046236kB MemFree:1054440kB MemAvailable:2460060kB Buffers:359688kB Cached:1158056kB SwapCached:0kB Active:2020096kB Inactive:677948kB Active(anon):1181376kB ... ... ...
/proc/
2476(firefox)S1773191019100-142106883413511171275714546646292720057020381177474355215056518446744073709551615948446930124809484469312637214073296186478414073296185830413974717091426900409633572079000172001178009484469522659294844695228536948447139553281407329618676431407329618676681407329618676681407329618697910
/proc/
Name:firefox State:S(sleeping) Tgid:2476 Ngid:0 Pid:2476 PPid:1773 TracerPid:0 Uid:1000100010001000 Gid:1000100010001000 FDSize:256 Groups:4242730461081241000 NStgid:2476 NSpid:2476 NSpgid:1910 NSsid:1910 VmPeak:1722812kB VmSize:1690920kB VmLck:0kB VmPin:0kB VmHWM:684048kB VmRSS:600324kB VmData:993040kB VmStk:192kB ... ... ...
以上数据都可以通过文件读取的方式来获取.根据自己实验的需要可以计算相应的数据,比如pmem=VmRSS/MemTotal*100等等.
示例代码
下面只是贴出一个简单的获取某进程当前时刻所占用的实际内存的c代码实现例子.
//get_mem.h #include#include #include #include #include #defineVMRSS_LINE21//VMRSS所在行,注:根据不同的系统,位置可能有所区别. #definepid_tint intget_phy_mem(constpid_tp) { charfile[64]={0};//文件名 FILE*fd;//定义文件指针fd charline_buff[256]={0};//读取行的缓冲区 sprintf(file,"/proc/%d/status",p); fprintf(stderr,"currentpid:%d\n",p); fd=fopen(file,"r");//以R读的方式打开文件再赋给指针fd //获取vmrss:实际物理内存占用 inti; charname[32];//存放项目名称 intvmrss;//存放内存 //读取VmRSS这一行的数据 for(i=0;i 测试文件:
#include"get_mem.h" intmain() { intlist[1024]; for(inti=0;i<1024;i++) list[i]=i; intmem=get_rmem(getpid()); }总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。