获取操作系统CPU及内存使用信息的另一种方法

我们可以使用两种方法来获取CPU及内存信息:使用Linux自带的top工具,或者直接读取文件系统中目录/proc/{进程ID}/stat。那么在这里我要介绍另一种获取这些信息的方法,无论是系统全局的还是具体到某个进程都适用。获取这种方法更容易掌握。我们将使用libgtop库来实现。接下来就开始介绍libgtop并使用它来编写一个简单的示例工具。

首先需在系统中安装libgtop库,如未安装可以在网上搜索并下载该库。值得注意的是libgtop-2.0依赖于glib-2.0库,因此需确保glib-2.0库已经正确安装。在装好libgtop-2.0之后,可以使用其包含的头文件来编程了。这里就是一个监控CPU及内存使用率的例子:

#include <stdio.h>
#include <glibtop.h>
#include <glibtop/cpu.h>
#include <glibtop/mem.h>
#include <glibtop/proctime.h>
#include <glibtop/procmem.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
 glibtop_cpu cpu_begin,cpu_end;                                 /
 glibtop_proc_time proctime_begin,proctime_end;                 ///Declare the CPU info and
 glibtop_mem memory;                                            ///memory info struct
 glibtop_proc_mem procmem;                                      ///

 int du,dn,ds,di;
 int dpu,dps;
 float cpurate,memrate;
 int pid = fork();                                              //create a process to run the specified program
 if(pid ==0)                                                    //the child process
 {
  execvp(argv[1],&argv[1]);
 }
 else                                                           //the parent process
 {
  while(1)
  {
    glibtop_get_cpu (&cpu_begin);
    glibtop_get_proc_time(&proctime_begin,pid);
    sleep(1);                                                   //the interval time is 1 second
    glibtop_get_cpu (&cpu_end);
    glibtop_get_proc_time(&proctime_end,pid);
    du = cpu_end.user - cpu_begin.user;
    dn = cpu_end.nice - cpu_begin.nice;
    ds = cpu_end.sys - cpu_begin.sys;
    di = cpu_end.idle - cpu_begin.idle;
    dpu = proctime_end.utime -  proctime_begin.utime;
    dps = proctime_end.stime - proctime_begin.stime;
    cpurate =100.0* (dpu+dps)/((du+dn+ds+di)*1.0);              //calculate the CPU usage
    glibtop_get_mem(&memory);
    glibtop_get_proc_mem(&procmem,pid);
    memrate = 100*(procmem.resident) /((memory.total)*1.0);     // calculate the memory usage

    fprintf(stderr,"du:%d, dn:%d, ds:%d, di:%d, ",du,dn,ds,di);
    fprintf(stderr,"dpu:%d, dps:%d ",dpu,dps);
    fprintf(stderr,"cpu rate is: %0.3f%   ",cpurate);
    fprintf(stderr,"mem rate is: %0.3f%\n",memrate);
  }
 }
 Return 0;
}



然后使用下面命令编译程序:

gcc procmonitor.c -o procmonitor -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libgtop-2.0 -lgtop-2.0 -lglib-2.0

得到可执行程序procmonitor,然后通过命令行参数传递启动该程序,如:

./procmonitor mplayer movie.mkv

播放器mplayer将启动并播放文件movie.mkv,同时CPU及内存信息也将在命令行中显示出来。也可以使用重定向'>'符号来将这些信息打印到文件中,如下所示:

./procmonitor mplayer movie.mkv  2>infofile.txt

注意:

1、构建本程序时需同时指定glib-2.0及libgtop-2.0库。

2、所有涉及的结构体及函数原型都可在/usr/include/libgtop-2.0中找到。

3、计算内存使用率的公式为:

(memory of resident) ÷(memory of total).

CPU使用率计算公式:

(user_mode CPU time + kernel_mode CPU time) ÷(total CPU time).

与top命令的结果相比较,内存使用率基本相同,但CPU使用率百分比完全不同。那是因为我们测试的目标机有多个CPU所致。因此top命令所计算的CPU使用率是指进程所使用的该CPU使用率,而我们程序所得结果是指所有CPU的平均使用率。当然我们也可以得到与top相同的结果,这就需要使用其他结构体成员(如:glibtop_proc_time中的 xcpu_utime [GLIBTOP_NCPU] and xcpu_stime[GLIBTOP_NCPU])采用同样计算方法即可。

因此使用libgtop库,我们可以更简便更灵活的获取CPU及内存信息。

CPU%(top)

mem%(top)

cpuusage%( procmonitor)

Memusage(procmonitor)

process

16.9

0.7

4.26

0.7

2:32.41 mplayer

17.6

0.7

4.354

0.7

2:32.94 mplayer

16.9

0.7

4.341

0.7

2:33.45 mplayer

17.0

0.7

4.218

0.7

2:33.96 mplayer

17.9

0.7

4.281

0.7

2:34.50 mplayer

17.3

0.7

4.401

0.7

2:35.02 mplayer

7.3

0.7

4.233

0.7

2:35.54 mplayer

16.9

0.7

4.285

0.7

2:36.05 mplayer

17.6

0.7

4.38

0.7

2:36.58 mplayer

17.3

0.7

4.324

0.7

2:37.10 mplayer

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值