深入理解epoll

文章目录

  • 概述
  • 1. epoll_create - 创建一个epoll实例
  • 2. epoll_ctl - 控制epoll实例的事件
    • 结构体介绍
      • events取值:
      • data: 联合体(共用体):
  • 3. epoll_wait - 等待事件发生
  • 伪代码
  • 总结

概述

在网络编程中,高效地处理大量并发连接是一个关键问题。而Linux提供的epoll机制成为了解决这个问题的重要工具。epoll是一种I/O事件通知机制,通过三个主要函数,即epoll_create、epoll_ctl和epoll_wait,实现了高性能的事件驱动并发编程。让我们深入了解这三个函数以及它们的使用方法。

1. epoll_create - 创建一个epoll实例

int epoll_create(int size);

size:创建的红黑树的监听节点数量。(仅供内核参考。)
返回值:指向新创建的红黑树的根节点的 fd。
-1:代表错误

2. epoll_ctl - 控制epoll实例的事件

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

epfd:epoll_create 函数的返回值。 epfd
op:对该监听红黑数所做的操作。
EPOLL_CTL_ADD 添加fd到 监听红黑树
EPOLL_CTL_MOD 修改fd在 监听红黑树上的监听事件。
EPOLL_CTL_DEL 将一个fd 从监听红黑树上摘下(取消监听)
fd:待监听的fd
event: 本质 struct epoll_event 结构体指针
返回值:成功 0; 失败: -1 errno

结构体介绍

struct epoll_event {__uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */};typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;

events取值:

EPOLLIN : 表示对应的文件描述符可以读(包括对端SOCKET正常关闭)
EPOLLOUT: 表示对应的文件描述符可以写
EPOLLERR: 表示对应的文件描述符发生错误
等等(不重要)

data: 联合体(共用体):

int fd; 对应监听事件的 fd
void *ptr; 回调函数
uint32_t u32;
uint64_t u64;

3. epoll_wait - 等待事件发生

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

epoll_wait函数用于等待事件发生,当事件发生时将返回就绪的文件描述符以及对应的事件类型。参数包括:

epfd:epoll_create 函数的返回值。 epfd

events:传出参数,【数组】, 满足监听条件的 那些 fd 结构体。

maxevents:上面数组元素的总个数。 eg:struct epoll_event evnets[1024]->1024

timeout:
-1: 阻塞
0: 不阻塞
大于0: 超时时间 (毫秒)
返回值:
大于0: 满足监听的 总个数。 可以用作循环上限。
0: 没有fd满足监听事件
-1:失败。 errno

在这里插入图片描述

伪代码

关于代码实现可以参考:链接
epoll实现多路IO转接思路:

lfd = socket();			监听连接事件lfd
bind();
listen();int epfd = epoll_create(1024);				epfd, 监听红黑树的树根。struct epoll_event tep, ep[1024];			tep, 用来设置单个fd属性, ep 是 epoll_wait() 传出的满足监听事件的数组。tep.events = EPOLLIN;					初始化  lfd的监听属性。
tep.data.fd = lfdepoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &tep);		将 lfd 添加到监听红黑树上。while (1) {ret = epoll_wait(epfd, ep,1024-1);			实施监听for (i = 0; i < ret; i++) {if (ep[i].data.fd == lfd) {				// lfd 满足读事件,有新的客户端发起连接请求cfd = Accept();tep.events = EPOLLIN;				初始化  cfd的监听属性。tep.data.fd = cfd;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &tep);} else {						cfd 们 满足读事件, 有客户端写数据来。n = read(ep[i].data.fd, buf, sizeof(buf));if ( n == 0) {close(ep[i].data.fd);epoll_ctl(epfd, EPOLL_CTL_DEL, ep[i].data.fd , NULL);	// 将关闭的cfd,从监听树上摘下。} else if (n > 0{--write(ep[i].data.fd, buf, n);}}}

总结

通过使用epoll_create、epoll_ctl和epoll_wait这三个主要函数,我们可以充分利用Linux的epoll机制来实现高效的事件驱动并发编程。首先,通过创建epoll实例,我们能够监控多个文件描述符。然后,使用epoll_ctl函数来添加、修改和删除需要监控的事件。最后,通过调用epoll_wait函数来等待事件的发生并处理就绪的文件描述符。

这些函数的合理使用可以帮助我们有效地管理大量并发连接,提高系统的性能和响应能力。当然,在实际应用中,我们还需要结合其他的网络编程知识和技巧,以实现更加稳定和高效的网络应用程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

c++11 explicit关键字的作用

explicit 在C中&#xff0c;explicit关键字用来修饰类的构造函数&#xff0c;被修饰的构造函数的类&#xff0c;不能发生相应的隐式类型转换&#xff0c;只能以显示的方式进行类型转换。因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义…

​五金件机器视觉定位​并获取外观轮廓软硬件视觉方案

【检测目的】 五金件机器视觉定位&#xff0c;视觉检测五金件轮廓并矫正五金件位置进行涂油 【客户要求】 FOV:540*400mm 【拍摄与处理效图一】 【拍摄与处理效图二】 【实验原理及说明】 【方案评估】 根据目前的图像和处理结果来看&#xff0c;可以检测出产品轮廓并进行位置…

HCIP-OpenStack搭建

1、OpenStack概述 OpenStack是一种云操作系统&#xff0c;OpenStack是虚拟机、裸金属和容器的云基础架构。可控制整个数据中心的大型计算、存储和网络资源池&#xff0c;所有资源都通过具有通用身份验证机制的API进行管理和配置。管理员也可通过Web界面控制&#xff0c;同时授…

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面&#xff08;GUI&#xff09;应用程序时&#xff0c;经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…

基于RoCE的应用程序的MTU注意事项

目录 基于RoCE的应用程序的MTU注意事项 探测网络中的MTU设置 概要 原文 MTU测试结果 DOC: CentOS安装tshark抓包工具 基于RoCE的应用程序的MTU注意事项 原文&#xff1a;https://support.mellanox.com/s/article/MLNX2-117-1682kn InfiniBand协议最大传输单元&#xff…

WSL2 Ubuntu子系统安装OpenCV

文章目录 前言一、&#xfeff;基本概念二、操作步骤1.下载源码2.安装依赖3.运行编译4.配置路径 前言 OpenCV用C语言编写&#xff0c;它的主要接口也是C语言&#xff0c;但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语…

C#委托事件的区别

在C#中&#xff0c;委托&#xff08;delegate&#xff09;和事件&#xff08;event&#xff09;经常一起使用&#xff0c;但它们之间确实有一些基本的区别&#xff1a; 委托&#xff08;Delegate&#xff09;&#xff1a;委托是一个引用类型&#xff0c;它可以引用一个或多个具…

[python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决

这篇文章主要讲述Python如何安装Numpy、Scipy、Matlotlib、Scikit-learn等库的过程及遇到的问题解决方法。最近安装这个真是一把泪啊&#xff0c;各种不兼容问题和报错&#xff0c;希望文章对你有所帮助吧&#xff01;你可能遇到的问题包括&#xff1a; ImportError: N…

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

又到每天一期学习爬虫的时间了&#xff0c;作为一名专业的爬虫程序员&#xff0c;今天要跟你们分享一个超实用的技巧&#xff0c;就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上&#xff1f;别担心&#xff0c;我会用通俗易懂的话来和你们说&#xff0c;让你…

自定义组件引入使用单标签还是双标签好

在许多前端框架和库中&#xff0c;自定义组件可以使用单标签或双标签进行引入和使用。让我为您解释一下这两种方式的区别和使用场景。 单标签&#xff08;Self-closing Tag&#xff09;&#xff1a;使用单标签来引入自定义组件意味着您在组件的使用中只需要一个标签&#xff0…

自动切换HTTP爬虫ip助力Python数据采集

在Python的爬虫世界里&#xff0c;你是否也被网站的IP封锁问题困扰过&#xff1f;别担心&#xff0c;我来教你一个终极方案&#xff0c;让你的爬虫自动切换爬虫ip&#xff0c;轻松应对各种封锁和限制&#xff01;快来跟我学&#xff0c;让你的Python爬虫如虎添翼&#xff01; 首…

如何使用mysql命令行导出csv文件?

首先打开ssh&#xff0c;使用命令行登录mysql mysql -uroot -p123456 其中-u后面的root是用户名&#xff0c;-p后面的123456是密码 &#xff0c;替换成自己的账户和密码即可 然后切换到自己需要操作的数据库&#xff0c;例如test数据库 use test 接下来执行语句来选择要导…

服务器托管中1U是什么意思?

U的概念 U是一种表示服务器外部尺寸的单位&#xff0c;是unit的缩略语。 1U4.44514.445cm 2U4.44528.89cm 4U4.445*413.335cm 在托管服务器时&#xff0c;服务商经常说的“1U”是外形满足EIA&#xff08;美国电子工业协会&#xff09;规格、厚度为4.445cm的产品&#xff0c;设…

uniapp-微信小程序篇

uniapp-微信小程序篇 一、创建项目(以Vue3TS 项目为示例) 可以通过命令行的方式创建也可以通过HBuilderX进行创建&#xff08;通过HBuilderX创建的项目建议选择最简单的模板&#xff09;&#xff0c;个人建议使用命令行方式。 (1) 命令行方式&#xff1a; npx degit dcloudio…

ABAP 期初库存批量导入 demo1

&--------------------------------------------------------------------- *& Report ZMMCP005 &--------------------------------------------------------------------- 作者&#xff1a; Liv完成日期&#xff1a;描述&#xff1a; 期初库存导入需求简要说明&…

uni-app 面容、指纹识别插件(uni-face-login)

面容、指纹识别插件(uni-face-login) 介绍 人脸指纹登录授权&#xff0c;可以使用手机自带的人脸、指纹进行生物识别&#xff0c;进而判断是否机主本人&#xff0c;从而进行授权验证&#xff0c;适配安卓、iOS、鸿蒙设备 猛戳这里去插件市场看看 使用 该插件支持鸿蒙、安卓…

UE4/5C++多线程插件制作(二十一、使用)

目录 DemoPawn.h DemoPawn.cpp 会出现的bug 插件 相关的插件制作在上一节已经完成了。 具体的使用方式在第0章已经写了,get之后去绑定即可。 而后笔者做了一个接口,具体的绑定方式也就在这个接口里面。 接下来最重要的是进行使用,对此我做了一个与蓝图相关的接口,里…

TypeScript教程(一)简介与安装

一、简介 TypeScript 是 JavaScript 的一个超集&#xff0c;扩展了JavaScript的语法&#xff0c;因此现有的JavaScript可与TypeScript一起工作无需修改&#xff0c;支持 ECMAScript 6 标准&#xff08;ES6 教程&#xff09;。 语言特性&#xff1a; 1.类型批注和编译时类型检…

怎么学习AJAX相关技术? - 易智编译EaseEditing

学习AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;相关技术可以让你实现网页的异步数据交互&#xff0c;提升用户体验。以下是一些学习AJAX技术的步骤和资源&#xff1a; HTML、CSS和JavaScript基础&#xff1a; 首先&#xff0c;确保你已经掌握了基本的HTML…