转自: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. logback.xml 模板

    ssm模板 <?xml version="1.0" encoding="UTF-8"?>  <!--configuration 根节点,包含下 ...

  2. PHP isset()、empty()、is_null()的使用区别详解

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  3. windows下安装apache zookeeper

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  4. java安装1.8的经验和Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers问题处理

            java安装1.8后的问题:之前安装了jdk1.7和jdk1.6,之后又安装jdk1.8,然后执行java -version,输出的是1.8的,后来在注册表把jdk1.8改为1.7,然 ...

  5. nginx log 错误502 upstream sent too big header while reading response header from upstream

    cookies的值超出了范围我是说 看看了一下日志 错误502 upstream sent too big header while reading response header from upst ...

  6. codewar 上做练习的一些感触

    废话 在[codewar][1]上做练习,每次都是尽量快速地做完,然后赶着去看排名里面clever分最高的solution,看完每次都要感叹一下人家怎么可以写得这么简洁,甚至有一次我用了一段大约七八行 ...

  7. css 控制文字超出时显示省略号

    不多说,直接看代码吧: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  8. openQPA[01]初次认识与使用

    开源项目QPA 1.项目主页:[http://protocol.sinaapp.com/] 2.项目介绍: 3.运行项目: (1)安装python2.7,并安装PyQt4.   下载地址[https: ...

  9. jni的一些基础知识和概念

    11.1基础知识 JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? |-  ...

  10. 【BZOJ】1854: [Scoi2010]游戏【二分图】

    1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 6759  Solved: 2812[Submit][Status] ...