• 函数原型
  • 参数
    • fds
    • nfds
    • timeout
  • 返回值
  • pollfd

    poll()和select()原理相同,但实现方式不同。select()用的更为频繁,但据说poll()效率更高,不过自Linux 2.5.44后被epoll取代。

    函数原型

    1. #include <poll.h>
    2. int poll(struct pollfd *fds, nfds_t nfds, int timeout);

    参数

    fds

    pollfd结构的数组。
    检测每个结构中的fd对应的events事件是否就绪。在poll返回的时候将就绪情况写入到revents中。

    nfds

    nfds_t是unsigned long类型,据《UNP》所言,该类型过大了。

    timeout

    • -1:永远等待(一说:负数)
    • 0:不等待,立即返回
    • 0:等待指定数目的毫秒数

    返回值

    • 0: 表示超时返回
    • -1:表示出错
    • 0:表示就绪的的文件描述符的数量

    poll()与select()返回正数时,其含义有差别:

    • select(): 如果同一个文件描述符在多个fd集(select有三个fd集合)中返回,则返回值也统计多次
    • poll():即使同一个fd出现在多个pollfd元素的revents成员中,也只被统计一次。

    pollfd

    typedef的结构体类型

    成员 类型 说明
    fd int
    events short
    revents short

    events和revents都是bit masks。events是输入,revents是输出(返回),events由用户设置,revents在函数返回时被设置。其取值可以是如下宏的按位或的结果:

    输入事件bit位 events的输入? revents的结果? 说明
    POLLIN 有数据可读
    POLLRDNORM 等价于POLLIN
    POLLPRI 高优先级数据可读
    POLLRDHUP 对等套接字关闭
    输出事件bit位 events的输入? revents的结果? 说明
    POLLOUT 普通数据可写
    POLLWRNORM 等价于POLLOUT
    POLLWRBAND 优先级数据可写
    错误事件bit位 events的输入? revents的结果? 说明
    POLLERR 发生错误
    POLLHUP 发生挂起
    POLLNVAL (invalid)fd没有被打开

    POLLRDHUP 从Linux 2.6.17开始被支持
    差异性:《UNP》中提到的POLLRDBAND其实并不被Linux支持;此外《UNP》中POLLIN与POLLRDNORM,POLLOUT与POLLWRNORM也并非等价。