异步通知的概念:

一旦设备就绪,主动通知应用程序。这样应用程序根本不需要查询设备状态。

阻塞,非阻塞和异步:

- 阻塞 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设备驱动中的异步通知相关推荐

  1. linux编写驱动后write已杀死_《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O...

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通 ...

  2. Linux设备驱动中的并发控制总结

    并发(concurrency)指的是多个执行单元同时.并行被执行.而并发的执行单元对共享资源(硬件资源和软件上的全局.静态变量)的访问则容易导致竞态(race conditions).   SMP是一 ...

  3. linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)

    本章导读 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态(竞争状态). Linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景. 7.1讲解了并 ...

  4. linux 设备驱动阻塞,深入浅出:Linux设备驱动中的阻塞和非阻塞I/O

    今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式. 一.基本概念: 阻塞操作 ...

  5. Linux设备驱动开发详解:第7章 Linux设备驱动中的并发控制

    7.1并发与竞态 (1).竞态的发生场景:CPU0的进程与CPU1的进程之间.CPU0的中断与CPU1的进程之间.CPU0的中断与CPU1的中断之间: (2).解决竞态问题的途径是保证对共享资源的互斥 ...

  6. linux write引起进程挂起,Linux设备驱动中的阻塞与非阻塞总结

    Linux设备驱动中的阻塞与非阻塞总结 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作. 非阻塞操作的进程在不能进行设备操作时,并不挂起.被挂起的进程进入sl ...

  7. Linux设备驱动中的阻塞和非阻塞IO

    这篇文章我们来了解下Linux设备驱动中阻塞和非阻塞. 阻塞:阻塞是指执行设备操作时,如果不能获得设备资源,则挂起进程,是进程进入休眠模式,直到设备资源可以获取. 非阻塞:非阻塞是在不能获取设备资源时 ...

  8. Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

    阻塞和非阻塞访问.poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了. 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态 ...

  9. Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

    在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程--网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

最新文章

  1. Create a Service Catalog Request via REST API
  2. 【暴力】Codeforces Round #398 (Div. 2) A. Snacktower
  3. Scrapy-redis 源码分析 及 框架使用
  4. 摆摊神器五菱荣光爆红后,上汽大通房车又成夜市新晋网红
  5. linux下串口多线程通信 ,多串口收发数据错乱问题解决办法
  6. 为suse 12.3桌面系统安装金山WPS OFFICE
  7. Java代码规范之编程规约
  8. sir模型初始值_SIR模型
  9. 快手视频批量下载,一个脚本就够了,手把手教你批量下载快手高清视频。
  10. java流传输_Java 运用流传输文件
  11. OpenSesame for Mac(ae项目格式编辑插件)
  12. 机器学习基石——作业2解答
  13. 五一国际劳动节知多少!祝五一劳动节快乐! Happy International Workers‘Day!
  14. Docker(五)进阶:Docker卷(volumes)
  15. 俺常去(用)滴地方~
  16. Thread.Sleep原理
  17. 简述python语言的主要领域_简述Python语言经验总结
  18. 计算机盘有百度云盘怎么删除文件,百度网盘的群内分享文件可以删除吗
  19. java 指定 内存_java 运行时指定内存大小
  20. 米斯特吴小白系列教程 项目网址

热门文章

  1. prim最小生成树算法 邻接表+STL实现
  2. 2017蓝桥杯C++B:等差素数列(枚举优化)
  3. FairyGUI1:FairyGUI 编辑器
  4. bzoj 3504: [Cqoi2014]危桥(最大流)
  5. C++multiset集合
  6. kong 自建一个具有健康检查功能的http/tcp负载均衡器,配置流量权重,自动/手动目标健康,流量统一认证、鉴权、限流限速、修正,监控、日志等功能
  7. 用Python3.6操作HBase之HBase-Thrift
  8. 三度其三——矢量场的旋度
  9. 服务器查看外网IP地址和方法
  10. 查看Android 系统发送的广播