Linux内核学习笔记之seq_file接口创建可读写proc文件
转自:http://blog.csdn.net/mumufan05/article/details/45803219
学习笔记与个人理解,如有错误,欢迎指正。
温馨提示:建议跟着注释中的编号顺序阅读代码
测试方法:cat /proc/abc_proc
echo 任意字符串 >/proc/abc_pro(需root权限)
- /*************************************************
- 使用seq_file接口实现可读写proc文件的例子
- 适用于3.10以后的内核
- Author: ZhangN
- Date: 2015-5-17
- *************************************************/
- #include <linux/module.h>
- #include <linux/sched.h>
- #include <linux/uaccess.h>
- #include <linux/proc_fs.h>
- #include <linux/fs.h>
- #include <linux/seq_file.h>
- #include <linux/slab.h>
- static char *str = NULL;
- /*5,实现show函数
- 作用是将内核数据输出到用户空间
- 将在proc file输出时被调用*/
- static int my_proc_show(struct seq_file *m, void *v)
- {
- /*这里不能使用printfk之类的函数
- 要使用seq_file输出的一组特殊函数
- 详见ldd3的91页*/
- seq_printf(m, "current kernel time is %ld\n", jiffies);
- seq_printf(m, "str is %s\n", str);
- return 0;
- }
- /*3,实现open和write函数*/
- static ssize_t my_proc_write(struct file *file, const char __user *buffer,
- size_t count, loff_t *f_pos)
- {
- char *tmp = kzalloc((count+1), GFP_KERNEL);
- if(!tmp)
- return -ENOMEM;
- if(copy_from_user(tmp, buffer, count))
- {
- kfree(tmp);
- return EFAULT;
- }
- kfree(str);
- str = tmp;
- return count;
- }
- static int my_proc_open(struct inode *inode, struct file *file)
- {
- /*4,在open函数中调用single_open绑定seq_show函数指针
- 需要说明的是,ldd3中介绍的seq接口用该调用seq_open函数
- 其调用形式如下:
- return sep_open(file, &scull_seq_ops);
- scull_seq_ops为struct seq_operations结构体
- 在该结构体中绑定show函数指针
- 需要准备seq_operations结构体
- 而调用single_open函数只需直接指定show的函数指针即可
- 个人猜测可能是在single_open函数中实现了seq_operations结构体
- 至于是不是就不知道了,没有查看具体实现
- 有兴趣的同学可以参考文档:Documentation\filesystems\seq_file.txt
- 关于第三个参数,其类型应为viod*,
- 内核中有些地方传入的NULL,有些地方传入的inode->i_private,也有传入其他值的
- 来看看data在single_open函数中如何被使用的:
- if (!res)
- ((struct seq_file *)file->private_data)->private = data;
- data是seq_file结构体的private成员。
- 那么data如何真正被使用的呢?
- 发现show函数的第一个参数为seq_file类型,在show函数中,
- 可以将seq_file的private成员转换成对应的类型进行使用。
- 也就是说,可以通过seq_file的private成员将data参数传递到show函数中*/
- return single_open(file, my_proc_show, NULL);
- }
- /*2,填充proc_create函数中调用的flie_operations结构体
- 其中my开头的函数为自己实现的函数,
- seq和single开头为内核实现好的函数,直接填充上就行
- open为必须填充函数
- 这里详见ldd3的93页*/
- static struct file_operations my_fops = {
- .owner = THIS_MODULE,
- .open = my_proc_open,
- .release = single_release,
- .read = seq_read,
- .llseek = seq_lseek,
- .write = my_proc_write,
- };
- static int __init my_init(void)
- {
- struct proc_dri_entry *file;
- /*3.10以后内核的proc文件的新接口
- 需要关联file_operations*/
- /*1,首先要调用创建proc文件的函数,需要绑定flie_operations*/
- file = proc_create("abc_proc", 0644, NULL, &my_fops);
- if(!file)
- return -ENOMEM;
- return 0;
- }
- /*6,删除proc文件*/
- static void __exit my_exit(void)
- {
- remove_proc_entry("abc_proc", NULL);
- kfree(str);
- }
- module_init(my_init);
- module_exit(my_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("ZhangN");
Linux内核学习笔记之seq_file接口创建可读写proc文件的更多相关文章
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- 20135316王剑桥Linux内核学习笔记
王剑桥Linux内核学习笔记 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的 个人理 ...
- Linux内核学习笔记——内核内存管理方式
一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...
- 20135316王剑桥Linux内核学习笔记第三周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 三个法宝:存储程序计算机.函数调 ...
- 20135316王剑桥Linux内核学习笔记第四周
20135316王剑桥 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 1.内核态:在高执行级别,代码可 ...
- Linux内核学习笔记
1.vanbreaker的专栏 2.LinuxKernel Exploration 3.DroidPhone的专栏 4.Linux内核研究以及学习文档和ARM学习以及研究的开放文档 [力荐] 5. ...
- Linux内核学习笔记1——系统调用原理【转】
1什么是系统调用 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口.用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文 ...
随机推荐
- python基础类型 —— Sets集合
集合(set)是一个无序不重复元素的序列. 基本功能是进行成员关系测试和删除重复元素. 运行结果如下: sets其他操作: myset.add('x') # 添加一项 myset.update([10 ...
- tomcat错误信息解决方案【严重:StandardServer.await: create[8005]】
错误信息: 严重: StandardServer.await: create[8005]: java.net.BindException: Address already in use: JVM ...
- C#用Oracle.DataAccess中连接Oracle要注意版本问题!
客户端Oracle.DataAccess.dll与服务器版本不一致时,如下修改:1.在客户端Web.config中,增加如下配置:<runtime> <assemblyBinding ...
- java代码分页
分页类 这个适用情况: 适用于前端页面已提供分页按钮样式的情况 分页规则: 首页,尾页,上页,下页 这四个按钮必定出现,中间分页动态生成5个 如:首 上 2 3 4 5 6 下 尾 public cl ...
- 《JavaScript 高级程序设计》第一章:简介
JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...
- 002 jquery基本选择器
1.选择器 2.基本选择器 3.程序(包含以上五种基本选择器) <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)
Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...
- 在 Vim 中优雅地查找和替换
原文更好看链接http://harttle.com/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...
- springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换
需求 php调用java接口时,因为php那边的属性都是下划线风格,java这边的属性都是驼峰的风格.配置springmvc的json转换,在requestBody的时候(调用对象的set 方法)将j ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...