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 创建 虚拟文件系统设备 文件节点 使用 proc_create 实例 简介

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

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

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

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

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

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

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

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

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

  6. 50.逻辑卷管理5,文件系统相关操作,创建挂载文件系统,扩容文件

    文件系统相关操作 创建文件系统 格式化 逻辑卷textlv创建好之后,就可以在上面创建文件系统,以ext4文件系统为例,应该注意的是逻辑卷的引用需要逻辑卷的设备文件,逻辑卷的设备文件有两种书写方式 以 ...

  7. python xml 创建多个同名子节点_果粉有福了!5分钟学会用Python统计自己最爱听的音乐...

    作为一个最狂热的果粉,喜欢用苹果来播放自己最爱的音乐,随时让音乐充满自己的生活.想统计自己哪些音乐才是自己最爱吗?想知道哪些音乐是自己第一次听见就相伴终身吗?下面用Python来完成您的心愿. 下面的 ...

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

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

  9. 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 主要涉及class_create和device_create函数. 1.sys文件系统简介 (1)sys文件系统的 ...

  10. labview创建.netdll设置多个输出_手把手以实例教你学LabVIEW编程,条件结构编程方法...

    LabVIEW又称为G语言,简单易学.形象直观,采用图形化的编程方式,是专为测试.测量和控制应用而设计的系统工程软件. 在上篇文章(请参考:顺序结构编程)中已经讲了顺序结构的编程方法,下面通过具体例子 ...

最新文章

  1. 如何利用Docker构建基于DevOps的全自动CI
  2. 再议.Net中null的使用规范
  3. 谈IE的浏览器模式和文档模式
  4. 两路虚拟化服务器,当四核多路服务器碰上虚拟化
  5. MapReduce经典案例——统计单词数
  6. 该!4G假装5G的美国运营商被起诉了
  7. 计算机不能代替人类英语作文,2013年雅思写作范文:电脑翻译能取代人吗?
  8. 600岁故宫插上科技翅膀 技术与营销的「双刃剑」?
  9. Jenkins中的一些问题解决(~~不断更新~~)
  10. 读取usb接口数据_笔记本接口不够?无须担心!小米分线器开箱初体验
  11. golang http长连接
  12. SpringBoot访问Couchbase
  13. 西湖论剑2021杂项(misc)--YUSA的小秘密
  14. 饥荒如何修改服务器人数,饥荒联机怎么改房间人数?饥荒修改房间人数方法
  15. Ubuntu下安装Nvidia和Intel双显卡驱动
  16. 计算机专业研究生面试英语翻译,20考研复试英语面试最强攻略,都是干货!
  17. 项目管理之项目集管理
  18. OpenAI发布ChatGPT!手把手debug代码!
  19. 3.3 设置坐标轴的长度和范围
  20. 如何解除网页禁止粘贴复制的情况?

热门文章

  1. 51nod 1833 状压dp加一点图论
  2. 利用memoize缓存到Redis出现多个参数同一个结果
  3. LeetCode Factorial Trailing Zeroes (阶乘后缀零)
  4. Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
  5. VS2005无法打开网站
  6. NLP语义匹配 | 经典前沿方案整理
  7. 【面经】各大AI研究院共35场NLP算法岗面经奉上
  8. 她是北大“一个人的毕业照”主人公,2010 级古生物专业独苗,十年后转行搞起了 NLP...
  9. 教练级导师带你打5场AI大赛,还有奖金5万元的工业级AI实战赛等你来战!
  10. 每日算法系列【LeetCode 1006】笨阶乘