9.1 异步通知的概念和作用
- 异步通知:设备通知用户自身可以访问,之后用户再进行I/O处理。一旦设备就绪,则主动通知应用程序。(类似于中断)
- 阻塞、非阻塞IO、异步通知的区别:
9.2 Linux异步通知编程
- 信号可以进行进程间通信(IPC),Linux中使用信号实现异步通知。除SIGSTOP(19) 和 SIGKILL(9) 以外,进程可以忽略或者捕获其他全部信号。
- 用户程序中,使用signal() 函数进行信号的捕捉,来设置对应的信号处理函数:
第一个参数为信号的值(宏),第二个参数为信号处理函数。(类似于中断注册) - 应用程序中处理一个设备释放的信号步骤:
- 通过F_SETOWN IO控制命令设置设备文件的拥有者为本进程
- 通过F_SETFL IO控制命令设置设备文件以支持FASYNC,即异步通知方式
- 通过signal() 连接信号和信号处理函数
- 驱动程序所涉及的工作:
- 支持F_SETOWN命令,能在这个控制命令中设置filp->f_owner为对应进程ID(内核已进行处理,驱动无需再管)
- 支持F_SETEL命令的处理,当FASYNC标志改变时,驱动程序中fasync()函数得以执行,因此在驱动中需要实现fasync()函数
- 在设备资源可获得时,调用kill_fasync()函数激发相应的信号。
- 对应关系:
- 编程要点:一项数据结构和两个函数:
- 数据结构:fasync_struct 结构体(放在设备结构体中)
- 两个函数:
- 处理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);
9.3 异步通知编程
- 异步通知编程示例:
9.4 异步I/O
- 异步I/O:应用可以在发起I/O请求后立刻返回,之后再查询I/O完成情况,或者I/O完成后被调回。
- 异步I/O时序:
- 应用程序发起I/O动作后,直接开始执行,并不等待I/O结束,它要么过一段时间来查询之前的I/O请求完成情况,要么I/O请求完成了会自动被调用与I/O完成绑定的回调函数