Linux驱动中的异步函数(aio_read和aio_write)
Linux驱动中的异步函数(aio_read和aio_write)
我们可以在signal_handler使用了read和write函数处理设备文件的读写操作。然而这两个函数可以分别用aio_read和aio_write代替。在本节将重新改造signal驱动,使用aio_read和aio_write函数来处理设备文件的读写操作,新的Linux驱动源代码文件是aio_signal.c。这个文件和13.1.3节编写的signal.c文件的内容基本相同,只是添加了如下两个函数。
// 设备文件的aio_read函数
static ssize_t signal_aio_read(struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos)
{
return signal_read(iocb->ki_filp, (char*)iov->iov_base,iocb->ki_nbytes, &pos);;
}
// 设备文件的aio_write函数
static ssize_t signal_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long niov, loff_t pos)
{
return signal_write(iocb->ki_filp, (char*)iov->iov_base,iocb->ki_nbytes, &pos);;
}
这两个函数的参数完全相同。其中kiocb结构体类似于aiocb结构体,aiocb结构体中很多数据(如aio_nbytes、aio_offset等)在kiocb中都可以通过对应的成员变量获取。而iov可以获取用于读写数据的缓存区,也就是aiocb.aio_buf指向的内存区域。除此之外,还可以通过iovec.iov_len获取缓存区的字节长度。pos参数和kiocb.ki_pos都可以获取读写数据的偏移量,使用哪个都可以。只是pos参数和read、write函数不同。在aio_read和aio_write函数中pos参数变成了实际的值,而不是loff_t指针类型参数。也就是不能在aio_read和aio_write函数中修改pos参数的值(修改了也没用)。
从上面实现的aio_read和aio_write函数可以看出,在这两个函数中并未实现具体的代码,而是调用了已经实现的signal_read和signal_write函数。这就会引出一个问题,如果file_operations结构体同时初始化异步(aio_read和aio_write)和同步(read和write)函数,那么系统会使用同步还是异步读写方式处理对设备文件的读写操作呢?
如果同时指定同步和异步读写函数,系统会使用read和write函数来处理设备文件的读写操作。如果想使用aio_read和aio_write函数来处理设备文件的读写操作,就不能指定read和write函数。因此,本节的示例需要按如下方式修改file_operations结构体初始化的代码。
static struct file_operations dev_fops =
{
.owner = THIS_MODULE,
.poll = signal_poll,
.fasync = signal_fasync,
.aio_read=signal_aio_read,
.aio_write=signal_aio_write
};
现在Linux驱动程序已经修改完毕,最后执行build.sh脚本文件编译和安装本节实现的Linux驱动。为了和13.1.3节实现的signal驱动区分开。本节实现的Linux驱动建立的设备文件名是aio_signal。
注意:file_operations结构体的aio_read、aio_write和read、write都能处理同步和异步I/O操作。只是aio_read和aio_write函数可以获取更多的异步I/O的数据,并可以更好地控制异步I/O。虽然大多数字符设备都不使用aio_read和aio_write函数(只有一些块设备,如磁带机,为了提高读写效率会使用它们),但如果想对AIO有更多的控制,也可以考虑使用aio_read和aio_write函数,尽管这两个函数看起来比read和write函数复杂一些。
Linux驱动中的异步函数(aio_read和aio_write)的更多相关文章
- 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)
static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- 如何在单元测试中测试异步函数,block回调这种
大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...
- JavaScript中的异步函数
JavaScript中的异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题.为此, ECMAScript 对函数进行了扩展,为其增加了两个新关键字: async 和 aw ...
- Linux设备驱动中的异步通知与异步I/O
异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...
- Linux 驱动框架---驱动中的异步
异步IO是对阻塞和轮询IO的机制补充,所谓异步IO就是在设备数据就绪时主动通知所属进程进行处理的机制.之所以说是异步是相对与被通知进程的,因为进程不知道也无法知道什么时候会被通知:这一机制非常类似于硬 ...
- Linux驱动中的platform总线分析
copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...
- Linux驱动中的EPROBE_DEFER是个啥
Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号.比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是 -EPRBO ...
- Linux驱动实践:中断处理函数如何【发送信号】给应用层?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()
刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...
随机推荐
- CRAPS赌博小游戏
游戏规则 代码实现 首先把这个规则用代码写出来 再在它基础上进行简单的可视化(主要是利用Easygui的界面) 最后查缺补漏,看看有没有什么Bug 利用pyinstaller -F -w -i xx. ...
- Oracle【ORA-00600 internal error code arguments [2662]】恢复一例
背景 1.数据库版本:11.2.0.4 2.未开启归档 3.没有备份:无RMAN备份.无DUMP备份 4.数据库redo log全部删除. 解决思路: Oracle 的隐含参数: _allow_res ...
- 【进阶篇】基于 Redis 实现分布式锁的全过程
目录 前言 一.关于分布式锁 二.RedLock 红锁(不推荐) 三.基于 setIfAbsent() 方法 四.使用示例 4.1RedLock 使用 4.2setIfAbsent() 方法使用 五. ...
- Swift中Tuple的比较
Swift中Tuple的比较遵循如下规则: 1 被比较的Tuple中包含的元素个数必须一样,并且对应元素的类型也必须一样: 2 比较的结果由整个Tuple的比较结果来决定.比如,如果是相等比较,那么必 ...
- idea推送代码忽略指定文件,文件夹配置
idea推送代码忽略指定文件,文件夹配置 今天碰到一个问题,配置了.gitignore文件后没有生效,整了半天,最后发现一种直接配置的方法,可以指定文件夹,或者指定文件类型 打开设置
- Go post重定向的两种方式
1.Location 2.http.Redirect 代码 /index -> /login -> /home package main import ( "fmt" ...
- Android 13 - Media框架(28)- MediaCodec(三)
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们了解到 ACodec 执行完 start 流程后,会把所有的 input buffer 都提交给 MediaCodec 层,MediaCo ...
- Android 13 - Media框架(20)- ACodec(二)
关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节开始我们就来学习 ACodec 的实现 1.创建 ACodec ACodec 是在 MediaCodec 中创建的,这里先贴出创建部分的代码: ...
- 如何判断7z压缩文件格式
如果压缩文件的后缀不是7z,那么如何如何判断文件格式呢?那就是通过文件头判断. 7z文件头前6位,固定是:377ABCAF271C,其中前两位37.7A分别是"7""z& ...
- 不到200行用Vue实现类似Swiper.js的轮播组件
前言 大家在开发过程中,或多或少都会用到轮播图之类的组件,PC和Mobile上使用 Swiper.js ,小程序上使用swiper组件等. 本文将详细讲解如何用Vue一步步实现的类似Swiper.js ...