【问题标题】:Should epoll EDGE triggered work when you read partial data?当您读取部分数据时,epoll EDGE 是否应该触发工作?
【发布时间】:2017-11-10 10:44:07
【问题描述】:

我希望在 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 之前,我是否应该继续阅读?

【问题讨论】:

    标签: evdev


    【解决方案1】:

    哎呀。我的错。原来我是从一个没有数据的描述符中读取的(uinput 设备)

    【讨论】:

      【解决方案2】:

      电平触发和边缘触发的唯一区别在于,边缘触发只会在新数据排队时通知您,而电平触发会一直通知您,直到您读取所有数据为止。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多