阅读部分数据时epoll EDGE会触发工作吗?

时间:2017-11-10 10:44:08

标签: evdev

我想在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通知,并且read再次获得EV_MSC事件。如果我用大小为48的缓冲区读取,我会得到两个事件。

处理此案例的正确方法是什么。在读取事件处理程序中获取EAGAIN之前,我是否应继续阅读?

2 个答案:

答案 0 :(得分:0)

糟糕。我的错。原来我正在读取没有数据的描述符(输入设备)

答案 1 :(得分:0)

水平触发和边缘触发之间的唯一区别是边缘触发只会在新数据排队时通知您,而水平触发将一直通知您,直到您读取所有数据。

如果您要使用边缘触发,则应确保在收到通知后读取所有数据,因为除非有新数据到达,否则无法保证获得新通知。 (在某些情况下,您会收到通知,但不能保证,因此依赖它是错误的。)