关闭

嵌入式 内核中针对proc文件系统的编程函数总结

505人阅读 评论(0) 收藏 举报
分类:
一、头文件:
#include <linux/proc_fs.h>
二、创建与删除proc文件:
    创建普通文件:
       1.创建不可读写的普通文件
          
          structproc_dir_entry* create_proc_entry (const char *name,mode_tmode,struct proc_dir_entry *parent);
          @name:要创建的文件名
          @mode:要创建的文件的属性 默认0755
          @parent:这个文件的父目录
       2.创建只读的普通文件
          
  
        structproc_dir_entry * create_proc_read_entry (const char
*name,mode_t mode,struct proc_dir_entry *parent,read_proc_t*
read_proc,void *data);
          @name:要创建的文件名
          @mode:要创建的文件的属性 默认0755
          @parent:这个文件的父目录
          @read_proc:当用户读这个文件时,内核调用的函数
          @data:传给read_proc的参数
       3.创建符号连接
          
          structproc_dir_entry * proc_symlink (const char *name,structproc_dir_entry *parent,const char *dest);
          @name:要创建的文件名
          @parent:这个文件的父目录
          @dest:符号连接的目标文件
       4.创建目录
          
          structproc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry*parent);
          @name:要创建的目录名
          @parent:这个目录的父目录
       5.删除文件或目录
          
          voidremove_proc_entry (const char *name,struct proc_dir_entry*parent);
          @name:要删除的文件或目录名
          @parent:所在的父目录     
    、读写proc文件
       为了能让用户读写添加的proc文件,需要挂接上读写回调函数:read_proc和write_proc
       例:
          structproc_dir_entry * entry;
         entry->read_proc = read_proc_foo;
         entry->write_proc = write_proc_foo;
       1.读函数read_func
          
          intread_func (char *buffer,char **stat,off_t off,int count,int*peof,void *data);
          @buffer:把要返回给用户的信息写在buffer里,最大不超过PAGE_SIZE(一般4K)
          @stat:一般不使用
          @off:buffer的偏移量
          @count:用户要取的字节数
          @peof:读到文件尾时,把peof指向的位置置1
          @data:被多个proc文件定义为读时,通过data传递参数
       2.写函数write_func
          
          intwrite_func (struct file *file,const char *buffer,unsigned longcount,void *data);
          @file:该proc文件对应的file结构,一般忽略。
          @buffer:待写的数据所在的位置
          @count:待写数据的大小
          @data:同read_func
    、seq_file编程接口
       include/linux/seq_file.h:
       structseq_file{
          char*buf;
          size_tsize;
          size_tfrom;
          size_tcount;
          loff_tindex;
          loff_tversion;
          structsemaphore sem;
          structseq_opertions *op;
          void*private;
       };
       seq_file结构会在seq_open函数调用中分配,然后作为参数传给每一个seq_file的操作函数。
       1.seq_file操作函数:
          structseq_operations {
             void(*start) (struct seq_file *m,loff_t *pos);
             void(*stop) (struct seq_file *m,void *v);
             void(*next) (struct seq_file *m,void *v,loff_t *pos);
             void(*show) (struct seq_file *m,void *v);
          };
       2.四个操作函数作用:
         start:用来遍历连接对象的时候做初始化准备工作。
               从pos得到偏移,返回一个连接对象的偏移。
               也可以返回一个特殊值:SEQ_START_TOKEN
               出错返回:ERR_PTR(error_code)
         stop:遍历结束时被调用。
               主要做一些清理工作,如释放锁、释放内存
               注意:如果调用了start,就必定会调用stop,即使start返回出错。
         next:遍历中寻找下一个连接对象。一般是下一个节点。
         show:对当前遍历到的连接对象或节点进行一些操作。
               例如调用seq_xxx函数输出对象的一些内容。
       3.格式化输出函数
         seq_printf(struct seq_file*m,"格式化字符串",var):和printk很相似,只是多了个*m
          seq_putc(struct seq_file *m,char c);输出字符
          seq_puts(struct seq_file *m,const char *s);输出字符串
  
        seq_escape(struct seq_file *m,const char *s,const char
*esc);跟seq_puts类似,不同的是这个函数特殊处理字符串s中的特殊字符(esc指针指向的每个字符),这些特殊字符输出为八进制,其他字符
照常。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1045798次
    • 积分:18263
    • 等级:
    • 排名:第521名
    • 原创:741篇
    • 转载:523篇
    • 译文:0篇
    • 评论:105条
    最新评论