异步通知fasync机制
作者:互联网
poll机制是应用程序主动检测相应的事件有没有发生,没发生进程就休眠,如果事件发生了,应用程序再执行相应的操作(如读写),对应用程序来说是一种主动的检测机制。
不用poll机制,只用中断方式的话,需要应用程序去调用read、write函数,从而调用驱动程序中的xxx_read\write函数,如果设备没准备好或事件没发生时,在驱动程序中将进程休眠,等待中断到来再唤醒进程。这样的方式也需要应用程序去主动读写,并在必要时休眠。
异步通知fasync机制是一种让应用程序“被通知”的机制,当没有信号传来时,应用程序只需要专注于自己的事;当信号传来时,再执行相应的响应函数就行了。
应用程序代码编写方式:
1、注册信号种类和信号来临时执行的响应函数:
2、把打开的设备文件需要发送信号的“主人”设为当前进程:
3、给文件设置FASYNC标志,以启用异步通知机制
文件标志一旦更改,内核就会调用驱动程序中的xxx_fasync函数
驱动程序代码编写方式:
1、定义一个fasync_struct类型的结构体
2、驱动方法fasync中调用fasync_helper(),fasync_helper()的作用是将一个fasync_struct的对象注册进内核
3、当数据到达时调用kill_fasync()发送信号(如中断中或write中调用)
4、文件关闭时,release方法中调用fasync方法,从活动的异步读取进程列中删除该文件。
XXX_fasync(-1, filp, 0);
扩展:当有多个文件发送异步通知信号给一个进程时,进程无法知道是哪个文件发送的信号,这时候还是要借助poll的帮助完成IO
参考文章:https://blog.csdn.net/u010481276/article/details/51093800
https://www.cnblogs.com/xiaojiang1025/p/6376561.html
标签:异步,调用,驱动程序,通知,应用程序,fasync,信号 来源: https://www.cnblogs.com/physworld/p/14839320.html