博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I/O多路转接之poll
阅读量:4150 次
发布时间:2019-05-25

本文共 1112 字,大约阅读时间需要 3 分钟。


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依旧使用数组托管事件,所以用户量暴增时性能也会越来越低。

你可能感兴趣的文章
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
【Python】学习笔记——-7.0、面向对象编程
查看>>
【Python】学习笔记——-7.2、访问限制
查看>>
【Python】学习笔记——-7.3、继承和多态
查看>>
【Python】学习笔记——-7.5、实例属性和类属性
查看>>
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>