I/O多路转接之poll

本文详细介绍了Linux系统中的poll接口,用于实现I/O多路复用模型。内容包括poll的接口函数、返回值解析以及代码实例,展示了如何使用poll监控终端输入输出。同时,文章总结了poll相对于select的优势,如无文件描述符数量限制,以及避免重复设置参数的便利性。然而,poll在处理大量用户时性能可能会下降。
摘要由CSDN通过智能技术生成

ForeWord


本文介绍了实现I/O多路转接模型的poll接口。

Key Point:

  1. poll的接口函数介绍
  2. 代码实例:用poll监控终端输入输出

               ~tips:全文阅读需5min~
    

poll


1.接口函数

linux系统提供了poll来实现IO多路复用模型,下面是其接口函数及参数解释:

1

timeout是一个定时器,单位是ms,不同的值有不同的含义,如下表:

timeout含义
-1不阻塞,此时poll可以任意进行IO
大于0隔一段时间阻塞,此时poll每隔一段时间IO被阻塞一次
0一直阻塞,此时poll不能进行IO

其中,pollfd是一个结构体,里面包含就绪的文件描述符及其事件:

666

所以pollfd结构体整体的含义就指的是关心的fd上的event事件

其中fd+events就相当于select接口里fd_set中的内容。

2. 返回值int

由于poll返回时会将该文件描述符上的就绪事件放入revents中,所以其返回值就是就绪事件fd的个数,如下表所示:

返回值含义
0超时(timeout)
<0出错
大于0就绪事件的个数

Code

接下来调用poll接口,监控终端的输入输出事件(这里只监控输入事件)

Step1:定义pollfd结构体并将timeout设为0

555

15

POLLIN是标志位,可以用命令:

            grep -ER 'POLLIN |POLLOUT' usr/include/

查看:

5164

所以POLLIN 和POLLOUT都是宏定义,对服务器而言,这两个宏就表示输入输出事件。当然,还有其他的宏定义,这里不介绍。

Step2:加入主事件循环,调用poll接口监控标准输入

2+

运行程序

1.由于timeout设为0,始终阻塞poll的操作,程序将一直阻塞,不会读到输入:

165

2.将timeout设为5000,每隔5秒poll被阻塞一次:

123

3.将timeout设为-1,不阻塞。所以可以直接监控终端输入:

1687


poll优缺点总结


优点

poll解决了select最重要的两个问题:

1.poll在处理文件描述符个数上没有上限

    poll没有使用select中定长的fd_set,虽然它也是用数组来描述所关心的文件描述符和事件,但此数组是poll专用,是它自己的数组,一旦设置,就不用重置。且数组的上限不是定长的,因为数组的大小与poll无关,而是与系统分配有关。这种瓶颈是由系统决定的。

2.select接口多次调用要借助第三方数组进行参数值重置,而poll将输入参数和输出参数进行了分离,所以不需要每次调用都要将参数值重置。

缺点

由于poll依旧使用数组托管事件,所以用户量暴增时性能也会越来越低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值