proc虚拟文件系统也可以创建虚拟文件节点,实现用户空间与内核空间的交互。在驱动中创建节点,可以实现对硬件的控制。proc_create函数原型(在kernel-3.10/include/linux/proc_fs.h文件)如下所示:

static inline struct proc_dir_entry *proc_create(
const char *name, umode_t mode, struct proc_dir_entry *parent,const struct file_operations *proc_fops)
{return proc_create_data(name, mode, parent, proc_fops, NULL);
}

name:表示你要创建的设备节点的名称,可随意命名即可;
mode:表示节点的权限,一般赋值0644;
parent:表示父节点,如果直接在proc目录创建节点,直接赋值NULL即可;
proc_fops:表示与节点相关联的file_operations;

如下代码是我实现的一个test程序,可供参考学习proc_create的使用:

#include <linux/init.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/ioctl.h>
#include <linux/uaccess.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/wait.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/pinctrl/consumer.h>
#include <linux/of_gpio.h>
#include <linux/delay.h>
#include <linux/types.h>
#include <linux/proc_fs.h>#define BUFSIZE  1024 static char *buf;
static unsigned int len;/************************ file_operations->open* 无操作***********************/static int test_proc_open(struct inode *inode, struct file *file)
{return 0;
}/************************* file_operations->read* 可以在adb工具进入机器的pro目录,执行adb shell && cd proc && cat tets_rw,* 即可读出节点test_rw的内容是12345************************/static ssize_t test_proc_read(struct file *file,char __user *buffer,size_t count, loff_t *f_pos)
{if(*f_pos > 0)return 0;printk("---start read---\n");printk("the  string is >>>>> %s\n", buf);if(copy_to_user(buffer, buf, len))return -EFAULT;*f_pos = *f_pos + len;return len;
}/************************* file_operations->write* 可以在adb工具进入机器的pro目录,* 执行adb shell && cd proc && echo 12345 > tets_rw,即可把12345写入节点test_rw************************/static ssize_t test_proc_write(struct file *file, const char __user *buffer,size_t count, loff_t *f_pos)
{if(count <= 0)return -EFAULT;printk("---start write---\n");len = count > BUFSIZE ? BUFSIZE : count;// kfree memory by kmalloc beforeif(buf != NULL)kfree(buf);buf = (char*)kmalloc(len+1, GFP_KERNEL);if(buf == NULL){printk("test_proc_create kmalloc fail!\n");return -EFAULT;}//memset(buf, 0, sizeof(buf));memset(buf, 0, len+1);if(copy_from_user(buf, buffer, len))return -EFAULT;printk("test_proc_write writing :%s",buf);return len;
}static struct file_operations test_fops = {.owner = THIS_MODULE,.open    = test_proc_open,
//  .release = single_release,.read    = test_proc_read,
//  .llseek = seq_lseek,.write     = test_proc_write,
};static int __init test_init(void)
{struct proc_dir_entry* file;//创建proc文件并关联file_operationsfile = proc_create("test_rw", 0644, NULL, &test_fops);if (!file)return -ENOMEM;printk("test_rw init success!\n");return 0;
}static void __exit test_exit(void)
{remove_proc_entry("test_rw", NULL);printk("test_exit\n");}module_init(test_init);
module_exit(test_exit);MODULE_AUTHOR("caizd");
MODULE_DESCRIPTION("Proc_create Test Driver");
MODULE_LICENSE("GPL");

代码编进kernel之后,可以在adb工具验证是否可行。

C:\Users\asus>adb shell
root@inwatch_portal:/ # cd proc
cd proc
root@inwatch_portal:/proc # echo 12345 > test_rw
echo 12345 > test_rw
root@inwatch_portal:/proc # cat test_rw
cat test_rw
12345
root@inwatch_portal:/proc #

linux 创建 虚拟文件系统设备 文件节点 使用 proc_create 实例 简介相关推荐

  1. Linux创建虚拟块设备并格式化为文件系统

    环境 为了方便学习文件系统的原理和原始数据的分析,需要创建虚拟块设备并格式化为ext4文件系统: Linux创建虚拟块设备 losetup命令     -a 显示所有已经使用的回环设备状态     - ...

  2. linux mdev 命令,linux设备驱动----利用mdev(udev)自动创建设备文件节点

    1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...

  3. 【Linux】Linux的虚拟文件系统

    Linux的虚拟文件系统与实际文件系统的关系如下所示: VFS的原理 各种文件系统之所以有区别,就在于它们的目录文件结构各不相同,随之而来的也就是对文件目录的操作函数也不相同.对于前者可以在保留原系统 ...

  4. 网络与IO知识扫盲(一):Linux虚拟文件系统,文件描述符,IO重定向

    系统IO原理 在 Linux 中: VFS(Virtual Filesystem Switch):虚拟文件系统,是一个目录树.树上不同的节点可以映射到物理的文件地址,可以挂载. 相当于一个解耦层,在具 ...

  5. linux的虚拟文件系统四(文件系统理论)

    1. linux文件系统 文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构.linux会将这些分属不同分区的.单独的文件系统按一定的方式形成一个系统的总的 ...

  6. Linux虚拟文件系统、文件描述符、管道

    在Linux中,所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows下称为文件夹)是文件,硬件设备(键盘.监视器.硬盘.打印机等)都是文件,就连套接字(socket ...

  7. 怎么linux中创建虚拟路径,linux服务器创建虚拟路径解决文件上传路径隔离问题...

    需求环境 图片上传最简单的就是上传web项目下,这样图片与项目不可分离会产生很多不必要的影响.例如:重新部署项目需要把所有上传的图片再copy一份等. 图片与项目分离有好几种方式: 方式一.在linu ...

  8. linux VFS 虚拟文件系统 简介 super_block inode dentry file

    1.简介 1.Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文 ...

  9. (转)linux内核虚拟文件系统浅析

    转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 ###### 虚拟文件系统(VFS) 在我看来, "虚拟"二字主 ...

最新文章

  1. Pandas_transform的用法
  2. 在博客中加入“花絮”效果
  3. Objective C 链式调用
  4. ThinkCMF 和 OneThink内容管理系统对比
  5. 自定义ViewGroup实现仿微信图片选择器
  6. AtCoder Grand Contest 025
  7. 如何将QVTKWidget嵌入到QT窗体,实现点云的显示?
  8. 多元统计分析及R语言建模_自定义函数: msaR.R
  9. 交流:Ghost版系统安装简单分析
  10. 用python画箱线图_python绘制箱线图
  11. php 专业英语,给大家推荐几个专业英语翻译功能强大的网站
  12. Unity3D游戏高性能战争迷雾系统实现
  13. detectron中的blobs
  14. M - Help Hanzo (大数区间素数筛)
  15. 延边大学计算机科学与技术专业(研)解读
  16. JVM 相关 - 深入 JVM 的钥匙 WhiteBox API
  17. 排球分组循环交叉编排_【排球】二青会体校组男子排球(B组)预赛落幕 海口队顺利晋级决赛...
  18. 【SQL】利用sql语句在mysql的表中插入date类型的数据,
  19. 如何放大图片不模糊?教你一招
  20. 使用Git将代码上传到Gitee仓库

热门文章

  1. 自定义listview
  2. Altiris 7.1 插件
  3. Cloudify — Plugins
  4. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架
  5. Linux Kernel TCP/IP Stack — Overview
  6. 分布式消息队列 — RabbitMQ(3)
  7. TCP/IP协议概述
  8. jQuery第二天(操作样式、属性、节点、动画)
  9. R语言修改标题、坐标轴刻度、坐标轴名称的大小(cex.axis、cex.lab、cex.main函数)...
  10. 苹果回应中情局攻击事件:许多漏洞已经得到解决