poll函数
poll的机制与select类似,也是指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者,poll原型如下:
1
2 |
#include int |
参数:
1)
fds参数是一个pollfd结构类型的数组,它制定所有我们感兴趣的文件描述符上发生的可读,可写和异常等事件。pollfd结构体的定义如下:
1
2 3 4 5 6 |
struct { } |
其中,
fd成员指定文件描述符,events成员告诉poll监听fd上的哪些事件,它是一系列事件的按位或;revents成员则是由内核修改,以通知应用程序fd上实际发生了哪些事件。poll支持的事件类型如表所示:
2)
nfds参数指定被监听事件集合fds的大小,比如定义structpollfd fds[2],则nfds就为2。
其
类型nfds_t的定义如下:
typedef |
3)
timeout参数指定poll的超时值,单位是毫秒。
- timeout为-1时,poll调用将永远阻塞,直到某个事件发生;
- timeout为0时,poll调用将立即返回。
- timeout>0时,等待指定数目的毫秒数。
返回值
poll系统调用的返回值的含义和select相同。
poll函数的优点和缺点:
优点:
- poll函数可以处理多个socket描述符。
- 记录内核返回状态的描述符。
缺点:
- select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降(内核态和用户态都需要遍历描述符集合)。
用poll实现udp同时收发