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. 01 elasticsearch学习笔记-环境安装

    docker-compose安装EFK git clone https://github.com/haimait/docker_compose_efk docker-compose up -d Flu ...

  2. 安装assimp失败

    使用Cmake和Visual Studio编译assimp成功(包括Debug和Release),并且安装Release版本也成功,但安装debug版本失败,安装输出信息如下: 通过提示找到脚本文件, ...

  3. 报错:Client does not support authentication protocol requested by server; consider upgrading MySQL cli

    IDEA启动项目登录时显示用户或密码错误 或者 连接mysql数据库时报错 原因: mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是ca ...

  4. ShareConnect即将寿终正寝 Splashtop远程桌面会是最好的替代品

    大家好,我是没有感情的翻译机器人,又见面了.同类产品ShareConnect即将退市,官方大大搞了个新闻稿.君叫臣翻,臣不得不翻.------没有感情的分割线------ShareConnect的使用 ...

  5. ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)

    ASP.NET Core RazorPages中,我们可以在页面模型基类中重载OnPageHandlerExecuting方法. 下面的例子中,BaseModel继承自 PageModel,是所有页面 ...

  6. Windows下生成RSA公钥和私钥

    打开E:\MAMP\bin\apache(服务器安装文件目录)文件夹下的 bin 文件夹,执行 openssl.exe 文件 生成 RSA 私钥,出现图中提示说明生成成功 genrsa -out rs ...

  7. 低代码与 Echarts 融合:开启智能可视化的创新浪潮

    前言 在当今数字化时代,数据的价值愈发凸显,企业和组织需要有效地利用数据来作出战略决策和优化业务流程.可视化是一种强大的工具,可以将复杂的数据以直观的方式展现出来,帮助用户更好地理解和分析数据.近年来 ...

  8. kubernetes使用metrics-server进行资源监控

    kubernetes资源监控 1. 查看集群资源状况 ·k8s集群的master节点一般不会跑业务容器· kubectl get cs #查看master资源状态 kubectl get node # ...

  9. Maven工程报错org.codehaus.plexus.component.repository.exception.ComponentLookupException

    本人电脑环境:jdk1.8,idea2021,maven 3.6.3 问题:今天调整maven项目的三个配置参数后,idea报了下面的错误 org.codehaus.plexus.component. ...

  10. 7.20考试总结(NOIP模拟21)[Median·Game·Park]

    雨滴降落的速度是每秒十米,我该用怎么样的速度,才能将你挽留? 前言 关于语文素养如何限制OI水平2,正好现在文化课巨佬们正在考语文(那我走???) T1 我以为整数是不用输出 .0 的,然后喜挂 30 ...