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的两个问题:
- 输入参数与输出参数分离
- 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结构从用户拷贝到内核中
- 同时连接大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量增长,其效率也会线性下降。