套接字事件如何传播/转换为epoll?

Hei*_*Hei 2 c linux glibc linux-kernel centos6

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

我相信glibc神奇地处理它.

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

  1. EPOLLPRI
  2. EPOLLRDNORM
  3. EPOLLRDBAND
  4. EPOLLWRNORM
  5. EPOLLWRBAND
  6. EPOLLMSG
  7. EPOLLERR
  8. EPOLLHUP
  9. EPOLLRDHUP

PS最初我试图在我的盒子上将enum EPOLL_EVENTS粘贴到我的盒子里; stackoverflow认为我没有正确格式化代码块,虽然我用pre和then代码标签包装它,任何想法?

oak*_*kad 6

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • EPOLLRDBAND并且EPOLLWRBAND描述了描述符上带外数据的可用性(在某些套接字上,这将是MSG_OOB传递给套接字的标志的数据发送).

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

  • EPOLLMSG 似乎没有被内核使用,似乎没有用处.

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

  • EPOLLHUP 表示同伴关闭了通道的一侧.