Linux学习笔记:poll与epoll
接着上一篇IO多路复用的另外两种实现poll和epoll。select之前整理过了这里主要讲poll和epoll的特点以及epoll的三个核心函数。一、pollpoll的特点1. 使用链表保存文件描述符集合允许监测的文件描述符没有上限限制2. 创建的文件描述符集合在应用层需要应用层和内核层的反复数据拷贝3. 应用层对于返回的事件结果需要遍历查找4. poll只能工作在水平触发模式低速模式无法工作在边沿触发模式高速模式简单说就是poll解决了select有fd数量上限的问题但本质上和select差不多还是要在用户态和内核态之间来回拷贝返回后还要自己遍历找哪个fd就绪了而且只有水平触发。二、epollepoll的特点1. 使用树形结构红黑树保存文件描述符集合没有文件描述符上限限制并且查找效率高2. 文件描述符集合创建在内核层避免了应用层和内核层的反复数据拷贝3. 直接返回到达事件的文件描述符集合4. epoll可以工作在水平触发模式低速模式也可以工作在边沿触发模式高速模式epoll比poll和select都高效核心原因就是集合放在内核里不用每次调用都拷贝一遍而且直接返回就绪的fd不用自己遍历全部。三、epoll三个核心函数1. epoll_create — 创建文件描述符集合int epoll_create(int size);功能创建epoll的文件描述符集合。参数- size允许监测的文件描述符的个数返回值- 成功返回文件描述符句柄- 失败-12. epoll_ctl — 添加/修改/删除文件描述符int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);功能对文件描述符集合中的文件描述符做操作。参数- epfdepoll创建的文件描述符集合- op操作方法- EPOLL_CTL_ADD添加操作- EPOLL_CTL_MOD修改操作- EPOLL_CTL_DEL删除操作- fd要操作的文件描述符- eventepoll事件结构体事件结构体定义typedef union epoll_data {void *ptr;int fd; // 要监测的文件描述符uint32_t u32;uint64_t u64;} epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */};events事件类型- EPOLLIN读事件- EPOLLOUT写事件返回值- 成功0- 失败-13. epoll_wait — 通知内核开始监测事件int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);功能通知内核开始监测事件。参数- epfd监测的文件描述符句柄- events保存epoll返回的到达事件的集合- maxevents最多监测的事件个数- timeout设置超时时间-1表示不设置超时一直阻塞等待返回值- 成功实际到达的事件的个数- 失败-1- 0超时时间到达却没有事件返回时四、epoll TCP服务器示例#include stdio.h#include sys/types.h#include sys/socket.h#include arpa/inet.h#include netinet/in.h#include unistd.h#include string.h#include sys/epoll.h#define MAX_EVENTS 20int main(void){int sockfd socket(AF_INET, SOCK_STREAM, 0);if (-1 sockfd) {perror(socket error);return -1;}struct sockaddr_in seraddr;seraddr.sin_family AF_INET;seraddr.sin_port htons(50000);seraddr.sin_addr.s_addr inet_addr(192.168.0.119);if (bind(sockfd, (struct sockaddr *)seraddr, sizeof(seraddr)) -1) {perror(bind error);close(sockfd);return -1;}if (listen(sockfd, 5) -1) {perror(listen error);close(sockfd);return -1;}// 1. 创建epoll集合int epfd epoll_create(MAX_EVENTS);if (-1 epfd) {perror(epoll_create error);close(sockfd);return -1;}// 2. 把监听套接字加入epollstruct epoll_event ev;ev.events EPOLLIN;ev.data.fd sockfd;epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, ev);struct epoll_event events[MAX_EVENTS];char buff[1024] {0};while (1) {// 3. 等待事件int nready epoll_wait(epfd, events, MAX_EVENTS, -1);if (-1 nready) {perror(epoll_wait error);break;}for (int i 0; i nready; i) {int fd events[i].data.fd;if (fd sockfd) {// 有新连接struct sockaddr_in cliaddr;socklen_t addrlen sizeof(cliaddr);int connfd accept(sockfd, (struct sockaddr *)cliaddr, addrlen);if (-1 connfd) {perror(accept error);continue;}printf(客户端 [%s:%d] 接入\n, inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));// 把新客户端加入epollev.events EPOLLIN;ev.data.fd connfd;epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, ev);} else {// 客户端发数据memset(buff, 0, sizeof(buff));ssize_t size recv(fd, buff, sizeof(buff) - 1, 0);if (size 0) {printf(客户端断开\n);epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);close(fd);continue;}printf(收到: %s\n, buff);send(fd, buff, size, 0);}}}close(epfd);close(sockfd);return 0;}整体流程就是epoll_create创建集合epoll_ctl把fd加进去epoll_wait等事件返回后直接遍历就绪的fd处理就行比select简洁高效很多。

相关新闻

人工智能课后答案怎么用?从对答案到会解题的实战指南

人工智能课后答案怎么用?从对答案到会解题的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 21:57:26 阅读更多 →
电竞硬盘盒选购与使用指南:NVMe、USB 3.2 Gen2与散热实战解析

电竞硬盘盒选购与使用指南:NVMe、USB 3.2 Gen2与散热实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 14:12:56 阅读更多 →
计算机一级考试备考全攻略:知识点汇总PDF的高效使用与实操技巧

计算机一级考试备考全攻略:知识点汇总PDF的高效使用与实操技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 7:43:58 阅读更多 →

最新新闻

Vue组件复用实战:拆掉业务雷区,打造可搬走的积木组件

Vue组件复用实战:拆掉业务雷区,打造可搬走的积木组件

这个系列写到第 10 节了。前面聊过组件通信、状态管理、渲染性能,也拆过不少真实项目。今天想谈一个更扎心、也更常见的问题:你花两个晚上精心封装的 Vue 组件,究竟是随时能搬走的“可复用积木”,还是换一个页面就爆炸的“业务雷区…

2026/10/17 21:58:59 阅读更多 →
麒麟V10上搭建UE5.3与Vscode开发环境:从源码构建到调试全攻略

麒麟V10上搭建UE5.3与Vscode开发环境:从源码构建到调试全攻略

最近帮组里把开发机上的UE5环境重新捋了一遍,系统用的是麒麟V10,引擎是5.3版本,日常写代码全靠Vscode。这套组合不像Ubuntu Clion那样开箱即用,中途踩了不少坑,也摸出了一些门道。写这篇东西,就是想把整个…

2026/10/17 21:58:59 阅读更多 →
公钥密码安全命门:伪随机数生成器原理与工程实践

公钥密码安全命门:伪随机数生成器原理与工程实践

1. 从一次密钥生成事故说起:为什么伪随机数才是公钥密码的命门几年前我参与过一个内部工具的开发,功能很简单:给测试环境批量生成RSA密钥对。当时图省事,直接调了某语言内置的随机数接口,没做任何额外处理。结果在一次…

2026/10/17 21:58:59 阅读更多 →
Keras .h5模型加载失败根因与五维验证实战指南

Keras .h5模型加载失败根因与五维验证实战指南

1. 为什么一个简单的模型加载,反而成了Keras项目上线前最常卡住的环节?在某跨平台图像分类系统交付前的最后48小时,A同学在测试环境反复遇到ValueError: Unknown layer: CustomAttentionBlock报错——明明训练时一切正常,.h5文件也…

2026/10/17 21:58:59 阅读更多 →
本地优先的AI编码代理:Electron+Rust双引擎架构实战与踩坑记录

本地优先的AI编码代理:Electron+Rust双引擎架构实战与踩坑记录

今年有个问题一直绕不开:AI 编码代理到底应该长在云端还是本地?PI-Desktop 是我最近在推进的一个答案——它是一款本地优先的 AI 编码代理桌面应用,用 Electron 做交互层,Rust 做推理和计算层,两个引擎各管各的&#x…

2026/10/17 21:58:59 阅读更多 →
nanodet轻量级目标检测模型实战部署指南

nanodet轻量级目标检测模型实战部署指南

1. 项目概述:为什么一个轻量级目标检测模型值得单独开一模块讲?“第一模块:深度学习轻量级模型nanodet”——这个标题乍看像课程大纲里的普通一节,但如果你在嵌入式视觉、边缘AI部署、移动端算法落地或工业质检一线干过几年&#…

2026/10/17 21:57:58 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →