Linux嵌入式 -- 内核 - proc文件系统
1. 什么是proc文件系统?
实例:通过 /proc/meminfo,查询当前内存使用情况。
结论:proc文件系统是一种在用户态检查内核状态的机制。
2.Proc文件分类
特点
 每个文件都规定了严格的权限可读?可写?哪个用户可读?哪个用户可写?
 可以用文本编辑程序读取(more命令,cat命令,vi程序等等)
 不仅可以有文件,还可以有子目录。
 可以自己编写内核程序添加一个/proc目录下的文件。
 文件的内容都是动态创建的,并不存在于磁盘上,存在内存中。
3. 功能函数
内核描述
struct proc_dir_entry{
{
。。 。。。。。。。。。。。。。。。。。
read_proc_t  *read_proc;
write_proc_t  *write_proc;
。。。。。。。。。。。。。。。。。。。
}
创建文件
struct proc_dir_entry* create_proc_entry (const char  *name,mode_t mode,struct proc_dir_entry *parent)
功能:创建proc文件
参数:
 name:要创建的文件名
 mode:要创建的文件的属性 默认0755
 parent:这个文件的父目录
创建目录
struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent)
功能:创建proc目录
参数:
 name:要创建的目录名
parent:这个目录的父目录
删除目录/文件
void remove_proc_entry (const char *name,struct proc_dir_entry *parent)
功能:删除proc目录或文件
参数:
 name:要删除的文件或目录名
 parent:所在的父目录
读写 为了能让用户读写添加的proc文件,需要挂接上读写回调函数: read_proc 和 write_proc
读操作
int read_func (char *buffer,char**stat,off_t off,int count,int *peof,void *data)
参数:
 buffer:把要返回给用户的信息写在buffer里,最大不超过PAGE_SIZE
 stat:一般不使用
 off:偏移量
 count:用户要取的字节数
 peof:读到文件尾时,需要把*peof置1
 data:一般不使用
写操作
int write_func (struct file*file,const char *buffer,unsigned long count,void*data) //提供用户的写操作
参数:
 file :该proc文件对应的file结构,一般忽略。
 buffer :待写的数据所在的位置
 count :待写数据的大小
 data :一般不使用
4. 实现流程
实现一个proc文件的流程:
(1)调用create_proc_entry创建一个struct proc_dir_entry。
(2)对创建的struct proc_dir_entry进行赋值:read_proc,mode,owner,size,write_proc 等等。
5.实例一
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/proc_fs.h>
#define procfs_name "proctest" // /proc目录下创建的文件名 struct proc_dir_entry *Our_Proc_File; //结构体,create_proc_entry返回一个指针给他 int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data ) //回调函数,对应写操作
{
int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
} int proc_init()
{
Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if(Our_Proc_File == NULL)
{
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT"Error: Could not init /proc/%s\n", procfs_name);
return -ENOMEM;
}
Our_Proc_File->read_proc = procfile_read; //回调函数
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created \n", procfs_name);
return 0;
} void proc_exit()
{
remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO"/proc/%s removed \n", procfs_name);
} module_init(proc_init);
module_exit(proc_exit);
5. 实例二 (由1修改为 能够 echo xxx > /proc/proctest)
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/proc_fs.h>
#include<linux/uaccess.h>
#define procfs_name "proctest" struct proc_dir_entry *Our_Proc_File;
static char msg[255]; //输入保存数组 int procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data )
{
//int ret;
//ret = sprintf(buffer, "HelloWorld!\n"); int len = strlen(msg);
if(offset >= len)
return 0;
if(buffer_length > len-offset)
buffer_length = len - offset;
memcpy(buffer+offset, msg+offset, buffer_length);
return offset+buffer_length;
} int procfile_write(struct file *file, const char __user *buffer, unsigned long count, void *data) //提供给用户输入信息,控制内核。
{
unsigned long count2 = count;
if(count2 >= sizeof(msg))
count2 = sizeof(msg)-1;
if(copy_from_user(msg, buffer, count2))
return -EFAULT;
msg[count2] = '\0';
return count;
} int proc_init()
{
Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if(Our_Proc_File == NULL)
{
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT"Error: Could not init /proc/%s\n", procfs_name);
return -ENOMEM;
}
Our_Proc_File->read_proc = procfile_read;
Our_Proc_File->write_proc = procfile_write;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created \n", procfs_name);
return 0;
} void proc_exit()
{
remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO"/proc/%s removed \n", procfs_name);
} module_init(proc_init);
module_exit(proc_exit);
echo xxxx > /proc/proctest
cat /proc/proctest
makefile
ifneq ($(KERNELRELEASE),) obj-m :=proc.o else KDIR := /lib/modules/3.5.0-17-generic/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ok *.o *.mod.o *.mod.c *.symvers
endif
Linux嵌入式 -- 内核 - proc文件系统的更多相关文章
- 深入理解linux系统下proc文件系统内容
		
深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...
 - Linux嵌入式 -- 内核 (arm) & 文件系统
		
1. make distclean 2. 配置内核 ----> 生成 .config文件 make menuconfig ARCH=arm Makefile文件分析: 3. 编译内核 mak ...
 - linux kernel (proc文件系统)参数
		
http://blog.csdn.net/guowake/article/details/3279796 Linux Proc文件系统,通过对Proc文件系统进行调整,达到性能优化的目的. 二./pr ...
 - linux文件管理之proc文件系统
		
proc 文件系统 ==================================================================================== Linux ...
 - Linux嵌入式 -- 内核简介(x86)
		
0. 嵌入式系统 以应用为中心,软硬件可裁剪,对功耗.对体积.对成本等都有严格要求的专用计算机系统. 1. linux体系结构 2. 为什么 划分为 用户空间 和 内核控件 ? 分两级,内核和应用 ...
 - Linux嵌入式 -- 内核 - 系统调用
		
1. 系统调用 定义 Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用.用户可以通过系统调用命令在自己的应用程序中调用它们. 系统调用和普通的函数调用非常相似,区别仅仅在于,系统调 ...
 - Linux嵌入式 -- 内核 - 进程控制 和 调度
		
1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...
 - Linux嵌入式 -- 内核 - 内核定时器
		
1. 度量时间差 时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000(每 ...
 - Linux嵌入式 -- 内核 - 内核链表
		
1. linux内核链表 链表数据结构的定义: struct list_head { struct list_head *next, *prev; }; list_head结构包含两个指向li ...
 
随机推荐
- JS HTML DOM---Document对象
			
Document 对象 当浏览器载入 HTML 文档, 它就会成为 document 对象. document 对象是HTML文档的根节点与所有其他节点(元素节点,文本节点,属性节点, 注释节点). ...
 - 简单的 ajax demo
			
2.最重要也是最核心的是要自己改下bootstrap-paginator.js源文件,如下: [javascript] view plain copy function oneferRepo ...
 - 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
			
众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...
 - 基础篇-java开发
			
开局必知 1.变量 在java中,以{}为作用域,所以就存在成员变量和局部变量之说 由于java是强类型语言,所以在申明变量的时候,必须指定类型 java里,一个变量有声明过程和初始化过程(也就是赋值 ...
 - D3D9和OpenGL加载纹理图片的API是哪个?
			
D3D9 创建一个空纹理,当返回 S_OK 且 ppTexture 纹理对象指针不为 NULL 时,则表示该函数调用成功. HRESULT D3DXCreateTexture( _In_ LPDIR ...
 - 洛谷P5274 优化题(ccj)
			
洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...
 - HDU1950-Bridging signals-最长上升子序列
			
Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. ...
 - Java关键字this
			
Java关键字this只能用于方法方法体内.当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this.因此,this只能在类中的非静态方法中使用,静 ...
 - 检测tomcat服务是否正常
			
由于tomcat服务经常会出现进程在,但是服务却无法正常响应的问题,而且进程跑在docker容器中,使用zabbix控制不是很方便,故此写了个简单的小脚本: #!/bin/bash #Author:f ...
 - Python操作——Redi
			
redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(列表).hash(哈希).set(集合).zset(有 ...