原理
想要在一个应用程序里同时监测多个硬件的数据,就需要使用IO多路复用模型实现,IO多路复用可以通过select()/poll()/epoll()机制来实现。如果监测的多个硬件的数据都没有准备好,此时进程进入休眠,当有一个或者多个硬件数据准备好了,进程被唤醒,当进程被唤醒后从内核读取准备好的描述符的集合,然后再集合中取出准备好的文件描述符,将硬件的数据读走
思想
创建一个文件描述符的集合
将要监测的事件描述符添加到集合
等待事件发生
对发生事件的描述符进行读取
__poll_t mycdev_poll(struct file* file, struct poll_table_struct* wait)
{
// 1.定义返回值的变量
__poll_t mask = 0;
// 2.调用poll_wait,向上提交等待队列头,构造等待队列
poll_wait(file, &wq, wait);
// 3.如果数据准备好置位mask
if (condition) {
mask |= EPOLLIN; // EPOLLIN 数据可读 EPOLLOUT数据可写
}
// 4.返回mask
return mask;
}