3

我很好奇 epoll_wait() 如何接收已注册的套接字(使用 epoll_ctl())准备好进行读/写的事件。

我相信 glibc 可以神奇地处理它。

那么,是否有描述如何为套接字触发以下事件的文档?

  1. EPOLLPRI
  2. EPOLLRD 标准
  3. EPOLLR带
  4. EPOLLWRNORM
  5. EPOLLWRBAND
  6. EPOLLMSG
  7. EPOLLERR
  8. EPOLLHUP
  9. EPOLLRDHUP

PS 最初我试图将 sys/epoll.h 中的枚举 EPOLL_EVENTS 粘贴到我的盒子上;stackoverflow 认为我没有正确格式化代码块,尽管我用 pre 然后代码标签包装了它,知道吗?

4

2 回答 2

10

文档中最明显的问题epoll是它没有用“粗体大写”声明epoll事件实际上与poll(2) 事件完全相同。实际上,在内核方面epoll,根据旧poll事件名称处理其事件:

#define POLLIN     0x0001  // EPOLLIN
#define POLLPRI    0x0002  // EPOLLPRI
#define POLLOUT    0x0004  // EPOLLOUT
#define POLLERR    0x0008  // EPOLLERR
#define POLLHUP    0x0010  // EPOLLHUP
#define POLLNVAL   0x0020  // unused in epoll
#define POLLRDNORM 0x0040  // EPOLLRDNORM
#define POLLRDBAND 0x0080  // EPOLLRDBAND
#define POLLWRNORM 0x0100  // EPOLLWRNORM
#define POLLWRBAND 0x0200  // EPOLLWRBAND
#define POLLMSG    0x0400  // EPOLLMSG
#define POLLREMOVE 0x1000  // unused in epoll
#define POLLRDHUP  0x2000  // EPOLLRDHUP

然后,对内核源代码的简要检查表明:

  • EPOLLIN并且EPOLLRDNORM是相同的(EPOLLIN | EPOLLRDNORM当数据可用于从文件描述符中读取时,epoll 返回)。

  • EPOLLOUT并且EPOLLWRNORM是相同的(EPOLLOUT | EPOLLWRNORM当缓冲区空间可用于写入时,epoll 返回)。

  • EPOLLRDBANDEPOLLWRBAND描述符上带外数据的信号可用性(在某些套接字上,这将是带有MSG_OOB传递给套接字的标志的数据发送)。

  • EPOLLPRI是一个修饰标志并且总是增加一些其他事件(例如EPOLLERR)。它的使用取决于子系统,因为根据相关文件描述符的用途,它可能意味着有所不同。

  • EPOLLMSG似乎没有被内核使用并且似乎没有任何用途。

  • EPOLLRDHUP表示对等方已关闭其一侧的通道进行读取,但仍可能接收数据(便于确定没有更多请求数据进入)。

  • EPOLLHUP表示对等方已关闭其一侧的通道。

于 2014-11-26T07:43:32.763 回答
2

所有关键工作epoll都在内核中完成,用户空间 API 只是一个接口。上一篇关于为什么 ePoll 的扩展性比 Poll 更好?涵盖内核如何实现epoll的细节是很好的细节。

至于描述事件及其触发方式的文档,epoll_ctl(2) man page涵盖了每个事件,例如:

EPOLLIN
          The associated file is available for read(2) operations.

EPOLLOUT
          The associated file is available for write(2) operations.

为了更好地描述EPOLLET您需要阅读epoll(7) man page.

这是一个如何使用 epoll 的完整示例

您使用epoll_ctl请求您希望接收事件的事件EPOLLINEPOLLET,上面的代码执行此操作:

event.events = EPOLLIN | EPOLLET;
s = epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event);
于 2013-08-07T22:09:07.167 回答