我希望在USB鼠标断开连接时收到通知(而不仅仅是读取失败(。我使用带有标志的 epoll
EPOLLIN | EPOLLERR | EPOLLRDHUP | EPOLLET
我用了
read(fd, struct input_event, sizeof input_event)
我等待鼠标的事件。一切都很好,工作正常,直到我点击鼠标按钮。这将同时生成两个事件。一个是EV_MSC/MSC_SCAN事件,另一个是EV_KEY/BTN_LEFT事件。如果我只读取一个事件(即使用 len 24 的缓冲区读取(,我会得到另一个 EPOLL 通知,并且读取再次获得EV_MSC事件。如果我使用大小为 48 的缓冲区读取,我会得到两个事件。
处理这种情况的正确方法是什么。我是否应该在读取事件处理程序中获得 EAGAIN 之前不要继续读取?
> 哎呀。我的坏。原来我正在从没有数据的描述符(uinput 设备(中读取
级别触发和边缘触发之间的唯一区别是,边缘触发只会在新数据排队时通知您,而级别触发将不断通知您,直到您读取所有数据。
如果要使用边缘触发,则应确保在收到通知后读取所有数据,因为除非新数据到达,否则无法保证收到新通知。(在某些情况下,您会收到通知,但不能保证,因此依赖它是错误的。