您的位置:首页 > 其它

创建属于自己的内核PROC文件实现链表搜索并打印iscsi信息

2016-11-14 11:12 405 查看
有关内核proc文件的函数目录都在“linux/proc_fs.h”下面。创建一个属于自己的内核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 modules list
相关文章推荐