Hei*_*Hei 2 c linux glibc linux-kernel centos6
我很好奇epoll_wait()如何接收已注册的套接字(带有epoll_ctl())已准备好进行读/写的事件.
我相信glibc神奇地处理它.
那么,是否有一个文档描述了如何为套接字触发以下事件?
PS最初我试图在我的盒子上将enum EPOLL_EVENTS粘贴到我的盒子里; stackoverflow认为我没有正确格式化代码块,虽然我用pre和then代码标签包装它,任何想法?
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 表示同伴关闭了通道的一侧.