免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1187 | 回复: 0
打印 上一主题 下一主题

内核中针对proc文件系统的编程函数总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-12 16:34 |只看该作者 |倒序浏览
一、头文件:
    #include
二、创建与删除proc文件:
    创建普通文件:
        1.创建不可读写的普通文件
            /*此函数只负责在proc中创建一个只读文件,即能在proc中看到这个文件。
             * */
            struct proc_dir_entry* create_proc_entry (const char *name,mode_t mode,struct proc_dir_entry *parent);
            @name :要创建的文件名
            @mode :要创建的文件的属性 默认0755
            @parent :这个文件的父目录
        2.创建只读的普通文件
            /*和create_proc_entry基本一样。
             * 只是为该文件挂接上读函数:read_proc(void data);
             * */
  
         struct proc_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.创建符号连接
            /*该函数在父目录parent下创建一个指向dest的连接name。
             * 就像ln:
             * #ln -s dest parent/name
             * */
            struct proc_dir_entry * proc_symlink (const char *name,struct proc_dir_entry *parent,const char *dest);
            @name :要创建的文件名
            @parent :这个文件的父目录
            @dest :符号连接的目标文件
        4.创建目录
            /*该函数在父目录parent下创建一个目录name
             * */
            struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent);
            @name :要创建的目录名
            @parent :这个目录的父目录
        5.删除文件或目录
            /*这个函数从proc文件系统中删除一个文件或目录。
             * 注意:1。是通过参数name,而不是通过创建时返回的指针来删除的。
             * 2。该函数不会递归删除目录下的文件。
             * 3。data变量保存了分配的内存,要先释放对应内存,再删除该文件。
             * */
            void remove_proc_entry (const char *name,struct proc_dir_entry *parent);
            @name :要删除的文件或目录名
            @parent :所在的父目录      
    、读写proc文件
        为了能让用户读写添加的proc文件,需要挂接上读写回调函数:read_proc和write_proc
        例:
            struct proc_dir_entry * entry;
            entry->read_proc = read_proc_foo;
            entry->write_proc = write_proc_foo;
        1.读函数read_func
            /*该函数把要写的信息写入buffer,最多不超过PAGE_SIZE
             * */
            int read_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
            /*该函数最多从buffer中读取count个字节的数据。
             * 注意:buffer地址在用户空间,需要先用copy_from_user()把这些数据拷贝到内核中。
             * */
            int write_func (struct file *file,const char *buffer,unsigned long count,void *data);
            @file :该proc文件对应的file结构,一般忽略。
            @buffer :待写的数据所在的位置
            @count :待写数据的大小
            @data :同read_func
    、seq_file编程接口
        include/linux/seq_file.h:
        struct seq_file{
            char *buf;
            size_t size;
            size_t from;
            size_t count;
            loff_t index;
            loff_t version;
            struct semaphore sem;
            struct seq_opertions *op;
            void *private;
        };
        seq_file结构会在seq_open函数调用中分配,然后作为参数传给每一个seq_file的操作函数。
        1.seq_file操作函数:
            struct seq_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指针指向的每个字符),这些特殊字符输出为八进制,其他字符
照常。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73569/showart_1287013.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP