file_operations 结构体

2023-11-13

file_operations 结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行 Linux 的 open()、write()、read()、close() 等系统调用时最终被调用。file_operations 结构体目前已经比较庞大,它的定义如下:

 定义在 linux/include/linux/fs.h

 

struct file_operations {

 struct module *owner;

//拥有该结构的模块的指针,一般为 THIS_MODULES

 loff_t (*llseek) (struct file *, loff_t, int);

//用来修改文件当前的读写位置
 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

// 从设备中同步读取数据 

 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
// 向设备发送数据

ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
//初始化一个异步的读取操作 

 ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
// 初始化一个异步的写入操作 

int (*readdir) (struct file *, void *, filldir_t);
// 仅用于读取目录,对于设备文件,该字段为NULL

 unsigned int (*poll) (struct file *, struct poll_table_struct *);
// 轮询函数,判断目前是否可以进行非阻塞的读取或写入  

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

// 执行设备 I/O 控制命令

 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
//不使用BLK 文件系统,将使用此种函数指针代替 ioctl 

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

// 在64 系统上,32位的 ioctl调用将使用此函数指针代替
 int (*mmap) (struct file *, struct vm_area_struct *);

// 用于请求将设备内存映射到进程地址恐惧爱你
 int (*open) (struct inode *, struct file *);

// 打开
 int (*flush) (struct file *, fl_owner_t id);
 int (*release) (struct inode *, struct file *);

//释放
 int (*fsync) (struct file *, struct dentry *, int datasync);

//这个方法是 fsync 系统调用的后端, 用户调用来刷新任何挂着的数据. 如果这个指针是 NULL, 系统调用返回 -EINVAL 

int (*aio_fsync) (struct kiocb *, int datasync);

//异步 fsync
 int (*fasync) (int, struct file *, int);

//通知设备 FASYNC 标志发生变化
 int (*lock) (struct file *, int, struct file_lock *);

//lock 方法用来实现文件加锁; 加锁对常规文件是必不可少的特性, 但是设备驱动几乎从不实现它.
 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

//sendpage 是 sendfile 的另一半; 它由内核调用来发送数据, 一次一页, 到对应的文件. 设备驱动实际上不实现 sendpage.
 unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

// 在进程地址空间找到一个将底层设备中的内存段映射的位置
 int (*check_flags)(int);

//这个方法允许模块检查传递给 fnctl(F_SETFL...) 调用的标志.
 int (*flock) (struct file *, int, struct file_lock *);


 ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);


 ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);


 int (*setlease)(struct file *, long, struct file_lock **);


};

 

llseek() 函数用来修改一个文件的当前读写位置,并将新位置返回,在出错时,这个函数返回一个负值。

read() 函数用来从设备中读取数据,成功时函数返回读取字节数,出错时返回一个负值

write() 函数向设备发送数据,成功时该函数返回写入的字节数。如果此函数未被实现,当用户进行 write() 系统调用时,将得到 -EINVAL 返回值

readdir() 函数仅用于目录,设备点不需要实现它

ioctl() 函数提供设备相关控制命令的实现(既不是读操作也不是写操作),当调用成功时,返回给调用程序一个非负值。内核本身识别部分控制命令,而不必调用设备驱动中的 ioctl()。如果设备不提供 ioctl() 函数,对于内核不能识别的命令,用户进行 ioctl() 系统调用时将获得 -EINVAL 返回值。

mmap() 函数将设备内存映射到进程内存中,如果设备驱动未实现此函数,用户进行 mmap()系统调用时将获得 -ENODEV 返回值。这个函数对于帧缓冲等设备特别有意义。

当用户空间调用 Linux API 函数 open() 打开设备文件时,设备驱动的 open() 函数最终被调用。驱动程序可以不实现这个函数,在这种情况下,设备的打开操作永远成功。与 open() 函数对应的是 release() 函数。

poll() 函数一般用于询问设备是否可被非阻塞地立即读写。当询问的条件未触发时,用户空间进行 select() 和 poll() 系统调用将引起进程的阻塞。

aio_read()  和 aio_write() 函数分别对与文件描述符对应的设备进行异步读、写操作。设备实现这两个函数后,用户空间可以对该设备文件描述符调用 aio_read()、aio_write() 等系统调用进行读写。


http://vicyliu1984.blog.163.com/blog/static/31541232201010773844198/


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

file_operations 结构体 的相关文章

  • 红黑树学习

    红黑树的是一种特殊的二叉搜索树 有如下性质 性质1 节点是红色或黑色 性质2 根是黑色 性质3 每个叶节点是黑色的 性质4 每个红色节点的两个子节点都是黑色 从每个叶子到根的所有路径上不能有两个连续的红色节点 性质5 从任一节点到其每个叶子
  • 2.6内核的通用的编译步骤

    2 6内核的通用的编译步骤 1 下载源码并解压 虽然我们可以将内核源码存放在任何自己找得到的地方 但通常还是会将内核源码下载到 usr src目录并解压 cd usr src wget ftp kernel org pub linux ke
  • linux内核-系统调用execve()

    读者在linux内核 系统调用fork vfork与clone中已经看到 进程通常是按其父进程的原样复制出来的 在多数情况下 如果复制出来的子进程不能与父进程分道扬镳 走自己的路 那就没多大意义 所以 执行一个新的可执行程序是进程生命历程中
  • ARM 浮点运算详解

    一 早期ARM上的浮点模拟器 早期的ARM没有协处理器 所以浮点运算是由CPU来模拟的 即所需浮点运算均在浮点运算模拟器 float math emulation 上进行 需要的浮点运算 常要耗费数千个循环才能执行完毕 因此特别缓慢 直到今
  • linux的自旋锁struct spinlock_t的使用

    在linux中提供了一些机制用来避免竞争条件 最简单的一个种就是自旋锁 例如 当一个临界区的数据在多个函数之间被调用时 为了保护数据不被破坏 可以采用spinlock来保护临界区的数据 当然还有一个就是信号量也是可以实现临界区数据的保护的
  • linux的dirty page回写磁盘过程中是否允许并发写入更新page?

    概述 众所周知Linux内核write系统调用采用pagecache机制加速写入过程 避免write系统调用长时间block应用进程 用户态进程执行write调用的时候 内核只是将用户态buffer copy到内核的pagecache当中
  • linux内核分析:进程通讯方式

    信号 一旦有信号产生 我们就有下面这几种 用户进程对信号的处理方式 1 执行默认操作 Linux 对每种信号都规定了默认操作 例如 上面列表中的 Term 就是终止进程的意思 Core 的意思是 Core Dump 也即终止进程后 通过 C
  • CPU特权级保护

    1 特权级 1 1特权级 处理器段保护机制可以识别0 3共4级特权级 数值越大 特权越小 处理器通过识别CPL DPL RPL这三种特权级来进行特权级校验 1 CPL CPL是当前正在执行程序或任务的特权级 它存放在CS和SS段寄存器的0位
  • Android:在争议中逃离Linux内核的GPL约束

    原文地址 http tech sina com cn s s 2012 05 28 09447177318 shtml 为这个题材起名 我思考了许久 GPL 是著名的开放源代码许可协议 Linux 内核开源项目正是在 GPL 的庇佑之下 十
  • 第十三章 网络命名空间(内核源码实现)--基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 有两篇翻译博文 Lxc之二 网络设置 和 linuxnamespace 之使用 LXC文章中关于网络的设置是从用户空间配置的 从该文章可
  • linux kerne新版本编号?

    今天看到linux内核版本号都到3 4了 心中非常惊讶 为什么现在版本飞这么快了 于是一番google 终于找到了两篇文章 大家可以看看 Linux kernel version bumped up to 3 0 as 20th birth
  • 第十四章 netlink机制--基于Linux3.10

    Netlink基于网络的消息机制 能够让用户和内核空间进行通信 12 3节提到的ifconfig是使用ioctl方法和内核通信的 而ip命令则是使用netlink和内核通信的 该机制初衷是为网络服务的 但是现在起应用范围已经大大扩展 14
  • file_operations 结构体

    file operations 结构体中的成员函数是字符设备驱动程序设计的主体内容 这些函数实际会在应用程序进行 Linux 的 open write read close 等系统调用时最终被调用 file operations 结构体目前
  • 构建Buildroot根文件系统(I.MX6ULL)

    Busybox构建的根文件系统只有一些常用的命令和文件 Buildroot不仅集成了 busybox 而且还集成了各种常见的第三方库和软件 开发环境 Buildroot 版本 buildroot 2019 02 6 tar gz 虚拟机 4
  • linux内核对于指令异常的处理

    1 处理流程 以arm64来介绍一下流程 如果在用户层发生指令异常时 首先进入入口el0 undef arch arm64 kernel entry s el0 undef Undefined instruction enable inte
  • ubuntu从内核源代码编译内核及替换内核

    1 下载ubuntu对应的linux内核源代码 apt catch search linux source 查看当前linux内核版本 apt get install linux source lt 对应的内核版本好 gt 下载对应的lin
  • MPC8314 (e300核) uboot 调试

    历经2个多月 完成了MPC8314最小系统 uboot 及Linux内核和根文件系统的调试 这是我第一次从头开始做小系统和内核的移植工作 虽然调试的比较辛苦 但是收获还是很多的 下面就介绍一下调试的过程和一些原理性的东西 1 MPC8314
  • Linux内核文件系统知识大总结

    1 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • Linux slab 分配器剖析

    http www ibm com developerworks cn linux l linux slab allocator 了解 Linux 内存管理的方式 良好的操作系统性能部分依赖于操作系统有效管理资源的能力 在过去 堆内存管理器是
  • Linux中select poll和epoll的区别

    select的本质是采用32个整数的32位 即32 32 1024来标识 fd值为1 1024 当fd的值超过1024限制时 就必须修改FD SETSIZE的大小 这个时候就可以标识32 max值范围的fd 对于单进程多线程 每个线程处理多

随机推荐

  • 搜索引擎和知识图谱那些事 (上).基础篇

    这是一篇基础性文章 主要介绍搜索引擎和知识图谱的一些原理 发展经历和应用等知识 希望文章对你有所帮助 如果有错误或不足之处 还请海涵 参考资料见后 一 搜索引擎 一 搜索引擎的四个时代 根据张俊林大神的 这就是搜索引擎 这本书中描述 推荐大
  • C++ stl容器

    1 std string string constructor include
  • 有哪些通俗易懂的例子可以解释 IaaS、PaaS、SaaS 的区别?

    首先 什么 云 很多年前 我们家住一小平房 喝水就喝院子里的井水 冬天取暖自己烧煤炉 后来经济状况好了 搬进了楼房 喝水喝上了集中供应的自来水 冬季用上了集中供应的暖气 再也不用打水和掏黑煤球 这就是 云 的基本概念 过去企业数据维护需要恒
  • 声纹识别中pooling总结

    1 Statistics Pooling http danielpovey com files 2017 interspeech embeddings pdf The statistics pooling layer calculates
  • Python手册(Standard Library)--math+random

    文章目录 math random math math import math math truck x 取整 math ceil x 天花板 math floor x 地板 math exp x math log x b math e 计算
  • 机器学习与数学基础知识(一)

    最近 朋友分享给我一套 七月在线 的机器学习视频 我几经思量之后 决定从视频量最少的数学基础部分开始看起 今天学习完了第一个视频 长达2小时 感觉老师讲的挺不错的 以前自己就对机器学习很感兴趣 做了一些了解和尝试性地学习 也看了一点经典的林
  • 专升本数学——极限与连续(二)笔记

    一 无穷大量与无穷小量 1 定义 无穷小量 如果 lim f x 0 则称 f x 是此极限条件下的无穷小量 本质 以 0 为极限的函数 x 2 是 x gt 0 时的无穷小量 无穷大量 如果 lim f x 无穷 则称 f x 是此极限条
  • 详解grep(一)grep基础、语法格式、常用选项与退出状态码的案例解析

    目录 一 GREP基础 1 1 grep的全称 1 2 grep语法格式 二 grep常用选项 2 1 长短选项的说明 2 2 显示常用信息 2 3 控制匹配模式的选项 2 4 控制输出内容的选项 2 5 控制输出行前缀的选项 2 6 控制
  • java学习笔记——JDBC 中 ResultSet、ResultSetMetaData配置对象的属性、批处理

    使用ResultSet ResultSetMetaData操作数据表 SELECT public void test1 1 获取连接 Connection conn null PreparedStatement ps null 4 执行 S
  • SpeechSynthesisUtterance 语音合成使用 文字语音播报

    一 关于HTML5语音Web Speech API HTML5中和Web Speech相关的API实际上有两类 一类是 语音识别 Speech Recognition 另外一个就是 语音合成 Speech Synthesis 这两个名词听上
  • ESP32(MicroPython) 编码器电机闭环控制

    本人最近查找资料时 发现ESP32上的使用MicroPython的编码器电机相关程序较少 闭环控制程序都是Pyboard上的 与ESP32不完全兼容 本人通过micropython编程 esp32 drv8833 霍尔编码器 micropy
  • 八大排序汇总

    目录 1 插入排序 2 希尔排序 3 选择排序 4 堆排序 5 冒泡排序 6 快速排序 总体思想 1 左右指针法 2 挖坑法 3 前后指针法 4 时间复杂度与三数取中 5 小区间优化 6 针对所有数据重复的优化 7 非递归实现快排 8 稳定
  • 《我在大学挺好的》之——选择了计算机专业

    大家好 我是小鱼儿 Hello 各位铁汁们 今天咱不聊技术 谈我是为什么选择计算机专业 同时聊聊我的最近一年的经历 以及我为啥要写博客 大家完全可以把这篇文章看作是一次闲谈 哈哈 目录 我为啥要选择计算机专业 我最近半年经历了什么 我的大学
  • 【hw1】b站刘二大人,第八讲课后题Titanic

    pre 代码没啥新意 很多人都分享过了 主要想记录一下自己遇到的bug以及收获 bug 1 RuntimeError mat1 and mat2 shapes cannot be multiplied 32x5 and 6x3 nn lin
  • docker启动MYSQL8并挂载数据目录

    1 创建需要docker挂载的数据目录 mkdir p datah mydata mysql conf mkdir p datah mydata mysql data mkdir p datah mydata mysql log mkdir
  • 解析 global-metadata.dat 文件_自己动手做简历解析工具

    当我还是一名大学生的时候 我很好奇自动提取简历信息是如何工作的 我将准备各种格式的简历 并上传到招聘网站 以测试背后的算法是如何工作的 我想自己尝试建一个 因此 在最近几周的空闲时间里 我决定构建一个简历解析器 一开始 我觉得很简单 只是用
  • 备战数学建模42-缺失值和异常值的处理方法(攻坚战6)

    在数据建模中 对给出的数据进行预测处理是很重要的 当然一般考虑有归一化或者规范化等方法对数据进行预处理 这都是在数据完整和没有异常的情况下 需要考虑的 当数据量非常大的时候 往往容易出现数据缺失或者异常的现象 如果数据有确实或者有异常值 我
  • windows xp 驱动开发(七)WDK源码 UsbSamp例子的编译及使用

    转载请标明是引用于 http blog csdn net chenyujing1234 参考文章 http msdn microsoft com zh cn library windows hardware ff544747 欢迎大家提出意
  • Ubuntu android adb环境变量配置方法AndroidStudio安装教程

    UbuntuT android adb环境变量配置方法 https wenku baidu com view 61d31d4ef6335a8102d276a20029bd64793e6275 html AndroidStudio安装教程 u
  • file_operations 结构体

    file operations 结构体中的成员函数是字符设备驱动程序设计的主体内容 这些函数实际会在应用程序进行 Linux 的 open write read close 等系统调用时最终被调用 file operations 结构体目前