Linux系统下利用C程序输出某进程的内存占用信息
作者:daisy 发布时间:2023-11-03 03:39:27
标签:linux,c程序,内存占用
前言
大家应该都遇到过一种情况,在实际工作中有时需要程序打印出某个进程的内存占用情况以作参考, 下面介绍一种通过Linux下的伪文件系统 /proc 计算某进程内存占用的程序实现方法.下面话不多说了,来一起看看详细的介绍吧。
实现分析
首先, 为什么会有所谓的 伪文件 呢. Linux系统的文件类型大致可分为三类: 普通文件, 目录文件和伪文件. 伪文件不是用来存储数据的, 因此这些文件不占用磁盘空间, 只是存在于内存中. /proc 让你可以与内核内部数据进行交互, 获取有关进程的有用信息.
下面主要介绍一下 /proc 下面的四个文件: /proc/stat
, /proc/meminfo
, /proc/<pid>/stat
, /proc/<pid>/status
.
/proc/stat 存放系统的cpu时间, 该文件包含了所有cpu活动的信息.
cpu 72389 2891 16811 1148664 31374 0 67 0 0 0
cpu0 17608 452 3786 288899 6210 0 30 0 0 0
cpu1 18724 926 4598 285844 8911 0 15 0 0 0
cpu2 16803 658 3726 288710 7220 0 7 0 0 0
cpu3 19254 855 4700 285209 9032 0 13 0 0 0
...
...
...
/proc/meminfo
存放系统的内存信息, 通过文件中各个变量的名字便可知其代表的信息.
MemTotal: 4046236 kB
MemFree: 1054440 kB
MemAvailable: 2460060 kB
Buffers: 359688 kB
Cached: 1158056 kB
SwapCached: 0 kB
Active: 2020096 kB
Inactive: 677948 kB
Active(anon): 1181376 kB
...
...
...
/proc/<pid>/stat
存放某个进程的cpu信息
2476 (firefox) S 1773 1910 1910 0 -1 4210688 3413511 1712 757 1 45466 4629 2 7 20 0 57 0 20381 1774743552 150565 18446744073709551615 94844693012480 94844693126372 140732961864784 140732961858304 139747170914269 0 0 4096 33572079 0 0 0 17 2 0 0 1178 0 0 94844695226592 94844695228536 94844713955328 140732961867643 140732961867668 140732961867668 140732961869791 0
/proc/<pid>/status
存放某个进程的cpu信息以及一些综合信息
Name: firefox
State: S (sleeping)
Tgid: 2476
Ngid: 0
Pid: 2476
PPid: 1773
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 108 124 1000
NStgid: 2476
NSpid: 2476
NSpgid: 1910
NSsid: 1910
VmPeak: 1722812 kB
VmSize: 1690920 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 684048 kB
VmRSS: 600324 kB
VmData: 993040 kB
VmStk: 192 kB
...
...
...
以上数据都可以通过文件读取的方式来获取. 根据自己实验的需要可以计算相应的数据, 比如 pmem = VmRSS/MemTotal*100
等等.
示例代码
下面只是贴出一个简单的获取某进程当前时刻所占用的实际内存的c代码实现例子.
//get_mem.h
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#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 get_rmem(pid_t p)
{
return get_phy_mem(p);
}
int get_total_mem()
{
const char* file = "/proc/meminfo";//文件名
FILE *fd; //定义文件指针fd
char line_buff[256] = {0}; //读取行的缓冲区
fd = fopen (file, "r"); //以R读的方式打开文件再赋给指针fd
//获取memtotal:总内存占用大小
int i;
char name[32];//存放项目名称
int memtotal;//存放内存峰值大小
char*ret = fgets (line_buff, sizeof(line_buff), fd);//读取memtotal这一行的数据,memtotal在第1行
sscanf (line_buff, "%s %d", name,&memtotal);
fprintf (stderr, "====%s:%d====\n", name,memtotal);
fclose(fd); //关闭文件fd
return memtotal;
}
测试文件:
#include "get_mem.h"
int main()
{
int list[1024];
for(int i = 0; i < 1024; i++)
list[i] = i;
int mem = get_rmem(getpid());
}
来源:http://www.linuxidc.com/Linux/2017-12/149850.htm


猜你喜欢
- 为了更好的实现用户在社区论坛的互动功能,官方开发团队在Discuz! 7.1版本引入了漫游应用插件机制,丰富了社区论坛系统互动应用效果。伴随
- 安装CentOS7这里我们要安装CentOS7 64位,所以选择CentOS7 64位配置我们点击存储后,vmware会自动帮我们创建一个虚
- 先说说的自己情况。和许多从学校里出来的学生一样,毕业后的迷惘一度让我很悲观,学校可以学到很多知识,但我学到的东西却不足以在这个社会立足。经过
- 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。可以用该命令实现DOS下的 diskcopy命令的作用。先用
- 单价降低对于很多人来说已经是一个不争的事实,尽管我没有明显地感觉到。对于单价低的判断标准是不一样的,有人说自己目前均价只有0.5$或0.1$
- 参考了网络上很多关于WIN2003的安全设置以及自己动手做了一些实践,综合了这些安全设置文章整理而成,希望对大家有所帮助,另外里面有不足之处
- asp之家注:上周末在家看电视时遥控正好转到湖南卫视,听到一个人在唱周杰伦的《霍元甲》,立刻停止了转台,可惜只听到最后的一小段,唱得还不错(
- 一。相对大小的字号在英文页面中,固定字号被称为“ frozen font sizes”,使用固定大小
- GoDaddy主机用户在购买、建立、管理托管帐户过程中,创建了多个帐户来登陆与其托管网站有关的不同界面。每个帐户都由一个用户名及密码来保护。
- 本文讨论的是在新硬盘上安装Windows2003,如硬盘已有数据,请先备份数据以防造成不必要的无可挽回的损失。系统要求-----对基于x86
- 说在前面的话:只适用于完全没有后端知识的纯小白,因为我就是。最开始了解Linux文件系统的目录结构,之后在学习Linux命令行,是比较推荐的
- 启用并配置文件服务Windows Server 2003的管理工具中有一项功能叫做“管理您的服务器”,启动该工具之后,可以看到当前服务器上启
- 10月30日消息,UCWEB董事长近日在博客上表示,创业者必须牢记两个关键词:“专注”和“极致”。雷军表示,集中所有资源做一件事情,才能把这
- lighttpd(发音为lighty)是一套开放源代码的网页服务器,以BSD许可证发布。相较于其他的网页服务器,lighttpd仅需少量的存
- 在做seo的时候,我们首选要确定坐哪几个关键词,一般主推3个关键词差不多,剩下的关键词作为辅助关键词,或称之为长尾关键词。说到关键词的选择是
- CMS系统促进着Web2.0的发展,根据权威机构的调查,一个网站80%左右的流量都是来源于搜索引擎的,所以一个网站到底做的好与坏不在于网站建
- 本文详细介绍Redis单机单实例安装与配置,服务及开机自启动。(以下配置基于CentOS release 6.5 Final, redis版
- 1、基于ip地址的虚拟主机Listen 80<VirtualHost 172.20.30.40> &nbs
- 1.安装vsftpd服务器vsftpd是目前Linux最好的FTP服务器工具之一,其中的vs就是“Very Secure”(很安全)的缩写,
- 常用字符集编码的概要特性(一)搞清常用编码特性是解决字符集编码问题的基础。字符集编码的识别与转换、分析各种乱码产生的原因、编程操作各种编码字