Linux网络:I/O多路转接poll

目录

一、poll函数解析

二、events和revents事件取值

三、poll的优点

四、poll的缺点


一、poll函数解析

poll函数接口:

#include <poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

参数解析:

// struct pollfd 结构

struct pollfd

{

int fd; /* file descriptor */

short events; /* requested events */

short revents; /* returned events */

};

参数一:

fds 是一个 poll 函数一个监听的结构列表。

每一个结构体元素中, 包含了三部分内容:

1、文件描述符:fd

2、监听的事件集合:events

3、返回的事件集合:revents

参数二:

nfds 表示 fds 数组的长度是多少

参数三:

timeout 表示所设置的 poll 函数的超时时间, 单位是毫秒(ms)

poll函数返回值:

返回值小于 0, 表示出错;

返回值等于 0, 表示 poll 函数等待超时;

返回值大于 0, 表示 poll 由于监听的文件描述符就绪而返回。

二、events和revents事件取值

|-------------|-----------------------|
| | |
| POLLIN | 数据(包括普通/优先数据)可读 |
| POLLRDNORM | 普通数据可读 |
| POLLRDBAND | 优先级带数据可读 |
| POLLPRI | 高级优先级数据可读,如TCP带外数据 |
| POLLOUT | 数据(包括普通/优先数据)可写 |
| POLLWRNORM | 普通数据可写 |
| POLLWRBAND | 优先级带数据可写 |
| POLLERR | 错误 |
| POLLHUP | 挂起 |
| POLLNVAL | 文件描述符未打开 |
| POLLRDHUP | TCP连接被对方关闭,或者对方关闭了写操作 |

三、poll的优点

不同于 select 使用三个位图来表示三个 fdset 的方式,poll 使用一个 pollfd 的指针实现。

**1、**pollfd 结构包含了要监视的 event 和发生的 event,不再使用 select参数值的传递方式. 接口使用上比 select 更方便。

**2、**poll 并没有最大数量的限制 (但是数量过大后性能也是会下降),理论上我们传过去一个多大的数组,poll就处理多大。

四、poll的缺点

**1、**和 select 函数一样,poll 返回后,需要轮询 pollfd 来不断获取已经就绪的描述符。

**2、**每次调用 poll 都需要把大量的 pollfd 结构从用户态拷贝到内核中,如果pollfd过大会影响效率。

**3、**如果同时连接的大量客户端,在同一时刻可能只有很少客户端的处于就绪的状态, 因此随着需要监视的描述符数量增长, 其效率也会呈线性下降。

相关推荐
阿甘知识库7 分钟前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
滴水之功36 分钟前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
saynaihe40 分钟前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
YRr YRr2 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.2 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器