我很好奇epoll_wait()是如何收到一个注册套接字(带有epoll_ctl())准备好读/写的事件。
我相信glibc神奇地处理它。
那么,是否有一个文档描述了如何为套接字触发以下事件?
PS最初我试图将枚举EPOLL_EVENTS粘贴到我的盒子的sys / epoll.h中; stackoverflow认为,我不正确格式化代码块,虽然我用pre包装,然后代码标签,任何想法?
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
是相同的(当数据可用于从文件描述符读取时,epoll返回EPOLLIN | EPOLLRDNORM
)。
EPOLLOUT
和EPOLLWRNORM
是相同的(当缓冲区空间可用于写入时,epoll返回EPOLLOUT | EPOLLWRNORM
)。
EPOLLRDBAND
和EPOLLWRBAND
信号描述符上的带外数据的可用性(在某些套接字上,这将是传递给套接字的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
来请求您希望接收事件EPOLLIN
和EPOLLET
事件,上面的代码是这样的:
event.events = EPOLLIN | EPOLLET; s = epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event);