创建属于自己的内核PROC文件实现链表搜索并打印iscsi信息
2016-11-14 11:12
405 查看
有关内核proc文件的函数目录都在“linux/proc_fs.h”下面。创建一个属于自己的内核proc文件的需要的是加载一个完整的内核模块,所以主要的是以下。
上面这个函数就是在“/proc/”下再创建一个目录iscsi_log的目录,并且在这个目录下创建一个initiator_target的文件,并规定这个文件的权限。最后一个参数是对这个文件的操作如下:
对modules_open的函数:
在次一个PROC文件的创建基本完成。在“/proc”下你会看到"/iscsi_log/"的目录,该目录下有个inittiator_target的文件。接下来就是向文件中加入内容的时候,调用:
遍历链表找到initiator和target的名字以及登录ip,存入传入的buff.
退出函数:
static void proc_exit(void)
{
remove_proc_entry("initiator_target",Log_dir);
}
对于模块加载的时候不可缺的makefile也一并附上:
ifneq ($(KERNELRELEASE),)
obj-m :=proc_file.o
else
KERNELDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
endif
clean:
rm -f *.o*.ko*.mod.c.proc_file*
对于这次的收获就是,尝试写了一个完整的内核模块,学习了proc文件的相关,学习了链表的遍历。。路还很长。。。。
static int tl_proc_init(void) { Log_dir=proc_mkdir("iscsi_log",NULL); proc_create("initiator_target",S_IRUSR|S_IRGRP|S_IROTH,Log_dir,&File_ops_our_proc_file); return 0; }
上面这个函数就是在“/proc/”下再创建一个目录iscsi_log的目录,并且在这个目录下创建一个initiator_target的文件,并规定这个文件的权限。最后一个参数是对这个文件的操作如下:
static const struct file_operations File_ops_our_proc_file= { .open = modules_open, .read =seq_read, };
对modules_open的函数:
static int modules_open(struct inode *node,struct file *file) { return single_open(file,tl_initiator_name_show,NULL); }
在次一个PROC文件的创建基本完成。在“/proc”下你会看到"/iscsi_log/"的目录,该目录下有个inittiator_target的文件。接下来就是向文件中加入内容的时候,调用:
static int tl_initiator_name_show(struct seq_file *file,void *v ) { char buff[2048]; int len=0 len=initiator_get_name(buff); seq_printf(file,"%s",buff); return 0; }
int initiator_get_name(char *buff) { struct list_head *list_op; struct iscsi_thread_set *ts; struct iscsi_sess_ops *sess_ops; char str_buff[256]; int len=0; char head[]="initiator\t\t\ttarget\t\t\tlogin_ip\t\t\n"; len=strlen(head); memcpy(buff,head,len); list_for_each(list_op,&active_ts_list) { ts=list_entry(list_op,struct iscsi_thread_set,ts_list); memset(str_buff, 0, 256); if(!ts) return 0; // sprintf(str_buff,"I_T_NEXUE\ninitator:%s\ntarget:%s\nlogin_ip:%s\n",ts->conn->sess->sess_ops->InitiatorName,ts->conn->sess->sess_ops->TargetName,ts->conn->login_ip); sprintf(str_buff,"%s\t:%s\t:%s\t\n",ts->conn->sess->sess_ops->InitiatorName,ts->conn->sess->sess_ops->TargetName,ts->conn->login_ip); memcpy(buff+len,str_buff,strlen(str_buff)); len+=strlen(str_buff); } buff[len-1] = '\0'; return strlen(buff); }
遍历链表找到initiator和target的名字以及登录ip,存入传入的buff.
退出函数:
static void proc_exit(void)
{
remove_proc_entry("initiator_target",Log_dir);
}
对于模块加载的时候不可缺的makefile也一并附上:
ifneq ($(KERNELRELEASE),)
obj-m :=proc_file.o
else
KERNELDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
endif
clean:
rm -f *.o*.ko*.mod.c.proc_file*
对于这次的收获就是,尝试写了一个完整的内核模块,学习了proc文件的相关,学习了链表的遍历。。路还很长。。。。
相关文章推荐
- 实现单链表创建、插入、删除、打印功能
- 浅析proc文件系统的创建和create_proc_read_entry函数的具体实现
- 浅析proc文件系统的创建和create_proc_read_entry函数的具体实现
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- linux内核——创建自己的/proc文件——processinfo
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 使用proc文件映射的方式实现用户态跟内核态的数据交互
- linux 使用/proc文件系统 实现用户空间与内核模块之间通信
- [002]链表笔记--编程实现一个单链表的创建/测长/打印
- 实现单向循环链表的创建、测长、打印、插入、删除及逆置
- Linux内核学习笔记之seq_file接口创建可读写proc文件
- 树的基本结构,以及利用链表实现树的各项操作(创建、添加/删除/打印树节点、销毁等等)
- 数组的链表实现:创建(头插/尾插)、打印、删除、插入
- 实现双向链表的创建、测长、打印、插入、删除
- 采用多线程和生产者消费者模式来实现对于一个目录以及所有子目录下的文件内容的搜索,打印出包含指定关键字的行.
- 浅析proc文件系统的创建和create_proc_read_entry函数的具体实现
- 浅析proc文件系统的创建和create_proc_read_entry函数的具体实现
- 我的内核学习笔记5:proc目录文件创建及读写
- asp.net实现创建映射,发送文件,删除映射
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)