IO多路复用之poll的简单介绍(基于select)

本文介绍了poll函数,它是对select的改进,解决了fd数量限制和事件监听/返回分离问题。poll适用于fd较多的场景,但select的遍历和拷贝成本问题依然存在。作者提供使用参考,推荐从select基础学习并结合实际需求选择使用。
摘要由CSDN通过智能技术生成

前言

        本文章不会从头开始讲解poll,而是在基于了解select的基础上进行讲解以及对比,因此如果你还不了解select,可以看看我的上一篇文章

接口介绍

参数介绍

        先从简单的看起,第三个参数timeout是一个int类型的整型,代表毫秒。当传入大于0的数据时,如500,poll会在500ms内阻塞,超过500ms时返回一次。当传入0时,poll非阻塞等待。传入小于0的数据时,poll阻塞式等待。

        第一个参数fds是一个结构体指针,具体定义如下

         与select的参数不同,它并不是一个输入输出型参数,而是更接近于一个数组。成员fd表示监视的文件描述符;成员events表示需要系统监听的事件集合;成员revents表示返回的事件集合。事件类型如下表所示:     

事件描述是否可作为输入是否可作为输出
POLLIN数据(包括普通数据和优先数据)可读YY
POLLRDNORM普通数据可读YY
POLLRDBAND优先级带数据可读(Linux不支持)YY
POLLPRI高优先级数据可读,比如TCP带外数据YY
POLLOUT数据(包括普通数据和优先数据)可写YY
POLLWRNORM普通数据可写YY
POLLWRBAND优先级带数据可写YY
POLLRDHUPTCP连接被对方关闭,或者对方关闭了写操作,它由GNU 引入YY
POLLERR错误NY
POLLHUP挂起。比如管道的写端被关闭后,读端描述符上将收到POLLHUP 事件NY
POLLNVAL文件描述符没有打开NY

        第二个参数nfds代表fds数组的长度。

返回值

        与select相同,当ret大于0时,ret代表有几个fd准备就绪。当ret等于0时,说明select超时返回了。当ret小于0时,说明select调用失败,错误码被设置。

相比于select

        poll解决了select能监听fd个数有上限的问题;poll将监听事件与返回事件分离,降低了代码难度,增加了代码的可读性。

        select的遍历成本和拷贝成本问题poll仍然没有解决。

 

使用参考 

        这里就不贴代码了,poll相比于epoll重要程度不高,使用思路与select类似,并且更方便。有兴趣的可以改改我上一篇文章select的代码。 

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值