Linux设备驱动程序 之 异步通知

尽管大多数时候阻塞型和非阻塞型操作的组合以及select方法可以有效的查询设备,但是某些时候用这种技术处理就效率不搞了;

例如:一个进程在低优先级执行长的循环计算,但又需要尽可能快的处理输入数据,如果该进程正在响应来自数据收集外设新观测的数据,则应该在新数据可用时理解知晓并处理;我们可以使用poll来检查,但是跟好的做法是通过异步通知,应用程序可以再数据可用时收到一个信号,而不需要不停的使用轮询来关注数据;

从应用程序的角度

启用文件的异步通知机制,用户程序必须执行两个步骤:

1. 需要制定一个进程作为文件的“属主(owner)”;当进程使用fcntl系统调用执行F_SETOWN命令时,属主进程的ID号就被保存在filp->f_owner中,这样做的目的是为了让内核知道该通知哪个进程;

2. 为了真正启用异步通知机制,用户程序还必须在设备中设置FASYNC标志,这是通过fcntl的F_SETFL命令完成的;

执行完这两个步骤之后,输入文件就可以在新数据到达时发送一个SIGIO信号,该信号被发送到存放在filp->f_owner中的进程,如果f_owner是负值,信号会被发送到该进程组;

使用事例如下:

1 signal(SIGIO, &input_handler);
2 fcntl(STDIN_FILENO, F_SETOWN, getpid());
3 oflags = fcntl(STDIN_FILENO, F_GETFL);
4 fcntl(STDIN_FILENO, F_SETFL, oflags|FASYNC);

不是所有设备都支持异步通知,我们可以选择不提供异步通知功能;应用程序通常假设只有套接字和终端才有异步通知能力;

当进程收到SIGIO信号时,并不知道是那个输入文件有了新的输入,如果有多个文件可以异步通知输入进程,则应用程序仍然需要借助poll或者select来确定输入的源;

从驱动程序角度

驱动程序实现异步通知的步骤如下:

1. F_SETOWN被调用时对filp->f_owner赋值;

2. 在执行F_SETFL启用FASYNC时,调用驱动程序的fasync方法,只要filp->f_flags中的FASYNC标志发生了变化,就会调用该方法,以便把这个变化通知驱动程序,使其能正确响应;文件打开时,FASYNC标志被默认为是清除的;

其中fasync方法即为file_operations中的fasync方法:

1 int (*fasync) (int, struct file *, int);

3. 当数据到达时,在所有注册为异步通知的进程都会被发送一个SIGIO信号;

驱动程序需要调用下面两个函数来完成异步通知功能:

1 int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
1 void kill_fasync(struct fasync_struct **fp, int sig, int band)

当一个打开的文件的FASYNC标志被修改时,调用fasync_helper以便从相关的进程列表中增加或者删除文件;除了最后一个参数之外,其他参数都是提供给fasync方法相同的参数,可以直接传递;

在数据到达时,可以调用kill_fasync通知所有相关进程,它的参数包括要发送的信号(通常是SIGIO)和带宽(band),后者几乎总是POLL_IN,但是在网络待命中,可以用来发送紧急或者带外数据;

当文件关闭时必须调用fasync方法,以便从活动的异步读取进程列表中删除该文件;尽管调用只在filp->f_flags设置了FASYNC标志时才是必须的,但不管什么情况,调用它不会有坏处,并且也是普遍的实现方法;

原文地址:https://www.cnblogs.com/wanpengcoder/p/11760821.html

时间: 2024-08-06 18:51:08

Linux设备驱动程序 之 异步通知的相关文章

深入浅出~Linux设备驱动之异步通知和异步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步I/O". 1.异步通知的概念和作用 影响:阻塞--应用程序无需轮询设备是否可以访问 非阻塞--中断进行通知 即:由驱动发起,主动通知应用程序 2.linux异步通知编程 2.1 linux信号 作用:linux系统中,异步通知使用信号来实现

字符设备驱动程序之异步通知(韦大仙)

读取按键的方法: (1)查询的方式:极度耗费资源 (2)中断的方式:如果没有按键按下,read函数会一直的等待 (3)poll机制的引入:可以指定超时时间 上述三种方式有一个共同点:应用程序主动的去查询. 问题:有没有一种方式当有按键按下时,驱动程序通知应用程序去读取.这就是本节所说的异步通知,该方式用信号的方式来实现的. 进程间发信号,例如: kill  -9  PID kill这个程序是发送者,进程号为PID的进程为接受者,9就是发送的信号.接下来引入signal函数: signal 函数是

字符设备驱动程序之异步通知

异步通知: 驱动程序的所谓异步通知,就是说并不是应用程序来对驱动程序操作的,而是驱动程序查询到有事件发生或者有数据发生变化的时候通知应用程序.角色发生了变化,应用程序由主动改为被动执行. 比如按键驱动: 1.有不断进行查询引脚状态的,CPU资源消耗非常的打: 2.有中断操作的,发生按键事件后采取执行相关事件处理函数,需要应用程序不断执行read函数,使得不能去干其它事情: 3.poll机制,改善了中断方式操作,在应用程序上当没有事件发生时,会跳去read函数继续执行其它的任务,知道有事件发生才返

linux设备驱动程序中的阻塞、IO多路复用与异步通知机制

一.阻塞与非阻塞 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经常用到等待队列. 阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回. 非阻塞指不能立刻得到结果之前,该函数不会阻塞当前进程,而会立刻返回. 函数是否处于阻塞模式和驱动对应函数中的实现机制是直接相关的,但并不是一一对应的,例如我们在应用层设置为阻塞模式,如果驱动中没有实现阻塞,函数仍然没有阻塞功能. 二.等待队列 在linux设备驱动程序中,阻塞进程可以使用等待队列来实现. 在内核中,

转:《Linux设备驱动程序3》源码目录结构和源码分析经典链接

转自:http://blog.csdn.net/geng823/article/details/37567557 [原创][专栏]<Linux设备驱动程序>--- LDD3源码目录结构和源码分析经典链接 [专栏]Linux设备驱动程序学习(总目录) [专栏]LDD3源码分析链接(总目录) 1. LDD3源码分析之hello.c与Makefile模板 2. LDD3源码分析之字符设备驱动程序 其他错误: 我的Linux内核为 3.2.0-65-generic-pae,在scull目录下make时

LINUX设备驱动程序(第3版)pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑<LINUX设备驱动程序(第3版)>已针对Linux内核的2610版本彻底更新过了.内核的这个版本针对常见任务完成了合理化设计及相应的简化,如即插即用.利用sysfs文件系统和用户空间交互,以及标准总线上的多设备管理等等.要阅读并理解本书,您不必首先成为内核黑客:只要您理解C语言并具有Unix系统调用的一些背景知识即可.您将学到如何为字符设备.块设备和网络接口编写驱动程序.为此,<LINUX设备驱动程序(第3版)>提供了完整的示例

LINUX设备驱动程序笔记(二)构造和运行模块

         <一>:设置测试系统 首先准备好一个内核源码树,构造一个新内核,然后安装到自己的系统中.           <二>:HelloWorld模块 #include <linux/init.h> //定义了驱动的初始化和退出相关的函数 #include <linux/module.h> //定义了内核模块相关的函数.变量及宏 MODULE_LICENSE("Dual BSD/GPL"); //该宏告诉内核,该模块采用自由许可

LINUX设备驱动程序笔记(三)字符设备驱动程序

      <一>.主设备号和次设备号        对字符设备的访问时通过文件系统内的设备名称进行的.那些设备名称简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的'c'来识别.块设备同样位于/dev下,由字符'b'标识 crw-rw----  1 root root    253,   0 2013-09-11 20:33 usbmon0 crw-rw----  1 root root    253,   1 2013-09

Linux 设备驱动程序

Linux设备驱动程序(中文第三版) 2.6内核.pdf下载 [日期:2011-09-27] 来源:Linux社区  作者:Linux [字体:大 中 小] 本书是经典著作<Linux 设备驱动程序>的第三版.该版本已针对 Linux 内核的 2.6.10 彻底更新过了.内核的这个版本针对常见任务完成了合理化设计及相应的简化,比如即插即用,利用sysfs 文件系统和用户空间交互,以及标准总线上的多设备管理等等.本书提供了完整的示例程序,不需要特殊的硬件即可编译和运行这些示例程序.本书还在单独的