我很好奇 epoll_wait() 是如何接收到一个已注册的套接字(使用 epoll_ctl())准备读/写的事件。
我相信 glibc 可以神奇地处理它。
那么,有文档描述如何为套接字触发以下事件吗?
- EPOLLPRI
- EPOLLRDNORM
- EPOLLRDBAND
- EPOLLWRNORM
- EPOLLWRBAND
- EPOLLMSG
- EPOLLERR
- EPOLLHUP
- EPOLLRDHUP
附言最初我试图将枚举 EPOLL_EVENTS 粘贴到我的盒子上的 sys/epoll.h 中; stackoverflow 认为我没有正确格式化代码块,尽管我用 pre and then code 标记包装了它,知道吗?
最佳答案
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
表明对等方已关闭其 channel 一侧以供读取,但仍可能接收数据(方便确定没有更多请求数据传入)。EPOLLHUP
表明对等方已关闭 channel 的一侧。
关于c - 套接字事件如何传播/转换为 epoll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103093/