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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

即时通讯系统是什么?

在信息化发展的时代&#xff0c;人们需要更加高效、便捷的通信方式来满足日常沟通和合作的需求。即时通讯系统应运而生&#xff0c;成为人们日常生活和工作中不可或缺的一部分。即时通讯系统通过互联网或其他网络通信技术实现实时信息传递&#xff0c;为用户提供了文字、语音、…

Adobe InDesign 专业桌面排版软件下载安装,Id软件丰富的排版和设计工具!

Adobe InDesign这款革命性的应用程序不仅彻底改变了出版业的生产流程&#xff0c;更引领着设计领域向前迈进。 在Adobe InDesign的众多强大功能中&#xff0c;对OpenType字体的支持堪称其一大亮点。OpenType字体不仅拥有更加丰富的字体样式和字符集&#xff0c;还具备更为灵活…

遥感之特征选择-禁忌搜索算法

各类智能优化算法其主要区别在于算法的运行规则不同&#xff0c;比如常用的遗传算法&#xff0c;其规则就是变异&#xff0c;交叉和选择等&#xff0c;各种不同的变体大多是在框架内的实现细节不同&#xff0c;而本文中的禁忌算法也是如此&#xff0c;其算法框架如下进行介绍。…

【一刷《剑指Offer》】面试题 31:连续子数组的最大和

牛客对应题目链接&#xff1a;连续子数组最大和_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a;简单动归问题。 一、《剑指Offer》对应内容 二、分析题目 1、贪心 从前往后迭…

VRTK4教程 一:资源导入、Unity设置、连接头盔

文章目录 VRTK4的分包导入VRTK4的资源包unity设置连接头盔 VRTK4的分包 vrtk4的资源包和旧版不同&#xff0c;采用了分包导入的思想&#xff0c;我们要用什么功能&#xff0c;就导入什么包&#xff0c;可以有效减小程序体积 如下图&#xff0c;已经导入的vrtk包会显示在Packag…

C语言—深入理解指针(5)

1. sizeof 和 strlen 的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 sizeof&#xff0c;sizeof 是计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。 sizeof 只…

MicroBlaze 处理器参考指南

概述 本章包含MicroBlaze功能的概述和详细信息MicroBlaze架构包括Big-Endian或Little-Endian位反转格式&#xff0c;32位或64位通用寄存器&#xff0c;虚拟内存管理&#xff0c;缓存软件支持&#xff0c;和AXI4-Stream接口 简介 MicroBlaze嵌入式处理器软核是一个精简指令集…

调查问卷和考试系统SurveyKing

什么是 SurveyKing &#xff1f; SurveyKing 是功能更强大的调查问卷、考试系统&#xff0c;很多功能体验超过问卷网、问卷星。支持在线考试/调查问卷/公开查询/题库刷题/投票。 软件特性 &#x1f947; 支持 20 多种题型&#xff0c;如填空、选择、下拉、级联、矩阵、分页、签…

CANDela studio的DTC

可以在文件——属性里面选择支持的规范 想要添加DTC&#xff0c;首先要在Diagnostic Trouble Codes里面的Available DTCs Fault Memory里面进行添加&#xff0c;不过这只是添加在池子里面&#xff0c;并不能使用。 添加完了之后在fault memory里面copy进来&#xff0c; 这样就能…

VRRP

文章目录 VRRP基本原理技术背景VRRP作用VRRP概述VRRP名词解释VRRP路由器VRRP组虚拟路由器虚拟IP地址、MAC地址Master、Backup路由器 VRRP状态机Master/ Backup 路由器Master路由器:Backup路由器: VRRP的工作过程 VRRP基础配置![image.png](https://img-blog.csdnimg.cn/img_con…

【逻辑回归】Logistic Regression逻辑回归模型学习笔记

文章目录 序言1. 线性回归2. 逻辑回归2.1 引入逻辑回归的原因2.2 逻辑回归2.3 逻辑回归的应用 3. 逻辑函数3.1 sigmoid函数3.2 sigmoid函数的性质3.3 决策边界3.4 对数几率 4. 损失函数4.1 为什么说逻辑回归时概率类模型4.2 为什么要进行极大似然估计4.3 利用MLE如何推导出损失…

MySQL嵌套,别名,分组查询

有以下三张表&#xff1a;分别是课程表c&#xff0c;有课程号cno&#xff0c;课程名cname&#xff0c;课程类别cpro等 学生信息表s&#xff0c;学号sno&#xff0c;姓名sname&#xff0c;性别ssex&#xff0c;年龄sage&#xff0c;班级sclass&#xff0c;籍贯jg 成绩表sc&#…

C++STL---list知识汇总

前言 学习完list&#xff0c;我们会对STL中的迭代器有进一步的认识。list底层有很多经典的东西&#xff0c;尤其是他的迭代器。而list的结构是一个带头双向循环链表。 list没有reserve和resize&#xff0c;因为它底层不是连续的空间&#xff0c;它是用时随时申请&#xff0c;…

【QT】父子按钮同时响应点击事件

QPushButton如何响应点击事件 QPushButton::event(QEvent *e) 。可以看到在QPushButton中的event函数中并没有鼠标点击相关的操作&#xff0c;那么我们去QAbstractButton::event中寻找 damn it!。依然没有那我们去QWidget::event中寻找 damn it! 只有mousePressEvent mouseR…

c++学生管理系统

想要实现的功能 1&#xff0c;可以增加学生的信息&#xff0c;包括&#xff08;姓名&#xff0c;学号,c成绩&#xff0c;高数成绩&#xff0c;英语成绩&#xff09; 2&#xff0c;可以删除学生信息 3&#xff0c;修改学生信息 4&#xff0c;显示所有学生信息 5&#xff0c…

python中利用cartopy库绘制SST图像

1. Cartopy简介 Cartopy 是一个开源的 Python 库&#xff0c;用于绘制地图和地理数据分析。它结合了 matplotlib 的绘图功能和 shapely、pyproj 等库的地理空间数据处理能力&#xff0c;为用户提供了在地图上可视化数据的强大工具。 以下是 Cartopy 的一些主要特点和功能&#…

微信公众号开发(问题1):订阅号不能定时发私信/私信

微信公众号开发时&#xff0c;因为个人使用&#xff0c;申请的是订阅号&#xff0c;本来是想出了自动回复&#xff0c;再加一个定时消息的功能&#xff0c;尝试利用flask里的scheduler添加定时任务&#xff0c;但是执行之后不能收到消息&#xff0c;通过再次查看订阅号的功能&a…

stm32mp157为什么要把相同的tf-A trust烧录emmc的boot1和boot2?

在使用该处理器时&#xff0c;为什么要将相同的Trusted Firmware-A (TF-A)烧录到eMMC的Boot1和Boot2区域呢&#xff1f; 这么做的主要原因包括&#xff1a; 冗余性和可靠性&#xff1a; 将相同的TF-A烧录到两个不同的引导区域&#xff08;Boot1和Boot2&#xff09;可以增加系…

LeetCode 算法:找到字符串中所有字母异位词c++

原题链接&#x1f517;&#xff1a;找到字符串中所有字母异位词 难度&#xff1a;中等⭐️⭐️ 题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符…

Jenkins流水线pipeline--基于上一章的工作流程

1流水线部署 1.流水线文本名Jenkinsfile,将流水线放入gitlab远程仓库代码里面 2pipeline脚本 Jenkinsfile文件内容 pipeline {agent anyenvironment {key"value"}stages {stage("拉取git仓库代码") {steps {deleteDir()checkout scmGit(branches: [[nam…