Linux下通过加载内核计算CPU利用率以及内存利用率

大体上的思想就是通过 proc 文件查询,利用一个文件指针指到proc/stat,目录然后就可以查询相应的数据。
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
然后就是编码:
首先写一个 Makefile 文件:
找到系统内核的目录

ifneq ($(KERNELRELEASE),)

obj-m := cal.o

else

KDIR := /lib/modules/2.6.32-358.el6.i686/build
all:
    make -C $(KDIR) M=$(PWD) modules
clean:
    rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

核心代码:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/uaccess.h>
#include <linux/unistd.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("jiangtao zhang");
MODULE_DESCRIPTION("CALCULATE CPU Module");
MODULE_ALIAS("a simplest module");
struct file *fp = NULL;
static int __init hello_init()
{
    int i, cas;
    for(cas=0; cas<10; cas++){
        char buf[100];
        set_fs(KERNEL_DS);
        fp = filp_open("/proc/stat",O_RDONLY, 0);
        fp->f_op->read(fp, buf, 100, &fp->f_pos) ;
        if(*(int *)buf==0)
            printk(KERN_EMERG"over!\n");
        else{
            int len = 0;
            while(buf[len] != '\n')
                len++;
            //printk(KERN_EMERG"%d\n",len);
            int sum = 0 , tmp = 0, ans = 0,  cnt = 0;
            for(i=5; i<len; i++)
            {
                if(cnt == 3)
                    ans = tmp;
                if(buf[i]==' ' || buf[i]=='\n')
                {
                    sum += tmp;
                    tmp = 0;
                    cnt++;
                }
                else
                    tmp = tmp*10+(buf[i]-'0');
            }
            ans = (sum-ans);
            ans = ans * 1000;
            ans = ans / sum;
            tmp = ans % 10;
            ans = ans / 10;
            printk(KERN_EMERG"CPU: %d.%d%   ",ans,tmp);
        }
        filp_close(fp,0);
        fp = filp_open("/proc/meminfo",O_RDONLY, 0);//O_RDONLY: 只读
        fp->f_op->read(fp, buf, 100,&fp->f_pos) ;
        if(*(int *)buf==0)
            printk(KERN_EMERG"over!\n");
        else{
            int len = 40;
            int sum = 1028860, tmp = 0, ans = 0;
            for(; len<=60; len++) {
                if(buf[len]>='0' && buf[len]<='9')
                    ans = ans*10 + (buf[len]-'0');
            }
            ans = (sum-ans);
            ans = ans * 1000;
            ans = ans / sum;
            tmp = ans % 10;
            ans = ans / 10;
            printk(KERN_EMERG"MEMORY: %d.%d%\n",ans,tmp);
        }
        filp_close(fp,0);
        msleep(3000);//每隔3秒刷新
    }
    return 0;
}

static void __exit hello_exit()
{
    printk(KERN_EMERG"good bye!\n");
}
module_init(hello_init);
module_exit(hello_exit);

写完代码之后,直接 make ,生成一个 cal.ko 的文件。
然后加载模块: insmod cal.ko
出现相应的CPU利用率以及内存利用率
然后卸载模块: rmmod cal.ko

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值