Featured image of post 操作系统 —— I/O 多路复用之 poll

操作系统 —— I/O 多路复用之 poll

poll

相关函数

#include <poll.h>

struct pollfd {
    int    fd;       /* file descriptor */
    short  events;   /* events to look for */
    short  revents;  /* events returned */
};

int poll(struct pollfd fds[], nfds_t nfds, int timeout);
  • 作用:类似于 select。(指示内核等待多个事件,并在有一个或多个时间或经历指定时间后唤醒进程。)
  • 参数:
    • fds[]: 指向一个结构数组第一个元素的指针。
    • nfds: 指定 fds 中的元素个数。
    • timeout:
      • INFTIM:永远等待;(INFTIM 被定义为一个负值)
      • 0:立即返回;
      • > 0: 等待指定数据的毫秒数。
  • 返回:
    • 成功:就绪描述符数目
    • 超时:0
    • 出错:-1
  • 数据结构说明:
    • events: 要测试的条件;
    • revents: 返回描述符的状态。
  • events/revents标记:
    常值 说明 能作为 evnets 的输入吗? 能作为 revents 的输入吗?
    POLLIN 普通或优先级带数据可读 + +
    POLLRDNORM 普通数据可读 + +
    POLLRDBAND 优先级带数据可读 + +
    POLLPRI 高优先级数据可读 + +
    POLLOUT 普通数据可写 + +
    POLLWRNORM 普通数据可写 + +
    POLLWRBAND 优先级带数据可写 + +
    POLLERR 发生错误 +
    POLLHUP 发生挂起 +
    POLLNVAL 描述符不是一个打开的文件 +

数据分类

poll 识别三类数据:普通 (normal)、优先级带 (priority band)、高优先级 (high priority)

  • 普通数据:
    • 所有正规 TCP、UDP 数据;
    • TCP 连接读半部关闭时;(FIN)
    • TCP 连接存在错误;(RST、超时)
    • 监听套接字上游新的连接可用;(多数实现为普通,也有实现为优先级带数据)
  • 优先级带:
    • TCP 的带外数据;
  • 高优先级:
相信美好的事情即将发生。
Built with Hugo
Theme Stack designed by Jimmy