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)的更多相关文章

  1. 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)

    static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .

  2. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  3. 如何在单元测试中测试异步函数,block回调这种

    大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...

  4. JavaScript中的异步函数

    JavaScript中的异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题.为此, ECMAScript 对函数进行了扩展,为其增加了两个新关键字: async 和 aw ...

  5. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  6. Linux 驱动框架---驱动中的异步

    异步IO是对阻塞和轮询IO的机制补充,所谓异步IO就是在设备数据就绪时主动通知所属进程进行处理的机制.之所以说是异步是相对与被通知进程的,因为进程不知道也无法知道什么时候会被通知:这一机制非常类似于硬 ...

  7. Linux驱动中的platform总线分析

    copy from :https://blog.csdn.net/fml1997/article/details/77622860 概述 从Linux2.6内核起,引入一套新的驱动管理和注册机制:pl ...

  8. Linux驱动中的EPROBE_DEFER是个啥

    ​Linux kernel 驱动中,有不少驱动会引用到 EPROBE_DEFER 这个错误号.比如下面这个例子,对 devm_gpiod_get 的返回值进行判断,如果有错误且错误号不是 -EPRBO ...

  9. Linux驱动实践:中断处理函数如何【发送信号】给应用层?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  10. react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()

    刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...

随机推荐

  1. Oracle、达梦:获取两个表中差异的数据:minus(减法)

    Oracle.达梦:获取两个表中差异的数据:minus(减法) mysql没有.需要用别的方式替换 表结构必须一致,数据也必须一致才能减去 真实意思:T_1中的数据减去T_2中的数据.返回还多余的数据 ...

  2. 深入学习和理解Django模板层:构建动态页面

    title: 深入学习和理解Django模板层:构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 t ...

  3. 详解Python 中可视化数据分析工作流程

    本文分享自华为云社区<Python 可视化数据分析从数据获取到洞见发现的全面指南>,作者:柠檬味拥抱. 在数据科学和分析的领域中,可视化是一种强大的工具,能够帮助我们理解数据.发现模式,并 ...

  4. OpenNESS NTS 的前世今生

    目录 文章目录 目录 NEV SDK NEV SDK 的软件架构 NEV SDK 的持续演进 OpenNESS NTS NTS 在 VM 场景中的应用 NTS 在 Container 场景中的应用 N ...

  5. UnityShader数学基础篇

    Mathf Mathf和Math 1.Math是C#中封装好的用于数学计算的工具类,位于System命名空间中. 2.Mathf是Unity中封装好的用于数学计算的工具结构体,位于UnityEngin ...

  6. 节能降耗 | AIRIOT智慧电力综合管理解决方案

      电力技术的发展推动各行各业的生产力,与此同时,企业中高能耗设备的应用以及输配电过程中的电能损耗,也在一定程度上加剧了电能供应压力.以工业制造业为例,企业的管理水平.能耗结构.生产组织方式都关系到能 ...

  7. MinIo对象存储文件上传,下载,预览,批量上传,创建桶等

    MinIo 操作工具类 MinIo 旧中文文档 MinIo 英文文档 MinIo 官网地址 https://min.io/ package com.ming.utils; import io.mini ...

  8. .eslintrc.js 文件语法规则定义

    添加某个全局变量: globals: { 'ActiveXObject': true },

  9. RTOS官方文档学习

    任务与协程 区别 一个程序可以只有任务.只有协程.二者都有,但不可以通过队列/信号量互相传递数据 任务特点 任务之间可以互相独立 每个任务分配自己的堆栈,提高了RAM使用率 操作简单.按优先级抢占式执 ...

  10. 椭圆曲线密码学(ECC)加解密,附带python代码

    想起来很久没写博客了,刚好今天要写实验报告,随便把之前的也完成吧 1.椭圆曲线概念 椭圆曲线在经过化解后,可以用这条式子表达:E:y²=x³+ax+b 其背后的密码学原理,是基于椭圆曲线离散对数问题, ...