东阳的学习笔记
poll提供的功能和 select 类似,不过在处理流设备
时,它能提供额外的信息。
#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
第一个参数时指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述符fd的条件。
struct pollfd
{
int fd; /* descriptor to check */
short events; /* events of interest on fd */
short revents; /* events occurred on fd */
}
要测试的条件由 events 成员指定,函数在相应的 revents
成员中返回描述的状态。这两个成员中的每一个都由指定某个特定条件的一位或多位构成。
常量 | 说明 |
---|---|
POLLIN | 普通或优先级带数据可读 |
POLLRDNORM | 普通数据可读 |
POLLRDBAND | 优先级带数据可读 |
POLLPRI | 高优先级数据可读 |
POLLOUT | 普通数据可写 |
POLLWRNORM | 普通数据可写 |
POLLWRBAND | 优先级带数据可写 |
POLLERR | 发生错误 |
POLLHUP | 发生挂起 |
POLLNVAL | 描述字不是一个打开的文件 |
就TCP和UDP套接字而言,以下条件引起poll返回特定的revent
。不幸的是,POSIX在其poll的定义中留了许多空洞(也就是说有多种方法可返回相同的条件)。
- 所有正规TCP数据和所有的UDP数据都被认为是普通数据
- TCP
带外数据
(UNP第24章)被认为是优先级带数据。 - TCP连接的
读半部关闭时
(譬如收到了一个来自对端的FIN),也被认为是普通数据,随后的读操作将返回0. - TCP连接存在错误,
即可以认为是普通数据,也可认为是错误(POLLERR)
。无论哪种情况,随后的读操作将返回 -1
,并把errno 设置为合适的值。 - 在监听套接字上有新的连接可用既可认为是普通数据。也可认为是优先级数据。大多数人将其视为普通数据。
- 非阻塞式connect的完成被认为是相应的套接字可写。
当发生错误
时,poll函数的返回值为-1,若定时器到时之前没有任何描述符就绪,则返回0,否则返回就绪描述符的个数,即revents成员值非0描述值的个数
如果我们不再关心某个特定描述符,那么可以把与它对应的pollfd结构的fd成员
设置成一个负值
。poll函数将忽略
这样的 pollfd 结构的 events 成员,返回时将它的 revents
成员置为0。