目录
一、异步通知简介
在前面使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取或写入数据。Linux提供了异步通知这个机制来完成此功能。
为了使设备支持异步通知机制,驱动程序中涉及 3 项工作:
- 支持 F_SETOWN 命令,能在这个控制命令处理中设置 filp->f_owner 为对应进程 ID。不过此项工作已由内核完成,设备驱动无需处理。
- 支持 F_SETFL 命令的处理,每当 FASYNC 标志改变时,驱动程序中的 fasync()函数将得以执行。因此,驱动中应该实现 fasync()函数。
- 在设备资源可获得时,调用 kill_fasync()函数激发相应的信号。
驱动中的上述 3 项工作和应用程序中的 3 项工作是一一对应的,如图所示为异步通知处理过程中用户空间和设备驱动的交互: