异步通知fasync机制

  poll机制是应用程序主动检测相应的事件有没有发生,没发生进程就休眠,如果事件发生了,应用程序再执行相应的操作(如读写),对应用程序来说是一种主动的检测机制。

  不用poll机制,只用中断方式的话,需要应用程序去调用read、write函数,从而调用驱动程序中的xxx_read\write函数,如果设备没准备好或事件没发生时,在驱动程序中将进程休眠,等待中断到来再唤醒进程。这样的方式也需要应用程序去主动读写,并在必要时休眠。

  异步通知fasync机制是一种让应用程序“被通知”的机制,当没有信号传来时,应用程序只需要专注于自己的事;当信号传来时,再执行相应的响应函数就行了。

应用程序代码编写方式:

1、注册信号种类和信号来临时执行的响应函数:

异步通知fasync机制

 

 2、把打开的设备文件需要发送信号的“主人”设为当前进程:

异步通知fasync机制

 

3、给文件设置FASYNC标志,以启用异步通知机制

异步通知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);

异步通知fasync机制

扩展:当有多个文件发送异步通知信号给一个进程时,进程无法知道是哪个文件发送的信号,这时候还是要借助poll的帮助完成IO

 

参考文章:https://blog.csdn.net/u010481276/article/details/51093800

     https://www.cnblogs.com/xiaojiang1025/p/6376561.html

上一篇:异步通知实验


下一篇:设备驱动中的异步通知与异步I/O