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

标签 c linux linux-kernel glibc centos6

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

我相信 glibc 可以神奇地处理它。

那么,有文档描述如何为套接字触发以下事件吗?

  1. EPOLLPRI
  2. EPOLLRDNORM
  3. EPOLLRDBAND
  4. EPOLLWRNORM
  5. EPOLLWRBAND
  6. EPOLLMSG
  7. EPOLLERR
  8. EPOLLHUP
  9. 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

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

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

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

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

  • EPOLLPRI 是一个修饰符标志,总是会增加一些其他事件(例如 EPOLLERR)。它的使用取决于子系统,因为根据相关文件描述符的用途不同,它的含义可能有所不同。

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

  • EPOLLRDHUP 表明对等方已关闭其 channel 一侧以供读取,但仍可能接收数据(方便确定没有更多请求数据传入)。

  • EPOLLHUP 表明对等方已关闭 channel 的一侧。

关于c - 套接字事件如何传播/转换为 epoll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103093/

相关文章:

C 指针和调用方法?

c++ - 如何使用 OpenCV 检测视频中的方 block ?

c - 代码的链接时间运行? (具体来说,Valgrind 似乎在链接时提出的问题)

linux - 从文件夹中的选择文件类型创建符号链接(symbolic link)

linux - MTU 对环回接口(interface)的意义

c - PIC18F452 的 PORTB 不工作

c - 调用此可变参数函数的替代方法

linux - : Swapping in Paging (memory allocation)

linux - Cronjob 未运行,尝试将字符串回显到文件中

linux-kernel - 多网卡同驱动——性能瓶颈?