linux添加proc下文件

Linux内核学习笔记之seq_file接口创建可读写proc文件

测试方法:cat /proc/abc_proc

  1. /************************************************* 
  2.  使用seq_file接口实现可读写proc文件的例子 
  3.  适用于3.10以后的内核 
  4.  *************************************************/  
  5. #include <linux/module.h>  
  6. #include <linux/sched.h>  
  7. #include <linux/uaccess.h>  
  8. #include <linux/proc_fs.h>  
  9. #include <linux/fs.h>  
  10. #include <linux/seq_file.h>  
  11. #include <linux/slab.h>  
  12.   
  13. static char *str = NULL;  
  14.   
  15. /*5,实现show函数 
  16.   作用是将内核数据输出到用户空间 
  17.   将在proc file输出时被调用*/  
  18. static int my_proc_show(struct seq_file *m, void *v)  
  19. {  
  20.     /*这里不能使用printfk之类的函数 
  21.       要使用seq_file输出的一组特殊函数 
  22.       详见ldd3的91页*/  
  23.     seq_printf(m, "current kernel time is %ld\n", jiffies);  
  24.     seq_printf(m, "str is %s\n", str);  
  25.     return 0;  
  26. }  
  27.   
  28.   
  29.   
  30. /*3,实现open和write函数*/  
  31. static ssize_t my_proc_write(struct file *file, const char __user *buffer,  
  32.                              size_t count, loff_t *f_pos)  
  33. {  
  34.     char *tmp = kzalloc((count+1), GFP_KERNEL);  
  35.     if(!tmp)  
  36.         return -ENOMEM;  
  37.     if(copy_from_user(tmp, buffer, count))  
  38.     {  
  39.         kfree(tmp);  
  40.         return EFAULT;  
  41.     }  
  42.     kfree(str);  
  43.     str = tmp;  
  44.     return count;  
  45. }  
  46.   
  47. static int my_proc_open(struct inode *inode, struct file *file)  
  48. {  
  49.     /*4,在open函数中调用single_open绑定seq_show函数指针 
  50.       需要说明的是,ldd3中介绍的seq接口用该调用seq_open函数 
  51.       其调用形式如下: 
  52.       return sep_open(file, &scull_seq_ops); 
  53.       scull_seq_ops为struct seq_operations结构体 
  54.       在该结构体中绑定show函数指针 
  55.       需要准备seq_operations结构体 
  56.       而调用single_open函数只需直接指定show的函数指针即可 
  57.       个人猜测可能是在single_open函数中实现了seq_operations结构体 
  58.       至于是不是就不知道了,没有查看具体实现 
  59.       有兴趣的同学可以参考文档:Documentation\filesystems\seq_file.txt 
  60.       关于第三个参数,其类型应为viod*, 
  61.       内核中有些地方传入的NULL,有些地方传入的inode->i_private,也有传入其他值的 
  62.       来看看data在single_open函数中如何被使用的: 
  63.         if (!res) 
  64.          ((struct seq_file *)file->private_data)->private = data; 
  65.       data是seq_file结构体的private成员。 
  66.       那么data如何真正被使用的呢? 
  67.       发现show函数的第一个参数为seq_file类型,在show函数中, 
  68.       可以将seq_file的private成员转换成对应的类型进行使用。 
  69.       也就是说,可以通过seq_file的private成员将data参数传递到show函数中*/  
  70.     return single_open(file, my_proc_show, NULL);  
  71. }  
  72.   
  73. /*2,填充proc_create函数中调用的flie_operations结构体 
  74.   其中my开头的函数为自己实现的函数, 
  75.   seq和single开头为内核实现好的函数,直接填充上就行 
  76.   open为必须填充函数 
  77.   这里详见ldd3的93页*/  
  78. static struct file_operations my_fops = {  
  79.     .owner   = THIS_MODULE,  
  80.     .open    = my_proc_open,  
  81.     .release = single_release,  
  82.     .read    = seq_read,  
  83.     .llseek  = seq_lseek,  
  84.     .write   = my_proc_write,  
  85. };  
  86.   
  87. static int __init my_init(void)  
  88. {  
  89.     struct proc_dri_entry *file;  
  90.     /*3.10以后内核的proc文件的新接口 
  91.       需要关联file_operations*/  
  92.     /*1,首先要调用创建proc文件的函数,需要绑定flie_operations*/  
  93.     file = proc_create("abc_proc", 0644, NULL, &my_fops);  
  94.     if(!file)  
  95.         return -ENOMEM;  
  96.     return 0;  
  97. }  
  98.   
  99. /*6,删除proc文件*/  
  100. static void __exit my_exit(void)  
  101. {  
  102.     remove_proc_entry("abc_proc", NULL);  
  103.     kfree(str);  
  104. }  
  105.   
  106. module_init(my_init);  
  107. module_exit(my_exit);  
  108. MODULE_LICENSE("GPL");  
  109. MODULE_AUTHOR("QiuXL");  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值