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

有关内核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文件的相关,学习了链表的遍历。。路还很长。。。。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值