为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:
1、支持F_SETOWN命令,能在这个控制命令处理中设置 filp->f_owner为对应进程ID。不过此项工作已由内核完成,设备驱动无须处理。
2、支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序中的fasync()函数将得以执行。驱动中应该实现fasync()函数。该函数会调用到fasync_helper()来初始化 / 释放 fasync_struct 结构体。
3、在设备资源可获得时,调用kill_fasync()函数激发相应的信号。一般kill_fasync()函数是在中断函数中被调用的,即发生中断后发送信号通知应用程序。
应用程序则针对驱动做以下三项工作:
1、接收信号并设置处理函数 ,例如:
signal(SIGIO,handler); //SIGIO 是接收的信号,其值为29;handler是处理函数。不清除可以man一下这个函数。
2、告诉内核,发给哪个进程
fcntl(fd,F_SETOWN,getpid());
3、即改变fasync标记,触发fasync驱动程序
int Oflags = fcntl(fd,F_GETFL); //获取标记
fcntl(fd,F_SETFL,Oflags | FASYNC);//重置标记,即改变fasync标记,最终会调用到驱动的faync > fasync_helper:初始化/释放fasync_struct