Linux 异步通知
阻塞和非阻塞方式都是采取应用程序主动读取数据的方式。最好的方式是驱动程序主动向应用程序发出通知,报告自己可以被访问,然后应用程序从驱动程序中读取或写入数据,类似于中断,这就需要使用异步通知这个机制来完成此功能。
异步通知使用信号通知,来模拟硬件上使用的中断,只不过信号是软件层面上的。
//信号处理函数
sighandler_t signal(int signum, sighandler_t handler)
//要设置处理函数的信号
signum
//信号的处理函数
handler
驱动层信号处理
1 定义fasync_struct结构体指针变量
2 在file_operations操作集中实现注册信号函数fasync()
在file_operations操作集release函数中实现释放信号函数fasync_struct()
3 在驱动程序中编写需要发送的信号函数kill_fasync()
应用层信号处理
1 注册信号处理函数
sighandler_t signal(int signum, sighandler_t handler)
2 将本应用程序的进程号告诉内核
使用 fcntl(fd, F_SETOWN, getpid())将本应用程序的进程号告诉给内核。
3 开启异步通知
flags = fcntl(fd, F_GETFL); /* 获取当前的进程状态 */
fcntl(fd, F_SETFL, flags | FASYNC); /* 开启当前进程异步通知功能 */