(1)头文件
#include <poll.h>
(2)函数原型
int poll (struct pollfd *fds, nfds_t nfds, int timeout);
(3)参数
参 1:struct pollfd 类型结构体数组的首地址 。是传入传出参数
struct pollfd
{
int fd; // 要监听的文件描述符:负值无效
short events; // 要监听的事件宏: POLLIN (读) / POLLOUT(写) / POLLERR
short revents; // 返回的事件宏:调用 poll 后内核填写(与 events 相同),可初始化为 0
};
参 2:数组实际有效大小 (比如数组初始化定义 100,但只使用了 5 个,nfds = 5)。
参 3:int 型 : -1代表永久阻塞,直到监控事件发生;0代表立即返回,不阻塞进程;> 0表示等待指定的毫秒数。
(4)返回值
成功返回所监听的监听集合中满足条件的文件描述符总数量;失败返回-1,设置errno,若timeout=0,errno=EAGAIN则代表正常。
(5)poll 相较于 select 的优势
poll 突破了 1024 的限制;select 的监听和返回的集合是不分离的,是通过传入传出的方式实现;而 poll 通过“参数 1”的结构体实现请求和返回分离。
(6)poll 相较于 select 的劣势
1不能跨平台,只能在 linux 下使用,导致 poll 地位比较尴尬。