用户空间与内核空间的接口:proc文件系统
2013-05-27 10:17
323 查看
最早在接触Linux BSP时,项目中有一项规格就是底层需向上层提供硬件PCB及BOM信息。由于在Linux的根文件系统/proc目录下有硬件CPU、内存、存储器等与硬件相关的信息,并且在用户空间通过cat命令就可以轻易获得,于是有个想法,就是设法将项目中硬件PCB及BOM等信息展现在/proc目录下,然后用户空间可以通过cat或通过读写文件的形式获得这些信息。所以就查阅了关于Linux proc文件系统的一些知识,并整理一个例程。
什么是proc文件系统?
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外村空间。它以文件系统的方式访问内核数据的操作接口。Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制、用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息、如进程,是可以动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需要的信息并提交的。(这一点可sysfs有点类似,现在的驱动编程中,往往是通过sysfs实现一些参数的更改,甚至把sysfs当做“开关”使用)。
上一个例程:
将上面例程编译层模块test_proc.ko
1. insmod test_proc.ko
加载模块后在/proc目录下生成文件节点myproc
2.cat /proc/mypoc
看到输出信息为hello_proc
另外通过read系统调用读/proc/myproc也可以得到数据hello_proc
注意上面是在/proc目录下生成目录myproc,如果想在/proc目下生成一个目录,然后在该生成的目录下生成一个子目录。如建立目录/proc/myproc/myproc_sub,可以这样:
什么是proc文件系统?
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外村空间。它以文件系统的方式访问内核数据的操作接口。Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制、用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息、如进程,是可以动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需要的信息并提交的。(这一点可sysfs有点类似,现在的驱动编程中,往往是通过sysfs实现一些参数的更改,甚至把sysfs当做“开关”使用)。
上一个例程:
#include <linux/module.h> #include <linux/proc_fs.h> char mystring[] = "hello_proc"; int my_proc_read( char *buf, char **start, off_t off, int count, int *eof, void *data ) { int len = 0; len += sprintf( buf+len, "\n%s\n", mystring); len += sprintf( buf+len, "\n" ); return len; } static int __init proc_init( void ) { create_proc_read_entry("myproc", 0, NULL, my_proc_read, NULL ); return 0; } static void __exit proc_exit(void ) { remove_proc_entry( "myproc",NULL ); } module_init( proc_init ); module_exit( proc_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Test proc filesystem"); MODULE_AUTHOR("Vincent Wu <wei2009job@gmail.com>");
将上面例程编译层模块test_proc.ko
1. insmod test_proc.ko
加载模块后在/proc目录下生成文件节点myproc
2.cat /proc/mypoc
看到输出信息为hello_proc
另外通过read系统调用读/proc/myproc也可以得到数据hello_proc
注意上面是在/proc目录下生成目录myproc,如果想在/proc目下生成一个目录,然后在该生成的目录下生成一个子目录。如建立目录/proc/myproc/myproc_sub,可以这样:
#include <linux/module.h> #include <linux/proc_fs.h> char mystring[] = "hello_proc"; struct proc_dir_entry *parent; int my_proc_read( char *buf, char **start, off_t off, int count, int *eof, void *data ) { int len = 0; len += sprintf( buf+len, "\n%s\n", mystring); len += sprintf( buf+len, "\n" ); return len; } static int __init proc_init( void ) { parent = proc_mkdir ("myproc", NULL); create_proc_read_entry("myproc_sub", 0, parent, my_proc_read, NULL ); return 0; } static void __exit proc_exit(void ) { remove_proc_entry( "myproc_sub",parent); } module_init( proc_init ); module_exit( proc_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Test proc filesystem"); MODULE_AUTHOR("Vincent Wu <wei2009job@gmail.com>");
相关文章推荐
- 用户空间与内核空间的接口:proc文件系统
- 用户空间和内核空间通讯之【proc文件系统】
- 用户空间和内核空间通讯之【proc文件系统】
- 用户空间和内核空间通讯之【proc文件系统】
- 用户空间和内核空间通讯之【proc文件系统】
- 用户空间和内核空间通讯之【proc文件系统】
- 如何使用proc文件系统让用户空间和内核空间进行交互
- 用户空间和内核空间通讯之【proc文件系统】
- linux 使用/proc文件系统 实现用户空间与内核模块之间通信
- 用户空间和内核空间通讯之【proc文件系统】
- 内核proc文件系统与seq接口(2)---内核proc文件系统编程接口
- Linux 文件系统剖析: 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口
- 通过proc文件系统让Linux内核空间和用户空间之间进行通信
- 内核proc文件系统与seq接口(3)---内核proc文件底层结构浅析
- 内核proc文件系统与seq接口(1)---内核proc文件系统简介
- 内核proc文件系统与seq接口(6)----分析sysctl函数接口与procfs之间的内部关系
- Linux 文件系统剖析: 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口
- 内核proc文件系统与seq接口(4)---seq_file接口编程浅析
- 内核proc文件系统与seq接口(5)---通用proc接口与seq_file接口实验
- 内核proc文件系统与seq接口(2)---内核proc文件系统编程接口