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());
}
Linux系统下输出某进程内存占用信息的c程序实现的更多相关文章
- linux系统下查看某个进程内存使用量
- 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?
1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...
- linux系统下实时监控进程以及定位杀死挂起的进程
一.实时监测进程 [root@instance-3lm099to ~]# top top - :: up days, min, users, load average: 0.01, 0.05, 0.0 ...
- Linux系统下的CPU、内存、IO、网络的压力测试
本文转载自:小豆芽博客 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH ...
- win8以上系统查看iis网站进程内存占用情况
由于win8以上系统在任务管理器中已经屏蔽了具体的IIS网站的进程,在进程以及详细中无法区分是哪个站点了,所以我们需要先知道各站点对应的进程pid,然后再到任务管理器中根据具体的pid查看资源占用情况 ...
- 查找linux系统下的端口被占用进程的两种方法 【转】
在linux下开发时,你的软件可能要使用某一个端口,或者想查找某一个端口是否被占用.需要怎么做呢??这的确是一个比较烦恼的问题,我也此为这个苦恼过.但是通过查找man手册,还是同事的交流.总结出来两种 ...
- 监控Linux系统所选的服务所占进程内存占用
[代码] #!/bin/bash #程序功能描述: # 监控系统所选的服务所占进程内存占用 #作者:孤舟点点 #版本:1.0 #创建时间:-- :: PATH=/bin:/sbin:/usr/bin: ...
- window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题
1.应用场景 在Windows或者linux操作系统中,我们在启动一个tomcat服务器时,经常会发现8080端口已经被占用的错误,而我们又不知道如何停止这个tomcat服务器. 2.window环境 ...
- Linux查看进程内存占用及内存使用情况
LINUX进程内存占用查看方法(1)top可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令:$ top ...
随机推荐
- 多线程映射工具——ThreadLocal
ThreadLocal相当于一个Map<Thread, T>,各线程使用自己的线程对象Thread.currentThread()作为键存取数据,但ThreadLocal实际上是一个包装了 ...
- SharePoint 2103 Check user permission on list
一.需求: check user 对SharePoint list 的permission 代码如下: private static string GetListPermission(SPList l ...
- Android面试一天一题(1Day)
写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...
- 你真的会玩SQL吗?和平大使 内连接、外连接
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- WebUtils-网络请求工具类
网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...
- Bonobo创建新库出错,解决方案
创建新库出错如下: Native library pre-loader is trying to load native SQLite library "D:\wwwroot\localho ...
- AOP的实现原理
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
- 微信js框架第二篇(创建完整界面布局)
接着昨天的继续谈关于微信新出的这个js框架,今天主要谈一个页面的创建到布局的详细步骤. 一.创建一个完整页面 页面你可以创建在项目的任何节点,只要你在入口文件正确引入创建该页面的路径就可使 ...
- (转)解决 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
下面操作默认在安装Oralce数据库的服务器上运行. 1)确保Oracle 基本服务都已启动 OracleDBConsoleorcl OracleOraDb11g_home1TNSListener O ...