转自:http://blog.csdn.net/mumufan05/article/details/45803219

学习笔记与个人理解,如有错误,欢迎指正。

温馨提示:建议跟着注释中的编号顺序阅读代码

测试方法:cat /proc/abc_proc

echo 任意字符串 >/proc/abc_pro(需root权限)

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

Linux内核学习笔记之seq_file接口创建可读写proc文件的更多相关文章

  1. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  2. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  3. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  4. 20135316王剑桥Linux内核学习笔记

    王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...

  5. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  6. 20135316王剑桥Linux内核学习笔记第三周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...

  7. 20135316王剑桥Linux内核学习笔记第四周

    20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...

  8. Linux内核学习笔记

    1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档   [力荐] 5. ...

  9. Linux内核学习笔记1——系统调用原理【转】

    1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口.用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文 ...

随机推荐

  1. SqlServer中Sql查看存储过程

    ( 一)利用Sql语句查询数据库中的所有表 1.利用sysobjects系统表 select * from sysobjects where xtype='U'  2,利用sys.tables目录视图 ...

  2. hdu 5007 水题 (2014西安网赛A题)

    题意:出现Apple.iPod.iPhone.iPad时输出MAI MAI MAI!,出现Sony,输出SONY DAFA IS GOOD! Sample InputApple bananaiPad ...

  3. 为什么不要在Spring的配置里,配置上XSD的版本号

    为什么不要在Spring的配置里,配置上XSD的版本号?因为如果没有配置版本号,取的就是当前jar里的XSD文件,减少了各种风险.而且这样约定大于配置的方式很优雅.

  4. 主席树初步学习笔记(可持久化数组?静态区间第k大?)

    我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...

  5. php 会话控制(Session会话控制)

    php的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由php生成,在会话的生命周期中都会保存在客户端.客户端保存数据的地方只有cookie,所以php的会话ID一般保 ...

  6. 基于jquery的简洁树形折叠菜单

    先上效果图: 最小的ul就是一个最小的树枝,空间允许时可无限扩展.html如下: <div class="panel panel-default"> <div c ...

  7. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  8. 22.python中的面向对象和类的基本语法

    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...

  9. BZOJ4278 : [ONTAK2015]Tasowanie

    首先在串的末尾加上1000,然后进行归并,每次取字典序较小的那个后缀即可. 用hash+二分支持查询lcp,时间复杂度$O(n\log n)$. #include<cstdio> type ...

  10. CentOS 7使用yum安装PHP5.6

    删除旧php包 yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbs ...