菜鸟笔记
提升您的技术认知

i/o多路复用之 poll-ag真人游戏

poll函数接口

#include
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
//pollfd结构
struct pollfd{ 
    int fd; //文件描述符
    short events; //requested events 用户->内核
    short revents; // returned events 内核->用户
    //上面两个变量体现出输入参数和输出参数分离

参数说明:

  • fds是一个poll函数监听的结构列表,每一个元素中,包含三部分内容:文件描述符,监听事件集合,返回事件集合
  • nfds表示fds数组的长度
  • timeout表示poll函数的超时时间。

poll修正了select的两个问题:

  1. 输入参数与输出参数分离
  2. poll等的文件描述符没有上限
返回结果:
  • 返回值小于0,表示出错
  • 返回值等于0,表示poll函数等待超时
  • 返回值大于0,表示poll监听的文件描述符就绪而返回
  • 与select一模一样

poll的优点

不同于select使用三个位图来表示三个fdset的方式,poll使用一个pollfd的指针实现

  • pollfd结构包含了要监听的event和发生的event,不再使用select“参数–值”传递的方式,接口使用比select更方便。
  • poll并没有最大数量限制(但是数量过大后性能也是会下降)

poll的缺点

当poll中监听的文件描述符数目增多时

  • 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符
  • 每次调用poll都需要把大量的pollfd结构从用户拷贝到内核中
  • 同时连接大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量增长,其效率也会线性下降。
网站地图