ForeWord
本文介绍了实现I/O多路转接模型的poll接口。
Key Point:
- poll的接口函数介绍
代码实例:用poll监控终端输入输出
~tips:全文阅读需5min~
poll
1.接口函数
linux系统提供了poll来实现IO多路复用模型,下面是其接口函数及参数解释:
timeout是一个定时器,单位是ms,不同的值有不同的含义,如下表:
timeout | 含义 |
---|---|
-1 | 不阻塞,此时poll可以任意进行IO |
大于0 | 隔一段时间阻塞,此时poll每隔一段时间IO被阻塞一次 |
0 | 一直阻塞,此时poll不能进行IO |
其中,pollfd是一个结构体,里面包含就绪的文件描述符及其事件:
所以pollfd结构体整体的含义就指的是关心的fd上的event事件
其中fd+events就相当于select接口里fd_set中的内容。
2. 返回值int
由于poll返回时会将该文件描述符上的就绪事件放入revents中,所以其返回值就是就绪事件fd的个数,如下表所示:
返回值 | 含义 |
---|---|
0 | 超时(timeout) |
<0 | 出错 |
大于0 | 就绪事件的个数 |
Code
接下来调用poll接口,监控终端的输入输出事件(这里只监控输入事件)
Step1:定义pollfd结构体并将timeout设为0
POLLIN是标志位,可以用命令:
grep -ER 'POLLIN |POLLOUT' usr/include/
查看:
所以POLLIN 和POLLOUT都是宏定义,对服务器而言,这两个宏就表示输入输出事件。当然,还有其他的宏定义,这里不介绍。
Step2:加入主事件循环,调用poll接口监控标准输入
运行程序
1.由于timeout设为0,始终阻塞poll的操作,程序将一直阻塞,不会读到输入:
2.将timeout设为5000,每隔5秒poll被阻塞一次:
3.将timeout设为-1,不阻塞。所以可以直接监控终端输入:
poll优缺点总结
优点
poll解决了select最重要的两个问题:
1.poll在处理文件描述符个数上没有上限
poll没有使用select中定长的fd_set,虽然它也是用数组来描述所关心的文件描述符和事件,但此数组是poll专用,是它自己的数组,一旦设置,就不用重置。且数组的上限不是定长的,因为数组的大小与poll无关,而是与系统分配有关。这种瓶颈是由系统决定的。
2.select接口多次调用要借助第三方数组进行参数值重置,而poll将输入参数和输出参数进行了分离,所以不需要每次调用都要将参数值重置。
缺点
由于poll依旧使用数组托管事件,所以用户量暴增时性能也会越来越低。