当前位置: 首页 > news >正文

Linux 下 poll 详解

在Linux系统编程中,poll 是一个强大的多路复用(I/O 多路复用)函数,用于同时监控多个文件描述符的事件,特别是在处理网络套接字或其他I/O设备时。相比于selectpoll 支持监控更多的文件描述符,并且没有像select那样的文件描述符数量限制。

一、poll函数介绍

poll 函数用于在指定的超时时间内监视一组文件描述符,并返回文件描述符上是否有指定的I/O事件发生。

函数原型

#include <poll.h>

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

  • fds:是一个数组,每个元素是一个pollfd结构,描述一个文件描述符及其要监视的事件。
  • nfds:要监视的文件描述符个数。
  • timeout:等待的超时时间(以毫秒为单位)。-1表示无限等待,0表示立即返回(非阻塞模式)。
pollfd 结构体

struct pollfd { int fd; // 要监视的文件描述符

                short events; // 等待的事件

                short revents; // 实际发生的事件

};

  • fd:要监视的文件描述符,例如套接字或管道。
  • events:感兴趣的事件,可以是以下的值的组合:
    • POLLIN:有数据可读。
    • POLLOUT:可以写数据(不会阻塞)。
    • POLLERR:发生错误。
    • POLLHUP:挂起事件(对方关闭连接)。
    • POLLNVAL:非法的文件描述符。
  • reventspoll返回时,实际发生的事件。
返回值
  • 成功时,返回大于0的值,表示有多少文件描述符有事件发生。
  • 如果超时且无事件发生,返回0。
  • 失败时,返回-1,并设置errno

二、poll 的使用步骤

  1. 创建并初始化pollfd数组:为需要监控的文件描述符设置监视事件。
  2. 调用poll函数:传入pollfd数组、数组大小和超时时间。
  3. 处理事件:根据返回的revents判断哪个文件描述符有事件发生,并做出相应处理。

三、poll 示例

下面是一个使用 poll 监视两个套接字的简单例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define PORT 8080
#define MAX_EVENTS 2int main() {int listenfd, connfd;struct sockaddr_in serv_addr;struct pollfd fds[MAX_EVENTS];int nfds = 1;// 创建监听套接字if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket failed");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(PORT);// 绑定并监听端口if (bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {perror("bind failed");close(listenfd);exit(EXIT_FAILURE);}if (listen(listenfd, 3) < 0) {perror("listen failed");close(listenfd);exit(EXIT_FAILURE);}// 初始化pollfd数组fds[0].fd = listenfd;fds[0].events = POLLIN;printf("Waiting for connections...\n");while (1) {int ret = poll(fds, nfds, -1);  // 无限等待事件if (ret < 0) {perror("poll failed");exit(EXIT_FAILURE);}// 检查监听套接字是否有新连接if (fds[0].revents & POLLIN) {struct sockaddr_in client_addr;socklen_t addr_len = sizeof(client_addr);if ((connfd = accept(listenfd, (struct sockaddr*)&client_addr, &addr_len)) < 0) {perror("accept failed");exit(EXIT_FAILURE);}printf("New connection accepted\n");}}close(listenfd);return 0;
}

这个例子中,程序首先创建了一个监听套接字,然后使用 poll 函数监视这个套接字的 POLLIN 事件(有新的连接到来)。当有新连接时,程序通过 accept 函数接收连接。

四、常用API介绍

在使用poll和其他多路复用函数时,通常会涉及以下API:

  1. socket:创建一个套接字,用于网络通信。

    int socket(int domain, int type, int protocol);

  2. bind:将一个套接字绑定到一个特定的地址和端口。

    int bind(int sockfd, const struct sockaddr *addr,

    socklen_t addrlen);

  3. listen:将一个套接字设置为监听模式,等待客户端的连接。

    int listen(int sockfd, int backlog);

  4. accept:从监听套接字接受一个新的连接。

    int accept(int sockfd, struct sockaddr *addr,

    socklen_t *addrlen);

  5. connect:客户端用于连接到服务端的套接字。

    int connect(int sockfd, const struct sockaddr *addr,

    socklen_t addrlen);

  6. recvsend:分别用于接收和发送数据。

    ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t send(int sockfd, const void *buf, size_t len,

    int flags);

  7. close:关闭文件描述符。

    int close(int fd);

五、pollselect的对比

  • 灵活性poll 可以处理更多的文件描述符,不受select的硬性限制。
  • 事件通知pollpollfd数组更加直观,每个文件描述符有自己的事件和返回事件。
  • 效率poll的实现较select高效,特别是在需要监控大量文件描述符的场景中。

六、结语

poll 提供了一种高效且灵活的方式来监控多个文件描述符的事件,特别适用于网络编程和I/O密集型应用。在实际应用中,poll 被广泛应用于高并发服务器、事件驱动框架等场景中。

如果对文件描述符数量和性能要求更高,还可以考虑使用 epoll,它是 Linux 下的增强版 poll,在处理大规模并发连接时更加高效。

相关文章:

Linux 下 poll 详解

在Linux系统编程中&#xff0c;poll 是一个强大的多路复用&#xff08;I/O 多路复用&#xff09;函数&#xff0c;用于同时监控多个文件描述符的事件&#xff0c;特别是在处理网络套接字或其他I/O设备时。相比于select&#xff0c;poll 支持监控更多的文件描述符&#xff0c;并…...

virtualbox配置为NAT模式后物理机和虚拟机互通

virtualbox配置为 NAT模式后&#xff0c;虚拟机分配到的 IP地址一般是 10.xx网段的&#xff0c;虚拟机可以通过网络地址转换访问物理机所在的网络&#xff0c;但若不做任何配置&#xff0c;则物理机无法直接访问虚拟机。 virtualbox在提供 NAT配置模式时&#xff0c;也提供了端…...

工程机械车辆挖掘机自卸卡车轮式装载机检测数据集VOC+YOLO格式2644张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2644 标注数量(xml文件个数)&#xff1a;2644 标注数量(txt文件个数)&#xff1a;2644 标注…...

[Notepad++] 文本编辑器的下载及详细安装使用过程(附有下载文件)

程序员常用的文本编辑器Notepad&#xff0c;用于修改配置文件等 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压文件&#xff0c;得到 双击exe文件 选择简体中文&#xff0c;点击OK 点击下一步 点击“我接受” 更改安装目录&#xff0c;不…...

深入浅出Java多线程(六):Java内存模型

引言 大家好&#xff0c;我是你们的老伙计秀才&#xff01;今天带来的是[深入浅出Java多线程]系列的第六篇内容&#xff1a;Java内存模型。大家觉得有用请点赞&#xff0c;喜欢请关注&#xff01;秀才在此谢过大家了&#xff01;&#xff01;&#xff01; 在并发编程中&#xf…...

注册了个小趴菜999#it#com

注册了个 999#it#com 拿着玩玩吧 现在二级域名竟然也让注册了 不过cn.com的二级似乎早就可以了...

UE4 材质学习笔记02(数据类型/扭曲着色器)

一.什么是数据类型 首先为啥理解数据类型是很重要的。一些节点的接口插槽只接受特定类型的数据&#xff0c;如果连接了不匹配的数据就会出现错误&#xff0c;有些接口可以接受任何数据类型&#xff0c;但是实际上只会使用到其中的一些。并且有时可以将多个数据流合并成一个来编…...

Linux驱动开发(速记版)--设备树插件

第六十八章 设备树插件介绍 Linux 4.4之后引入了动态设备树&#xff0c;其中的设备树插件&#xff08;Device Tree Overlay&#xff09;是一种扩展机制&#xff0c;允许在运行时动态添加、修改或删除设备节点和属性。 设备树插件机制通过DTS&#xff08;设备树源文件&#xff0…...

代码报错后如何定位问题

文章目录 一、查看终端报错Exception二、百度三、问 一、查看终端报错Exception 代码报错时&#xff0c;终端一般都会有xxxException异常提示&#xff0c;或者exception、error…等字样提示&#xff0c;就顺着这些关键字提醒找到异常即可。 二、百度 不知道这个英文的异常是…...

Python数据可视化--Matplotlib--入门

我生性自由散漫&#xff0c;不喜欢拘束。我谁也不爱&#xff0c;谁也不恨。我没有欺骗这个&#xff0c;追求那个&#xff1b;没有把这个取笑&#xff0c;那个玩弄。我有自己的消遣。 -- 塞万提斯 《堂吉诃德》 Matplotlib介绍 1. Matplotlib 是 Python 中常用的 2D 绘图库&a…...

美国食品等级FDA认证测试介绍

美国FDA认证概览 美国食品和药物管理局&#xff08;FDA&#xff09;是负责监管食品、药品、医疗设备和化妆品等的联邦机构&#xff0c;以确保这些产品对公众健康和安全的影响。FDA认证在美国属于强制性认证&#xff0c;对产品的安全性和质量有着严格的要求。通过FDA认证&#…...

Vue2如何在网页实现文字的逐个显现

目录 Blue留言&#xff1a; 效果图&#xff1a; 实现思路&#xff1a; 代码&#xff1a; 1、空字符串与需渲染的字符串的定义 2、vue的插值表达式 3、函数 4、mounted()函数调用 结语&#xff1a; Blue留言&#xff1a; 在国庆前夕&#xff0c;突发奇想&#xff0c;我想…...

mybatisplus的查询,分页查询,自定义多表查询,修改的几种写法

使用mybatisplus的Db类简化写法 使用静态调用的方式&#xff0c;执行CRUD方法&#xff0c;避免Spring环境下Service循环注入、简洁代码&#xff0c;提升效率需要项目中已注入对应实体的BaseMapper完整使用方式见官方测试用例&#xff1a;官方测试用例地址对于参数为Wrapper的&…...

括号匹配判断

本题实现求表达式中括号是否匹配。只需判断表达式中括号&#xff08;本题中只会出现三种括号&#xff0c;分别是小括号&#xff0c;中括号和大括号&#xff09;是否匹配&#xff0c;表达式中可以有其他值也可没有。 函数接口定义&#xff1a; int match (char *exp); 其中 …...

数据结构(栈和队列的实现)

1. 栈&#xff08;Stack&#xff09; 1.1 栈的概念与结构 栈是一种特殊的线性表&#xff0c;其只允许固定的一段插入和删除操作&#xff1b;进行数据插入和删除的一段叫做栈顶&#xff0c;另一端叫栈底&#xff1b;栈中的元素符合后进先出LIFO&#xff08;Last In First Out&…...

Python批量处理客户明细表格数据,挖掘更大价值

批量处理 .xls 数据并进行归类分析以挖掘内在价值&#xff0c;通常涉及以下步骤&#xff1a; 读取数据&#xff1a;使用 pandas 库读取 .xls 文件。数据清洗&#xff1a;处理缺失值、异常值、重复值等。数据转换&#xff1a;对数据进行必要的转换&#xff0c;如日期格式统一、…...

NAND Flash虚拟层索引表机制

​​​​​ NAND Flash虚拟层的索引表用于建立逻辑块与数据块、日志块之间的关系,用于NAND Flash虚拟层在运行过程中的读写、擦除操作;由于NAND Flash虚拟层采用集中索引的方式,因此在NAND Flash虚拟层启动时需要在NAND Flash存放索引表区域扫描并确定NAND Flash中存…...

Spring Boot框架:新闻推荐系统开发新趋势

3系统分析 3.1可行性分析 通过对本新闻推荐系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻推荐系统采用JAVA作为开发语言&#xff0c;Spring Boot框…...

RK3568平台(opencv篇)opencv处理图像

一.颜色转换 cv2.cvtColor()函数功能: 将一幅图像从一个色彩空间转换到另一个色彩空间。 函数原型: cv2.cvtColor(src,code,dst=None,dstCn=None) 参数定义: src:要转换的源文件 code,转换的色彩空间,在 opencv 中有超过 150 种颜色空间转换方法,但是经常用的只有 B…...

【移动端】Viewport 视口

1. 什么是 Viewport&#xff08;视口&#xff09;&#xff1f; Viewport&#xff08;视口&#xff09;是指浏览器中用户可见的那部分网页内容的区域&#xff0c;简单来说&#xff0c;它是用户当前看到的网页的“窗口”区域。在不同的设备上&#xff0c;Viewport 的大小会有所不…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...