您的位置:首页 > 其它

用户空间与内核空间的接口: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当做“开关”使用)。

上一个例程:

#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>");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐