poll机制与select机制类似,通过管理文件描述符来进行轮询,效率更高,并且处理的连接个数不受内核的限制。
1、poll函数
# include <poll.h>
int poll ( struct pollfd * fdarray, unsigned int nfds, int timeout);
参数:
(1)fdarray:可读套接字,是一个指向数组的指针,这个数组是由 struct pollfd 作为元素构成的,pollfd结构体:
struct pollfd {
int fd; // 用于检测的文件描述符
short events; // 等待的事件类型
short revents; // 实际发生的事件类型
} ;
(2)nfds:所监控的最大文件描述符的个数,使用的时候传入当前最大的文件描述符号+1 即可 。
(3)timeout:工作模式:
阻塞模式:
将 timeout = INFTIM传入即可,当代码执行poll 函数的所在行的时候,若是fdarray 数组中的所有套接字描述符上面都没有发生变化,则代码不会向下执行,而是卡在 poll 所在行,直到 fdarray 中的套接字描述符有发生变化poll 方法才会返回发生变化的全部套接字的个数,并继续向下执行;若出错则返回-1 。
非阻塞模式:
将 timeout = 0传入即可,当代码执行到 poll 函数所在行的时候,若是 fdarray 数组中的所有套接字均没有变化,则不作停留,立即返回0; 若是 fdarray数组中存在套接字发生变化的,则立即返回发生变化的套接字的总数;若是 poll内部出错,立即返回 -1 。
固定时间内阻塞模式:
将 timeout 设置为非零的整数,当代名执行到 poll 函数所在行的时候,会等待 timeout 秒,在时间到达的时候,返回在这一段时间内发生变化的套接字总个数(没有就返回 0);若是在 timeout(sec) 这段时间内有错误发生的话,立即返回 -1