您的位置:首页 > 其它

I/O多路复用之poll函数分析

2017-04-18 10:06 148 查看
poll函数
poll的机制与select类似,也是指定时间内轮询一定数量的文件描述符,以测试其中是否有就绪者,poll原型如下:

1

2

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

参数:
1)fds参数是一个pollfd结构类型的数组,它制定所有我们感兴趣的文件描述符上发生的可读,可写和异常等事件。pollfd结构体的定义如下:  

1

2

3

4

5

6

struct pollfd

{

    int fd;               //文件描述符
    short events;       //注册的事件
    short revents;      //实际发生的事件,由内核填充
}

其中,fd成员指定文件描述符,events成员告诉poll监听fd上的哪些事件,它是一系列事件的按位或;revents成员则是由内核修改,以通知应用程序fd上实际发生了哪些事件。poll支持的事件类型如表所示:






表中,POLLRDNORM、POLLRDBAND、POLLWRNORM、POLLWRBAND由XOPEN规范定义。它们实际上是将POLLIN事件和POLLOUT事件分得更细致。

2)nfds参数指定被监听事件集合fds的大小,比如定义structpollfd fds[2],则nfds就为2。
类型nfds_t的定义如下: 

  typedef unsigned long int nfds_t;

3)timeout参数指定poll的超时值,单位是毫秒。

timeout为-1时,poll调用将永远阻塞,直到某个事件发生;
timeout为0时,poll调用将立即返回。
timeout>0时,等待指定数目的毫秒数。

返回值
poll系统调用的返回值的含义和select相同。

poll函数的优点和缺点:
优点:

poll函数可以处理多个socket描述符。
记录内核返回状态的描述符。

缺点:

select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降(内核态和用户态都需要遍历描述符集合)。

用poll实现udp同时收发
示例代码:https://github.com/chensguo8099/network_programming/blob/master/poll_udp_test.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: