创建虚拟文件系统设备文件节点_使用proc_create实例分析
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实例分析相关推荐
- linux 创建 虚拟文件系统设备 文件节点 使用 proc_create 实例 简介
proc虚拟文件系统也可以创建虚拟文件节点,实现用户空间与内核空间的交互.在驱动中创建节点,可以实现对硬件的控制.proc_create函数原型(在kernel-3.10/include/linux/ ...
- Linux创建虚拟块设备并格式化为文件系统
环境 为了方便学习文件系统的原理和原始数据的分析,需要创建虚拟块设备并格式化为ext4文件系统: Linux创建虚拟块设备 losetup命令 -a 显示所有已经使用的回环设备状态 - ...
- linux mdev 命令,linux设备驱动----利用mdev(udev)自动创建设备文件节点
1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...
- 网络与IO知识扫盲(一):Linux虚拟文件系统,文件描述符,IO重定向
系统IO原理 在 Linux 中: VFS(Virtual Filesystem Switch):虚拟文件系统,是一个目录树.树上不同的节点可以映射到物理的文件地址,可以挂载. 相当于一个解耦层,在具 ...
- Linux虚拟文件系统、文件描述符、管道
在Linux中,所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows下称为文件夹)是文件,硬件设备(键盘.监视器.硬盘.打印机等)都是文件,就连套接字(socket ...
- 50.逻辑卷管理5,文件系统相关操作,创建挂载文件系统,扩容文件
文件系统相关操作 创建文件系统 格式化 逻辑卷textlv创建好之后,就可以在上面创建文件系统,以ext4文件系统为例,应该注意的是逻辑卷的引用需要逻辑卷的设备文件,逻辑卷的设备文件有两种书写方式 以 ...
- python xml 创建多个同名子节点_果粉有福了!5分钟学会用Python统计自己最爱听的音乐...
作为一个最狂热的果粉,喜欢用苹果来播放自己最爱的音乐,随时让音乐充满自己的生活.想统计自己哪些音乐才是自己最爱吗?想知道哪些音乐是自己第一次听见就相伴终身吗?下面用Python来完成您的心愿. 下面的 ...
- 怎么linux中创建虚拟路径,linux服务器创建虚拟路径解决文件上传路径隔离问题...
需求环境 图片上传最简单的就是上传web项目下,这样图片与项目不可分离会产生很多不必要的影响.例如:重新部署项目需要把所有上传的图片再copy一份等. 图片与项目分离有好几种方式: 方式一.在linu ...
- 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 主要涉及class_create和device_create函数. 1.sys文件系统简介 (1)sys文件系统的 ...
- labview创建.netdll设置多个输出_手把手以实例教你学LabVIEW编程,条件结构编程方法...
LabVIEW又称为G语言,简单易学.形象直观,采用图形化的编程方式,是专为测试.测量和控制应用而设计的系统工程软件. 在上篇文章(请参考:顺序结构编程)中已经讲了顺序结构的编程方法,下面通过具体例子 ...
最新文章
- 如何利用Docker构建基于DevOps的全自动CI
- 再议.Net中null的使用规范
- 谈IE的浏览器模式和文档模式
- 两路虚拟化服务器,当四核多路服务器碰上虚拟化
- MapReduce经典案例——统计单词数
- 该!4G假装5G的美国运营商被起诉了
- 计算机不能代替人类英语作文,2013年雅思写作范文:电脑翻译能取代人吗?
- 600岁故宫插上科技翅膀 技术与营销的「双刃剑」?
- Jenkins中的一些问题解决(~~不断更新~~)
- 读取usb接口数据_笔记本接口不够?无须担心!小米分线器开箱初体验
- golang http长连接
- SpringBoot访问Couchbase
- 西湖论剑2021杂项(misc)--YUSA的小秘密
- 饥荒如何修改服务器人数,饥荒联机怎么改房间人数?饥荒修改房间人数方法
- Ubuntu下安装Nvidia和Intel双显卡驱动
- 计算机专业研究生面试英语翻译,20考研复试英语面试最强攻略,都是干货!
- 项目管理之项目集管理
- OpenAI发布ChatGPT!手把手debug代码!
- 3.3 设置坐标轴的长度和范围
- 如何解除网页禁止粘贴复制的情况?
热门文章
- 51nod 1833 状压dp加一点图论
- 利用memoize缓存到Redis出现多个参数同一个结果
- LeetCode Factorial Trailing Zeroes (阶乘后缀零)
- Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
- VS2005无法打开网站
- NLP语义匹配 | 经典前沿方案整理
- 【面经】各大AI研究院共35场NLP算法岗面经奉上
- 她是北大“一个人的毕业照”主人公,2010 级古生物专业独苗,十年后转行搞起了 NLP...
- 教练级导师带你打5场AI大赛,还有奖金5万元的工业级AI实战赛等你来战!
- 每日算法系列【LeetCode 1006】笨阶乘