一、异步通知
1、软件层次上的中断,也叫软中断信号,软件层次上对中断机制的一种模拟。异步通知的核心就是信号,驱动程序向应用程序发送不同的信号来实现不同的功能。应用程序想要使用信号就要在应用程序中定义信号处理函数,就像使用中断一样。
2、在应用程序中使用函数signal函数设置信号处理函数,原型为:sighandler_t signal(int signum,sighandler_t handler);
3、信号处理函数为typedef void (*sighandler_t)(int);
二、驱动程序对异步通知的处理
1、使用fasync_struct 定义一个指针结构体变量。
2、实现file_operations结构体中的fasync函数。函数原型为:int (*fasync) (int fd, struct file *filp, int on);
3、驱动里要调用fasync向应用发送信号,函数原型为:kill_fasync(struct fasync_struct **fp, int sig, int band);
4、关闭驱动的时候要删除信号。
三、应用程序中对异步通知的处理
1、注册信号处理函数,使用signal函数来设置信号的处理函数。
2、将要使用信号的应用程序进程号告诉内核,使用函数fcntl(fd, F_SETOWN, getpid())。
3、开启异步通知,先获取当前进程状态:flags = fcntl(fd, F_GETFL),然后开启当前进程异步通知功能:fcntl(fd, F_SETFL, flags | FASYNC)。