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

我很好奇epoll_wait()是如何收到一个注册套接字(带有epoll_ctl())准备好读/写的事件。

我相信glibc神奇地处理它。

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

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

PS最初我试图将枚举EPOLL_EVENTS粘贴到我的盒子的sys / epoll.h中; stackoverflow认为,我不正确格式化代码块,虽然我用pre包装,然后代码标签,任何想法?

Solutions Collecting From Web of "套接字事件如何传播/转换为epoll?"

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 

然后,对内核源码进行简要的检查就可以看出:

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

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

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

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

  • EPOLLMSG似乎没有被内核使用,似乎没有任何用处。

  • EPOLLRDHUP表示对方已经关闭了其阅读渠道的一面,但仍可能会收到数据(方便地确定没有更多的请求数据进入)。

  • EPOLLHUP表示对方关闭了通道的一侧。

所有epoll的关键工作都是在内核完成的,用户空间API只是一个接口。 上一个线程为什么ePoll比轮询更好? 涵盖了内核如何实现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);