epoll模型下的简易版code

epoll模型下的简易版code

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <fcntl.h>#define MAX_EVENTS 10
#define NUM_DESCRIPTORS 5  // 模拟多个文件描述符// 处理事件的函数
void handle_event(struct epoll_event *event) {// 如果事件对应的文件描述符是标准输入if (event->data.fd == STDIN_FILENO) {printf("stdin is ready\n");} // 如果事件对应的文件描述符是在标准输入之后模拟的多个描述符中的一个else if (event->data.fd >= STDIN_FILENO + 1 && event->data.fd <= STDIN_FILENO + NUM_DESCRIPTORS) {printf("Descriptor %d is ready\n", event->data.fd);}
}int main() {int epfd, nfds;  // epfd 是 epoll 文件描述符,nfds 用于存储实际发生事件的数量struct epoll_event event, events[MAX_EVENTS];int descriptors[NUM_DESCRIPTORS];  // 用于存储模拟的多个文件描述符// 创建 epoll 实例epfd = epoll_create1(0);  // 参数:flags,通常为 0,表示默认行为if (epfd == -1) {perror("epoll_create1");  // 如果创建失败,打印错误信息exit(EXIT_FAILURE);  // 退出程序并返回失败状态}// 模拟多个文件描述符并添加到 epoll 监听for (int i = 0; i < NUM_DESCRIPTORS; i++) {descriptors[i] = STDIN_FILENO + 1 + i;  // 生成模拟的文件描述符event.events = EPOLLIN;  // 设置事件类型为可读event.data.fd = descriptors[i];  // 设置事件对应的文件描述符if (epoll_ctl(epfd, EPOLL_CTL_ADD, descriptors[i], &event) == -1) {  // 将描述符添加到 epoll 监听perror("epoll_ctl");  // 如果添加失败,打印错误信息exit(EXIT_FAILURE);  // 退出程序并返回失败状态}}while (1) {// 等待事件发生nfds = epoll_wait(epfd, events, MAX_EVENTS, -1);  // 参数:epoll 文件描述符,事件数组,数组大小,超时时间(-1 表示无限等待)if (nfds == -1) {perror("epoll_wait");  // 如果等待事件时出错,打印错误信息break;  // 退出循环}for (int i = 0; i < nfds; i++) {handle_event(&events[i]);  // 处理发生的事件}}close(epfd);  // 关闭 epoll 文件描述符return 0;
}
```

整体思路:

  • 主要是创建一个 epoll 实例,然后模拟多个文件描述符并添加到 epoll 进行监听。在一个循环中等待事件发生,并对发生的事件进行相应处理。

实现过程:

  • 在 handle_event 函数中定义了对不同文件描述符事件的处理逻辑,比如对标准输入和模拟的其他描述符的事件分别进行输出。
  • 在 main 函数中,首先创建 epoll 文件描述符 epfd。然后创建模拟的多个文件描述符数组 descriptors。通过循环将这些描述符添加到 epoll 监听,并设置相应的事件类型为可读。之后进入一个无限循环,通过 epoll_wait 等待事件发生,获取到事件数量 nfds 后,对每个事件进行处理。

技术点:

  • epoll 机制:用于高效地处理大量文件描述符的 I/O 事件。
  • 事件监听和处理:通过设置事件结构体的属性来指定要监听的事件类型,并在事件发生时进行相应的处理操作。
  • 错误处理:对创建 epoll、添加监听等操作中的错误进行了捕获和处理,以保证程序的健壮性。

另外,看到一个文章解释挺详细,分享大家一起看。

https://zhuanlan.zhihu.com/p/427512269

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

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

相关文章

【代码随想录训练营】【Day 38】【贪心-5】| Leetcode 435, 763, 56

【代码随想录训练营】【Day 38】【贪心-5】| Leetcode 435, 763, 56 需强化知识点 重叠区间系列 题&#xff0c; 763&#xff0c; 435 题目 435. 无重叠区间 左起点排序&#xff0c;记录重叠区间个数&#xff0c;总数相减即为结果&#xff0c;过程中维护右边界注意&#x…

工具类解决事务和过滤器解决事务

事务的四大特性ACID 原子性&#xff1a;强调事务的不可分割.多条语句要么都成功&#xff0c;要么都失败。 一致性&#xff1a;强调的是事务的执行的前后&#xff0c;数据要保持一致 隔离性&#xff1a;并发访问数据库时,一个事务的执行不应该受到其他事务的干扰. 持久性&#…

测试:ollama加载羊驼版本llama-3中文大模型

找了一个晚上各种模型&#xff0c;像极了当初找各种操作系统的镜像&#xff0c;雨林木风&#xff0c;深蓝、老毛桃…… 主要是官方的默认7B版本回答好多英文&#xff0c;而且回复的很慢&#xff0c;所以我是在ollama上搜索"chinese"找到了这个羊驼版本的&#xff0c…

使用javacv对摄像头视频转码并实现播放

要实现Java接受RTSP流解码&#xff0c;并推送给前端实现播放实时流&#xff0c;可以使用一些流媒体处理库&#xff0c;比如JavaCV或者FFmpeg等。以下是一个简单的示例代码&#xff1a; 1.控制层方面的 根据视频rtsp流链接打开转换&#xff0c;通过响应写出流到前台使用flvjs播…

go语言初学04

Go 语言近年来发展迅速&#xff0c;并且出现了许多优秀的开发框架和组件来支持各种不同的开发需求。以下是一些常用的 Go 语言开发框架和组件&#xff1a; Web 框架 Gin&#xff1a; URL: Gin简单、高效、易用&#xff0c;适合构建高性能的 Web 应用。 Echo&#xff1a; URL: …

crossover软件是干什么的 crossover软件安装使用教程 crossover软件如何使用

CrossOver 以其出色的跨平台兼容性&#xff0c;让用户在Mac设备上轻松运行各种Windows软件&#xff0c;无需复杂的设置或额外的配置&#xff0c;支持多种语言&#xff0c;满足不同国家和地区用户的需求。 CrossOver 软件是干嘛的 使用CrossOver 不必购买Windows 授权&#xf…

Winform ListView 嵌入组合框、布尔、图片等复杂控件

一、Winform ListView 显示复杂控件示例 以下展示了两种实现思路方案。最后修改日期 2024-05 surfsky 1.1 方案一&#xff1a;ListView 结合组合框进行模拟编辑 基本思路 在界面上放置一个lisview和一个combobox&#xff0c;combobox平时是隐藏的。点击listview&#xff0c…

ArrayList源码讲解

ArrayList 底层采用的是数组队列&#xff0c;相当于动态数组。 ArrayList内部使用一个可重新分配的Object数组来存储元素&#xff0c;这个数组会随着元素的添加自动增长以容纳更多的元素&#xff0c;这就是所谓的“动态数组”。 1.实现了RandomAccess接口&#xff0c;可以随机…

rust嵌入式开发之总结

我们用rust开发的新版产品刚刚交付&#xff0c;已经在海上安装测试完毕并顺利投产。终于松了口气&#xff0c;同时也有时间和精力来做个全面的总结了。 这个产品&#xff0c;目前差不多有三版&#xff1a; 第一个版本是用crt-thread写的&#xff0c;投产后出了一个内存泄露的…

521源码-源码论坛-宝塔面板操作日志是存放在哪里的? 如何删除部分日志记录

我们帮别人搭建或者登录了&#xff08;不是自己权属的宝塔面板&#xff09;&#xff0c;会留下登录及操作的日志&#xff0c;我们不想留下这些操作日志&#xff0c;可以通过下面的方法处理掉&#xff0c;以达到无痕迹访问操作的目的&#xff1a; 如图所示的面板操作日志&#…

Python-3.12.0文档解读-内置函数sum()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 sum(iterable, /, start0) 参数&#xff1a; 返回值&#xff1a; 注意事…

骑砍2霸主MOD开发(10)-游戏大地图(MapScene)制作

一.MapScene中初始化NavMeshFaceID与TerrainType public TerrainType GetFaceTerrainType(PathFaceRecord navMeshFace){switch (navMeshFace.FaceGroupIndex){case 1:return TerrainType.Plain;case 2:return TerrainType.Desert;case 3:return TerrainType.Snow;case 4:retur…

算法优化:空间与时间复杂度的权衡

引言 在软件开发中&#xff0c;算法的性能至关重要。算法的性能通常通过其时间复杂度和空间复杂度来衡量。时间复杂度指的是算法执行时间与输入规模的关系&#xff0c;而空间复杂度则关注算法执行过程中所占用的存储空间。本文将探讨如何权衡这两者&#xff0c;以实现算法的最…

排序方法大汇总

以下所有排序方法均以排升序为例 一.插入排序 1.直接插入排序 1>方法介绍&#xff1a;假定前n个数据有序&#xff0c;将第n1个数据依次与前n个数据相比&#xff0c;若比第i个数据小且比第i-1个数据大则插入两者之间 2>时间复杂度&#xff1a;O(N^2) 空间复杂度&#…

【JS】对象转变成数组

1、Object.keys() 方法&#xff1a; 将对象的键转换为数组 const a { name: aa,age: 18 }; const arr Object.keys(a); console.log(arr); // 输出 [name, age] 2、Object.values() 方法&#xff1a; 将对象的值转换为数组 const a { name: aa,age: 18 }; const arr Obj…

BUUCTF中的密码题目解密

BUUCTF 1.MD5 题目名称就是MD5&#xff0c;这个题目肯定和md5密码有关&#xff0c;下载题目&#xff0c;打开后发现这确实是一个md5加密的密文 Md5在线解密网站&#xff1a;md5在线解密破解,md5解密加密 经过MD5在线解密网站解密后&#xff0c;获取到flag为&#xff1a;flag{…

域名主机服务器配置失败的原因和解决方法

域名主机服务器配置失败的原因可能涉及多个方面&#xff0c;包括域名设置、DNS配置、服务器设置、网络问题等。以下是一些常见的原因和相应的解决方案&#xff1a; 1. DNS配置错误 原因&#xff1a; 域名解析错误&#xff1a;域名没有正确指向服务器的IP地址。 DNS记录未更新&a…

网络编程TCP

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java网络编程(下)&#x1f649; &#x1f439;今日诗词: 壮士当唱大风哥, 宵小之徒能几何&#xff1f;&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微…

CentOS7单用户模式,救援模式操作记录

CentOS7单用户模式&#xff0c;救援模式操作记录 1. 单用户模式 单用户模式进入不需要密码&#xff0c;无网络连接&#xff0c;拥有root权限&#xff0c;禁止远程登陆。一般用于用于系统维护&#xff0c;例如忘记root密码后可以通过进入单用户模式进行重置。 开机启动&#…

数据结构 实验 1

题目一&#xff1a;用线性表实现文具店的货品管理问题 问题描述&#xff1a;在文具店的日常经营过程中&#xff0c;存在对各种文具的管理问题。当库存文具不足或缺货时&#xff0c;需要进货。日常销售时需要出库。当盘点货物时&#xff0c;需要查询货物信息。请根据这些要求编…