linux中proc文件系统
来源:互联网 发布:广州聚焦网络怎么样 编辑:程序博客网 时间:2024/05/29 16:20
/proc 文件系统是由软件创建,被内核用来向外界报告信息的一个文件系统。/proc 下面的每一个文件都和一个内核函数相关联,当文件的被读取时,与之对应的内核函数用于产生文件的内容。我们已经见到了很多这样的文件,例如,/proc/modules 总是返回当前内核中加载的模块。
/proc 广泛的应用在 linux 文件系统中,现代 linux 发行版上的许多应用程序,例如 ps ,top 和 uptime 都从 /proc 获取他们所需要的信息。一些驱动程序也通过 /proc 文件系统报告信息,当然你的驱动程序也可以这么做。 /proc 文件系统是动态的,所以你的模块可以在任何时候添加或者删除入口。完全特征的 /proc 入口可能会是一个复杂的猛兽,它们既可以读也可以写。然而,大多数时候,/proc 中的文件是只读的。这里考虑的是只读的 /proc 文件。
然而,在继续之前,必须强调在 /proc 下面添加文件是不提倡的。/proc 文件系统被内核开发者看作是不可控制的混乱,这和它最初的目的--报告系统中运行的进程的信息相差十万八千里。在新的代码中推荐的获取信息的方式是通过 sysfs 。但是,使用 sysfs 是需要对 linux 设备模型有一个理解。并且,/proc 下面的文件较容易创建,并且完全符合调试的目的,所以才会学习 /proc 文件系统。
2.创建 /proc 文件
如果你定义了一个 read_proc 函数,你需要将它和 /proc 层次中的入口联系起来。这是通过一个叫做 create_proc_read_entry 的函数来实现的,这个函数的函数原型如下:
- struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode,struct proc_dir_entry *base,read_proc_t *read_proc,void *data);
- create_proc_read_entry("scullmem", 0/*default mode*/, NULL /*parent dir*/, scull_read_procmem, NULL /*client data*/);
目录入口指针可以用来在 /proc 下创建整个目录架构,然而,注意将一个文件放到 /proc 子目录中的一个更加容易的做法是将子目录的名字作为要创建的新文件名字的一部分路径,只要那个子目录已经存在。例如一个经常被忽略的惯例就是和驱动程序相关的 /proc 文件应该放到一个 driver 子目录中。例如,上面的例子中,我们想要将所创建的文件 scullmem 放到 driver 中,只需要将第一个参数修改为 "driver/scullmem" 就可以了。
/proc 中文件在模块被卸载的时候应该被删除。remove_proc_entry 所做的事情和 create_proc_read_entry 所做的事情相反。例如:
- remove_proc_entry("scullmem",NULL /*parent dir*/);
- sleep 100 < /proc/myfile
3.在 /proc中实现文件
所有使用 /proc 的模块应该包括 <linux/proc_fs.h> 头文件来定义合适的函数。创建一个只读的 /proc 文件,你的驱动程序必须实现一个函数,当这个文件被读时,来产生一些数据。当一些进程使用 read 函数读取文件的时候,请求就通过这个函数到达了你的模块。我们会首先看一下这个函数,并且之后介绍注册的接口。当一个进程读取 /proc 文件的时候,内核就分配了一页的内存,驱动程序可以将要返回给用户空间的数据写到这个页里面。那个缓存被传递给了你的 read_proc 函数。read_proc 函数的原型如下:
- int (*read_proc)(char *page,char **start,off_t offset,int count,int *eof,void *data);
这个函数应该返回写入到页缓冲区中的数据字节数。就像 read 函数一样。其它的输出是 *eof 和 *start 。eof 是一个简单的标记,但是 start 的使用方法是有写复杂的,它的目的视为了帮助实现大的(超过一页)的 /proc 文件。start 参数并不常用,它的目的使用来指示返回给用户空间的住局在一页中的哪个位置。当 read_proc 函数被调用的时候,*start 参数将会被设置为 NULL。如果你保留它为 NULL 的话,内核会假设数据放到页里面时,参数 offset 为 0。换句话说,内核假设了一个头脑简单的 read_proc 版本,它把虚拟文件的所有内容写到页里面,而忽略了 offset 参数。相反,如果给 *start 设置了一个不是 NULL 的值,内核就假设由 *start 指向的数据将 offset 考虑在内,并且已经准备好返回给用户空间了。一般来说,简单的 proc_read 方法返回很少量的数据常常忽略了 *start 参数。更加复杂的方法才会设置页的 *start 的值,并且仅仅将数据放到所请求的 offset 那里。
4.实例
在这里,我们写了一个简单的例子来演示一下 /proc 的使用:
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/proc_fs.h>
- int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data);
- static int __init test_proc_init(void)
- {
- create_proc_read_entry("read_proc",0,NULL,read_proc,NULL);
- return 0;
- }
- static void __exit test_proc_exit(void)
- {
- remove_proc_entry("read_proc",NULL);
- }
- int read_proc(char *page,char **start,off_t offset,int count,int *eof,void *data)
- {
- int len = sprintf(page,"%s\n","hello world");
- return len;
- }
- module_init(test_proc_init);
- module_exit(test_proc_exit);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("wangxq");
当插入这个模块到内核之后,使用命令:
- cat /proc/read_proc
就会看到输出 hello world。
- linux中proc文件系统
- linux中proc文件系统 -- ldd3读书笔记
- Linux文件系统之proc文件系统
- linux下 proc文件系统
- proc 文件系统 for linux
- linux proc文件系统学习
- Linux proc文件系统
- linux proc文件系统
- linux proc文件系统学习
- Linux proc文件系统
- linux /proc虚拟文件系统
- linux proc 文件系统
- 理解linux Proc文件系统
- linux proc文件系统学习
- linux proc文件系统探索
- Linux的proc文件系统
- Linux proc文件系统相关
- linux 的proc文件系统
- LeetCode 238. Product of Array Except Self
- spring boot起步-搭建eureka环境
- 算法day02
- 对二叉树的复习与整理
- weblogic10数据源(连接池)配置
- linux中proc文件系统
- EditorTools分析
- 9月8日笔记(servlet相关知识)
- Apache Beam中的几种常见的处理类
- HDU
- Ubuntu下MySQL、Redis以及MongoDB三个数据库的启动、重启以及停止命令
- HDU 6195 cable cable cable
- PlaceHodler动态添加控件
- 第二周周末总结