poll类似于select,但是接口有所不同。
原型
#include <poll.h>
int poll(struct pollfd fdarray[], nfds_t nfds, int timeout);
返回值:准备就绪的描述符数;若超时,返回0;若出错,返回-1
与select不同,poll不是构造三个描述符集,而是使用一个pollfd结构的数组,每个元素指定一个描述符编号以及我们对该描述符感兴趣的条件。fdarray中的元素数由nfds来指定。
pollfd结构
//pollfd结构
struct pollfd {
int fd;
short events;
short revents;
};
每个events成员设置为下图所示值的一个或几个,通过这些值告诉内核我们关心的是描述符的哪些事件。返回时,revents成员由内核设置,用于说明每个描述符发生了哪些事件。
下图各行分别对应读、写和异常,注意到最后三行的标志是不需要设置的,只要响应条件发生, 就会在revents中返回它们。
timeout参数
该参数指定等待时间
timeout == -1
永远等待。如果有描述符准备好,则返回数目;若超时,则返回-1,并置errno为EINTR。timeout == 0
不等待。测试所有描述符并立即返回。timeout > 0
等待timeout毫秒。如果超时,则返回0。
注意:
- 和select一样,一个描述符是否阻塞不影响poll是否阻塞。
- 在linux中,被信号中断后,select和poll是不会自动重启的。