Linux设备驱动中的异步通知
异步通知的概念:
一旦设备就绪,主动通知应用程序。这样应用程序根本不需要查询设备状态。
阻塞,非阻塞和异步:
- 阻塞 IO 是等待设备可访问后再访问
- 非阻塞 IO 是查询设备是否可以访问
- 异步通知是设备通知自身可以访问
为了使支持异步通知机制,驱动程序应该涉及以下 3 项工作。
支持 F_SETOWN 命令,能在这个控制命令处理。
处理 FASYNC 标志更变的函数
Int fasync_helper(int fd, struct file*filp, int mode, struct fasync_struct **fa);
释放信号用的函数
Void kill_fasync(struct fasync_struct **fa,int sig, int band);
void kill_fasync(struct fasync_struct **fp,int sig, int band)
{
/*First a quick test without locking: usually
* the list is empty.
*/
if(*fp) {
read_lock(&fasync_lock);
/*reread *fp after obtaining the lock */
__kill_fasync(*fp,sig, band);
read_unlock(&fasync_lock);
}
}
void __kill_fasync(struct fasync_struct*fa, int sig, int band)
{
while(fa) {
structfown_struct * fown;
if(fa->magic != FASYNC_MAGIC) {
printk(KERN_ERR"kill_fasync: bad magic number in "
"fasync_struct!\n");
return;
}
fown= &fa->fa_file->f_owner;
/*Don't send SIGURG to processes which have not set a
queued signum: SIGURG has its own defaultsignalling
mechanism. */
if(!(sig == SIGURG && fown->signum == 0))
send_sigio(fown,fa->fa_fd, band);
fa= fa->fa_next;
}
}
void send_sigio(struct fown_struct *fown,int fd, int band)
{
structtask_struct *p;
enumpid_type type;
structpid *pid;
intgroup = 1;
read_lock(&fown->lock);
type= fown->pid_type;
if(type == PIDTYPE_MAX) {
group= 0;
type= PIDTYPE_PID;
}
pid= fown->pid;
if(!pid)
gotoout_unlock_fown;
read_lock(&tasklist_lock);
do_each_pid_task(pid, type, p) {
send_sigio_to_task(p,fown, fd, band, group);
} while_each_pid_task(pid, type, p);
read_unlock(&tasklist_lock);
out_unlock_fown:
read_unlock(&fown->lock);
}
通过内核,给所有的进程发送信号。
用户对应进程可以接受该信号,并作处理。
用户进程要做的是:
1. 绑定信号和信号处理函数
Signal(SIGIO,input_handler)
2. 设定本进程为某个标准输入文件的拥有者。这样内核就知道信号发送给那个进程。
Fcntl(STDIN_FILENO,F_SETNO,getpid());
3. 对输入文件设定异步标志位。
Fcntl(STDIN_FILENO,F_SETFL,oflags | FASYNC) ;
本文转载自推酷网,原文链接:http://www.tuicool.com/articles/6Z3aQj
转载于:https://www.cnblogs.com/itforever/archive/2013/06/03/3115821.html
Linux设备驱动中的异步通知相关推荐
- linux编写驱动后write已杀死_《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O...
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通 ...
- Linux设备驱动中的并发控制总结
并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions). SMP是一 ...
- linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)
本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...
- linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O
今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...
- Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制
7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...
- linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结
Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...
- Linux设备驱动中的阻塞和非阻塞IO
这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...
- Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O
阻塞和非阻塞访问.poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了. 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态 ...
- Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O
在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程--网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...
最新文章
- Create a Service Catalog Request via REST API
- 【暴力】Codeforces Round #398 (Div. 2) A. Snacktower
- Scrapy-redis 源码分析 及 框架使用
- 摆摊神器五菱荣光爆红后,上汽大通房车又成夜市新晋网红
- linux下串口多线程通信 ,多串口收发数据错乱问题解决办法
- 为suse 12.3桌面系统安装金山WPS OFFICE
- Java代码规范之编程规约
- sir模型初始值_SIR模型
- 快手视频批量下载,一个脚本就够了,手把手教你批量下载快手高清视频。
- java流传输_Java 运用流传输文件
- OpenSesame for Mac(ae项目格式编辑插件)
- 机器学习基石——作业2解答
- 五一国际劳动节知多少!祝五一劳动节快乐! Happy International Workers‘Day!
- Docker(五)进阶:Docker卷(volumes)
- 俺常去(用)滴地方~
- Thread.Sleep原理
- 简述python语言的主要领域_简述Python语言经验总结
- 计算机盘有百度云盘怎么删除文件,百度网盘的群内分享文件可以删除吗
- java 指定 内存_java 运行时指定内存大小
- 米斯特吴小白系列教程 项目网址
热门文章
- prim最小生成树算法 邻接表+STL实现
- 2017蓝桥杯C++B:等差素数列(枚举优化)
- FairyGUI1:FairyGUI 编辑器
- bzoj 3504: [Cqoi2014]危桥(最大流)
- C++multiset集合
- kong 自建一个具有健康检查功能的http/tcp负载均衡器,配置流量权重,自动/手动目标健康,流量统一认证、鉴权、限流限速、修正,监控、日志等功能
- 用Python3.6操作HBase之HBase-Thrift
- 三度其三——矢量场的旋度
- 服务器查看外网IP地址和方法
- 查看Android 系统发送的广播