博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核模块遍历进程和任务队列保存到proc文件中
阅读量:6378 次
发布时间:2019-06-23

本文共 3235 字,大约阅读时间需要 10 分钟。

版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45766609

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏)。

下面是我的内核模块的实现部分:

/*************************************************************   使用内核模块从当前进程开始先前遍历,知道找到第一个进程为止  **   并将遍历的结果保存到proc文件中                           ************************************************************/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MODULE_NAME "MyProcess"#define MYDATA_LEN 10000//放用户空间的数据struct my_proc_data{ char value[MYDATA_LEN];};struct my_proc_data mydata,fathers_data;//proc结构变量struct proc_dir_entry *example_dir;//存放任务队列struct proc_dir_entry *date_file;//存放父进程struct proc_dir_entry *father_file;static int param;module_param(param,int,0644);//读文件驱动函数static int proc_read(char *page,char **start,off_t off,int count,int *eof,void *data){ int len; struct my_proc_data *mydatap = (struct my_poroc_data *)data; len += sprintf(page,"%s",mydatap->value); return len;}//写文件驱动函数static int proc_write(struct file *file,const char *buffer,unsigned long count,void *data){ int len; struct my_proc_data *mydatap = (struct my_proc_data *)data; if(count > MYDATA_LEN) len = MYDATA_LEN; else len = count; if(copy_from_user(mydatap->value,buffer,len)){ return -EFAULT; } mydatap->value[len-1] = '\0'; return len;}//加载模块int init_module(void){ //创建dir文件夹 example_dir = (struct proc_dir_entry *)proc_mkdir("mydir",0); if(example_dir == 0){ printk("mkdir fail!!\n"); return -1; } //创建文件 date_file = (struct proc_dir_entry *)create_proc_entry("myfile",0666,example_dir); if(date_file == 0){ printk("create file fails!!\n"); return -ENOMEM; } //创建文件 father_file = (struct proc_dir_entry *)create_proc_entry("fathers",0666,example_dir); if(father_file == 0){ printk("create file fails!!\n"); return -ENOMEM; } struct task_struct *pos = get_current(); for_each_process(pos){ strcat(mydata.value,pos->comm); strcat(mydata.value,"\n"); } date_file->data = &mydata; date_file->read_proc = &proc_read; date_file->write_proc = &proc_write; date_file->owner = THIS_MODULE; pos = get_current(); while(pos != &init_task){ strcat(fathers_data.value,pos->parent->comm); strcat(fathers_data.value,"=>"); strcat(fathers_data.value,pos->comm); strcat(fathers_data.value,"\n"); pos = pos->parent; } father_file->data = &fathers_data; father_file->read_proc = &proc_read; father_file->write_proc = &proc_write; father_file->owner = THIS_MODULE; return 0;}//卸载模块void cleanup_module(void){ remove_proc_entry("myfile",example_dir); remove_proc_entry("fathers",example_dir); remove_proc_entry("mydir",NULL); printk("GoodBye!!\n");}MODULE_LICENSE("GPL");MODULE_DESCRIPTION("This is the description");MODULE_AUTHOR("bobo");

其中的Makefile文件为:

obj-m := process.oall:    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modulesclean:    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

现在我们使用make命令编译,编译完成时候,我们动态加载内核模块

sudo insmod process.ko

然后我们查看proc文档下我们创建的文件:

cat /proc/mydir/myfile

运行后的效果为:

下面我们查看一下所有的父进程的文件:

cat /proc/mydir/fathers

运行效果为:

你可能感兴趣的文章
为npm配置taobao源
查看>>
zookeeper初探三 java客户端连接
查看>>
管理邮件用户
查看>>
如何查看linux版本
查看>>
导出DC数据以便以介质方式安装另一台域控制器
查看>>
Hibernate学习(八):检索方式
查看>>
RIPv1 PK RIPv2
查看>>
基于WorsPress+Xampp搭建博客
查看>>
javascript的一些基本概念
查看>>
关于Tomcat上请求的编解码问题
查看>>
WPF“动画序列”框架的初步研究与实现(附源码)
查看>>
Windows Server 2008 多元密码策略配置
查看>>
.NET中的泛型和Java泛型中的类型擦除
查看>>
白利用的集大成者:新型远控木马上演移形换影大法
查看>>
2017必备的八款最佳反勒索软件工具
查看>>
从Effective Java总结一些有助安卓开发的建议
查看>>
以一当十的程序员不是传说
查看>>
Vizinex RFID 和Brady SmartID推出航空标签
查看>>
Facebook 否认趋势话题存在政治偏见,但将做出调整
查看>>
云纵发布“纵横客“ 新一代互联网CRM开启餐饮行业营销新模式
查看>>