大体上的思想就是通过 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