6

epoll用来获取有关传入数据的通知。这并不难,因为返回的所有事件都epoll_wait()表明我可以从epoll_event.data.fd(套接字描述符)读取数据。

但现在我想要两种类型的通知:接收和发送(套接字可用于发送)。但我不能这样做,因为:

  1. epoll_event.events返回的epoll_wait()和我传入的一样epoll_ctl()。所以它包含两者EPOLLINEPOLLOUT就我而言。
  2. 此外,如果我尝试两次添加一个套接字epoll(作为 EPOLLIN 和 EPOLLOUT 事件),我将得到一个EEXIST.

select()每次收到通知时,如何在不手动调用的情况下解决此问题?

4

2 回答 2

6

man epoll_wait明确指出“事件成员将包含返回的事件位字段。”。因此,如果您要进入EPOLLIN | EPOLLOUTepoll_event.events那么您的套接字必须准备好进行读写。

如果您只想在套接字更改状态时收到通知,请使用EPOLLET边缘触发操作。

于 2012-10-03T17:17:03.203 回答
4

使用 添加描述符时epoll_ctl,将events掩码设置为EPOLLIN | EPOLLOUT

当您通过epoll_waitthen 收到通知时,您将循环检查返回的通知EPOLLINEPOLLOUT.

伪代码

int index, count;
count = epoll_wait(epfd, epoll_event, MAX_EVENTS, -1);
for (index = 0; index < count; ++index) {
  if (epoll_event[index].events & EPOLLIN) {
    // Ready for read
  }

  if (epoll_event[index].events & EPOLLOUT) {
    // Ready for write
  }
}

有些人只有EPOLLOUT在他们的发送缓冲区中有数据时才设置该位。我没有包括任何错误检查。

于 2012-10-03T17:26:04.117 回答