【版权声明:转载请保留出处:blog.csdn.net/gentleliu。邮箱:shallnew*163.com】

在 Linux 系统中,/proc 文件系统十分有用,它被用于内核向用户导出信息。/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux 内核空间和用户空间之间进行通信。在/proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,与普通文件不同的是,这些虚拟文件的内容都是动态创建的。Linux 系统的许多命令本身都是通过分析/proc 下的文件来完成,如 ps、top、uptime 和 free等。
在 Linux 设备驱动程序中,驱动工程师自定义/proc 节点以向外界传递信息的方法还是比较常见的。

下列函数用于创建/proc 目录:

struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);

下列函数创建/proc 节点:

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void * data);

结合 create_proc_entry()和 proc_mkdir(),可用于先在/proc 下创建一个目录,而后在该目录下创建一个文件。
可用如下函数删除/proc 节点:

void remove_proc_entry(const char *name, struct proc_dir_entry *parent);

上述函数各返回值的 proc_dir_entry 结构体中包含了/proc 节点的读函数指针(read_proc_t*read_proc)、写函数指针(write_proc_t *write_proc)以及父节点、子节点信息等。/proc 节点的读写函数的类型分别为:

typedef int (read_proc_t)(char *page, char **start, off_t off,int count, int *eof, void *data);
typedef int (write_proc_t)(struct file *file, const char __user *buffer,unsigned long count, void *data);

这两函数需要我们来实现。
读函数中 page 指针指向用于写入数据的缓冲区,start 用于返回实际的数据写到内存页的位置,eof 是用于返回读结束标志,offset 是读的偏移,count 是要读的数据长度。start 参数比较复杂,对于/proc 只包含简单数据的情况,通常不需要在读函数中设置*start,意味着内核将认为数据保存在内存页偏移 0 的地方。如果将*start 设置为非 0 值,意味着内核将认为*start 指向的数据是 offset 偏移处的数据。写函数与 file_operations 中的 write()成员类似,需要一次从用户缓冲区到内存空间的复制过程。
下面给一个示例,该示例只是简单的在/proc目录下创建一个文件夹和文件,用户可以在用户态向该文件写入文件,并读出文件内容。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>#define USER_ROOT_DIR   "slndir"
#define USER_ENTRY      "slnfile"struct proc_dir_entry    *root_dir, *entry;
char                    kbuff[1024];static int proc_write(struct file *filep, const char __user *buffer,unsigned long len, void *data)
{if (copy_from_user(kbuff, buffer, len)) {return -1;}kbuff[len] = '\0';return len;
}static int proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{int     len;len = sprintf(page, "%s", kbuff);return len;
}static int __init sln_init(void)
{printk("Hello, %s\n", __func__);root_dir = proc_mkdir(USER_ROOT_DIR, NULL);if (NULL == root_dir) {printk("proc_mkdir create dir %s failed!\n", USER_ROOT_DIR);return -1;}entry = create_proc_entry(USER_ENTRY, 0666, root_dir);if (NULL == entry) {printk("create_proc_entry create entry %s failed\n", USER_ENTRY);goto err;}entry->read_proc = proc_read;entry->write_proc = proc_write;return 0;err:remove_proc_entry(USER_ROOT_DIR, NULL);return -1;
}static void __exit sln_exit(void)
{printk("Bye, %s\n", __func__);remove_proc_entry(USER_ENTRY, root_dir);remove_proc_entry(USER_ROOT_DIR, NULL);
}module_init(sln_init);
module_exit(sln_exit);MODULE_LICENSE("GPL");

linux 内核编程之proc虚拟文件系统相关推荐

  1. linux 虚拟文件系统 源码,Linux内核源代码情状分析-虚拟文件系统

    Linux内核源代码情景分析-虚拟文件系统 我们先来看两张图: 第一张是VFS与具体文件系统的关系示意图: 第二张是Linux文件系统的层次结构: 特殊文件:用来实现"管道"的文件 ...

  2. Linux内核设计与实现---虚拟文件系统

    虚拟文件系统 1 通用文件系统 2 文件系统抽象层 3 Unix文件系统 4 VFS对象及其数据结构 其他VFS对象 5 超级快对象 超级块操作 6 索引节点对象 索引节点操作 7 目录项对象 目录项 ...

  3. 使用 /sys 文件系统访问 Linux 内核:比/proc 更为理想的访问内核数据的途径

    使用 /sys 文件系统访问 Linux 内核:比/proc 更为理想的访问内核数据的途径 作者: feng 日期: 2010/12/22发表评论 (0)查看评论 程 任全 (crquan@gmail ...

  4. linux内核快速倒车,初探Linux内核态——通过proc文件系统作快速问题定位

    这篇博客的内容完全是关于现代Linux内核的.换句话说,指的是与RHEL6一样使用的2.6.3x系列内核,而不是古老的RHEL5所使用的2.6.18内核(都什么鬼了?!),虽然大部分企业都还在使用RH ...

  5. Linux系统 proc self,Linux内核源代码情形分析-特殊文件系统/proc-对/proc/self/cwd的访问...

    Linux内核源代码情景分析-特殊文件系统/proc-对/proc/self/cwd的访问 继上篇文章Linux内核源代码情景分析-特殊文件系统/proc,我们对/proc/loadavg访问后,这篇 ...

  6. Porting:linux内核的模块化、根文件系统的制作和自动挂载

    1.关于内核模块($: linux   #: 开发板)      模块化设计. $:' vi drivers/char/Makefile             obj-m    += led_drv ...

  7. linux 内核 mtd读取,/proc/mtd 各个参数含义 -- linux内核

    通过/proc虚拟文件系统读取MTD分区表:cat /proc/mtd mtd .name = raspi, .size = 0x00400000 (4M) .erasesize = 0x000100 ...

  8. linux c编程之fcntl

    fcntl可实现对指定文件描述符的各种操作,其函数原型如下: int fcntl(int fd, int cmd, ... /* arg */ ); 其中,操作类型由cmd决定.cmd可取如下值: F ...

  9. linux内核 fat,微软宣布exFAT文件系统规范,希望被Linux内核接纳

    对于那些经常需要在 Linux 和 Windows 10 之间切换工作的人们来说,作为 FAT32 继任者的 exFAT 文件系统,能够为用户带来更好的体验.近日,微软宣布了 exFAT 文件系统规范 ...

  10. linux C编程之makefile

    linux C编程之makefile 目的:       基本掌握了 make 的用法,能在Linux系统上编程. 环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话 ...

最新文章

  1. 使用eclipse编写JAVA程序
  2. FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
  3. 正月初六 | 2月17日 星期二 | 快手体育拿下斯诺克赛事版权;华为推出“智慧养猪”方案;春节档总票房突破60亿元...
  4. urllib的实现---请求响应and请求头处理
  5. 在Apache服务器上安装SSL证书
  6. leetcode —— 面试题36. 二叉搜索树与双向链表
  7. 如何快速清除 Ubuntu 的系统缓存
  8. 动态规划——Russian Doll Envelopes
  9. 七十三、分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect传递参数...
  10. Python画哆啦A梦
  11. vscode 程序员鼓励师_把软萌程序猿鼓励师装进VScode?最强交互彩虹屁,GitHub2.5k星标...
  12. 服务器的所有网站共用443,多个ssl证书共用443端口apache
  13. GitHub压缩包下载URL
  14. HTML期末大作业课程设计~仿阴阳师游戏官网首页html模板(HTML+CSS)~动漫主题html5网页模板-HTML期末作业课程设计期末大作业动漫主题html5网页模板-html5网页设计源码...
  15. excel表格内容拆分_3个动图,教你学会如何让excel表格自动拆分,学会它,小白变大神...
  16. 降本增效的革命性工具: Share Creators 数字资产管理利器
  17. 笔记本电脑网络图标丢失解决流程
  18. 你喜欢这个邮箱代码吗?用代码实现邮件的撰写和发送
  19. ckeditor KindEditor eWebEditor WQeditor FreeTextbox Tinymce 几款在线编辑器的比较(附各版本demo下载地址)
  20. Python 图算法系列13-cypher 查询以及模糊查询

热门文章

  1. java学习心得与体会(自我鼓励)
  2. 如何使用GitHub客户端
  3. 怎么将webm格式转换为mp4
  4. 网络协议抓包分析实例
  5. 全国软考中级软件设计师 学习笔记-数据结构及算法部分
  6. 汇编中DOSBox的使用
  7. 【转载】斐讯K2P B1刷入金梅林固件,加koolproxy、S-S R等【V1.0尝鲜版】
  8. vue.js快速入门 1
  9. 字符集,字体,编码,代码页,输入法
  10. Chrome如何下载网页视频