(五)struct event结构体

libevent源码深度剖析五 libevent源码深度剖析五——libevent的核心:事件event张亮对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管理。1 libevent的核心-event      Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reac 阅读详情

前言

之前说到过libevent是基于事件驱动模型的网络库,其中的事件,就是event,它的确算是libevent中最核心的部分,而上一节说到的event_base其实算是驱动部分,负责事件的各种处理。它们之间的关系是,一个event_base对应多个event。
下面主要讲解的是struct event结构体,位于event.h。

struct event

struct event {
    /* 尾队列节点指针 用于保存所有注册了的I/O以及signal事件 以及激活的事件(其实libevent中的尾队列本质上就是一个双向链表)*/
    TAILQ_ENTRY (event) ev_next;    //已注册I/O事件链表
    TAILQ_ENTRY (event) ev_active_next; //所有激活了的事件链表,通过遍历该链表进行调度
    TAILQ_ENTRY (event) ev_signal_next; //已注册signal事件链表

    unsigned int min_heap_idx;  /* for managing timeouts */

    struct event_base *ev_base; //该事件所属的反应堆实例

    int ev_fd;  //对于I/O事件,是绑定的文件描述符。对于signal事件,是绑定的信号
    short ev_events;    /* 事件的类型 */
    short ev_ncalls;    //事件就绪执行时,调用ev_callback的次数
    short *ev_pncalls;  /* Allows deletes in callback */

    struct timeval ev_timeout; //定时的时长

    int ev_pri; //优先级 smaller numbers are higher priority

    /* event的回调函数,被ev_base调用
     * int参数代表ev_fd
     * short参数代表事件的类型,即ev_events
     * void *arg对应ev_arg
     */

    void (*ev_callback)(int, short, void *arg);
    void *ev_arg;

    int ev_res; //当前激活事件的类型 /* result passed to event callback */
    int ev_flags; //表明当前event的状态
};

额外注意

有以下几点进行补充说明:
1. TAILQ_ENTRY()是一个宏,原型如下:

#define TAILQ_ENTRY(type)                       \
struct {                                \
     struct type *tqe_next; /* next element */          \
     struct type **tqe_prev;    /* address of previous next element */  \
 }

如你所见,它其实是一个尾队列结点。它的第一个成员tqe_next指向下一个元素,第二个成员tqe_prev是前一个元素的下个元素的地址。这样做的好处是,删除元素时不必遍历整个链表,同时也支持方向遍历。具体的操作等后面遇到了再讲。
2.
事件类型(short ev_events)有如下4种:

/* 定时事件 */
#define EV_TIMEOUT  0x01

/* I/O事件 */
#define EV_READ     0x02
#define EV_WRITE    0x04

/* 信号事件 */
#define EV_SIGNAL   0x08

/* 辅助选项:表明是永久(持续的)事件 */
#define EV_PERSIST  0x10    /* Persistant event */

这些事件可以进行|操作,即一个事件可以是多种类型的,不过signal类型不能和I/O类型同为同一事件。
3. event的状态(int ev_flags)有如下几种:

#define EVLIST_TIMEOUT 0x01 // event在time堆中
#define EVLIST_INSERTED 0x02 // event在已注册事件链表中
#define EVLIST_SIGNAL 0x04 // 未见其他源文件使用
#define EVLIST_ACTIVE 0x08 // event在激活链表中
#define EVLIST_INTERNAL 0x10 // 内部使用标记
#define EVLIST_INIT 0x80 // event 已被初始化

4. 通过查看该结构体的成员,我们不难发现,libevent将事件分为了I/O事件、信号事件、定时事件这几类,并且管理注册事件的时候分了不同的链表来管理,已经激活等待调度的事件也有一个专门的链表来管理。
5. 还有一个优先级的概念,前面我们在介绍event_base结构体时,有个成员是activequeues,它专门用来按优先级管理已经激活(就绪)的事件。于是,每当有event被激活时,libevent就会把它移入activequeues[event->ev_pri]中。
6. 接着便是回调函数,event负责保管回调函数指针,真正来调用的是事件主循环中的event_process_active函数。

小结

OK,我们当前看了libevent中最主要的两个结构体:struct event和struct event_base,了解到event将事件分类管理,里面存放了重要的回调函数指针并且知道了它和event_base的关系(多对一)。下面我们可以忽略信号和定时部分,看一看event_base和event之间是如何协调的,这对我们理解event和event_base很有好处。

关于Linux中TCP编程struct epoll_event结构体使用说明 void *ptr;int fd;结构体功能场景数据流向主要作用注册事件到 epoll 实例用户 → 内核指定关注的事件类型和关联文件描述符获取就绪事件内核 → 用户返回就绪的事件列表和对应文件描述符简单来说,同一个结构体类型在不同的函数调用中扮演了 “请求参数” 和 “返回结果” 的角色,这是 Linux 系统调用的常见设计模式。 阅读详情

相关推荐

P+F--r2000激光雷达slam技术实现

P+F--r2000激光雷达slam技术实现

majingming123的博客 1667

Libevent之struct event和struct event_base及其对应操作详细解释

分析一个开源库,首先应该关注其中重要的结构体,因为结构体往往是将一个事物抽象出来了。例如struct event结构体就是表示事件这一抽象个体。里面包含了事件应该有的所有操作。定义不同事件实质就是填充结构体里面对应的字段而已。结构体里面大量含有指针变量,那么可以说明这个指针变量一定指向堆中的某一段内存。存在着大量的动态分配内存操作。作者真的对内存了如指掌了,还是贯彻了一个道理,一切皆内存,全部都是...

一个菜鸟的博客 2901

Codex Skill:AI编程助手的专项能力扩展与实战指南

在AI编程助手领域,Skill(技能)是一种标准化的能力扩展机制,它通过封装特定任务所需的指令、资源和脚本,解决AI模型在专项任务上的能力局限。其核心原理是将专业知识和工作流程模块化,让通用AI助手能够像领域专家一样执行复杂任务。从技术价值看,Skill不仅提升了代码生成的准确性,更重要的是实现了业务流程的自动化集成,如代码规范检查、API文档生成等具体场景。这种机制特别适用于需要结合内部工具链和特定业务逻辑的企业环境,能够显著提升开发效率和质量。通过安装PPT生成、SpringBoot项目创建等专项Ski

weixin_33672109的博客 413

libevent的结构体struct event

1 创建根(地基)节点--event_base_new();2 设置监听事件和数据可读可写的事件的回调函数;设置了事件对应的回调函数后,当事件产生的时候会自动调用回调函数3 进入事件循环--event_base_dispatch();相当于while(1),在循环内部等待事件的发生,若有事件发生会触发事件对应的回调函数。4 释放地基--event_base_free();释放地基。

luosuss的博客 1240

从原理图到PCB:Cadence Allegro 17.4网表同步全流程详解(含第三方网表配置)

本文详细解析了Cadence Allegro 17.4中从Orcad原理图到PCB布局的网表同步全流程。核心内容包括标准的第一方网表同步步骤,以及针对第三方网表导入时关键的封装库路径配置方法,并提供了常见同步错误的排查思路,帮助工程师高效、准确地完成设计数据传递,确保PCB设计顺利开局。

salt9的博客 654

【VeriStand】从零构建HIL测试平台:核心概念、硬件选型与实战配置指南

本文详细介绍了如何从零构建HIL测试平台,涵盖核心概念、硬件选型与实战配置指南。重点解析了VeriStand生态系统的优势,包括开箱即用特性、与LabVIEW的黄金搭档配合及Python支持。通过实战案例和硬件选型建议,帮助工程师高效搭建可靠的HIL测试平台,提升测试效率与安全性。

weixin_29250573的博客 329

linux 玩安卓游戏手柄,Linux joystick 游戏手柄编程 (获取输入数据)

啥也不说了,先上代码:由于linux中的list.h不能直接用,所以单独提取了出来使用://listop.h/*itisfromlinuxlist*/#ifndefLISTOP_H#defineLISTOP_Hstructlist_head{structlist_head*next,*prev;};typedefstructlist_headlist_t;#defineLI...

weixin_30456719的博客 779

跟着Synopsys报告,一步步拆解车规芯片FMEDA计算(含公式与避坑点)

本文详细解析了车规芯片FMEDA计算的全流程,基于Synopsys报告拆解实战指南,涵盖基础失效率建模、安全机制效能评估及安全指标合成等关键步骤。通过公式解析、数据准备清单和避坑点分享,帮助工程师掌握ISO26262标准下的硬件量化分析技术,提升车载系统设计可靠性。

weixin_30460489的博客 195

linux异步io 回调函数,linux异步IO编程实例分析

#include #define TEST_FILE"aio_test_file"#define TEST_FILE_SIZE#define NUM_EVENTS#define ALIGN_SIZE(127 * 1024)128512#define RD_WR_SIZE1024struct custom_iocb{struct iocb iocb;int nth_request;};void ai...

weixin_34033915的博客 416

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1463

struct input_event

struct input_event结构体是linux输入子系统的向应用层传递的接口。操作/dev/input/event1文件,写入个input_event结构体就可以模拟按键的输入。 #inlcude <linux/input.h> struct input_event { struct timeval time;//按键时间 __u16 type;//...

holyjw的博客 3338

<PLC><工控>汇川Easy521PLC与压力传感器485通讯实例

有些PLC在进行串口通讯时,配置完串口参数后,还需要自己编程序来读写,但本例中汇川Easy521配置完成后,想要读取从站什么数据,只需要在“COM0 Modbus配置窗口”配置即可。可以同时配置多个从站。在配置窗口的右侧点击新增按钮,就会自动生成一条从站的配置,默认从站站号为“1”,触发方式是“循环”,功能码是03(读寄存器),从站寄存器地址为0,长度为“1”,映射地址需要自己添加。因为我们是将PLC设置为Modbus主站,所以压力传感器就是从站,我们的需求时PLC从这些从站传感器中读取数据,比如压力值。

用沸腾的热血,支付我们的人生吧! 6458

Linux下struct input_event结构体详解

linux 下 struct input_event结构体详解

weixin_47752005的博客 7791

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux系统struct input_event结构体分类型(鼠标、键盘、触屏)详解与例子

Linux系统是通过输入子系统来管理输入设备(如鼠标、键盘、触摸屏、游戏摇杆)的。配置了内核支持输入设备且有对应驱动的情况下,当系统接入输入设备,会在/dev目录或/dev/input下生成对应设备文件,下图是鼠标、键盘在不同情况下/dev/input的设备文件。每当输入设备有事件产生时,内核就会将事件上报到设备文件,事件数据以为单位存入设备文件,所以读取这些输入设备文件时使用结构体,这个结构体定义在input-event-codes.h。

wkd_007的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

libevent源码分析(2)--2.1.8--结构体 struct event和struct event_callback

struct event_callback { //下一个回调事件 TAILQ_ENTRY(event_callback) evcb_active_next; //回调事件的状态标识,具体为: // #define EVLIST_TIMEOUT 0x01 // event在time堆中,min_heap //

录事参军 2341

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

struct event

对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管理。 1 libevent的核心-event       Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相

yongqingjiao的博客 581

linux struct input_event结构体详解

struct input_event { struct timeval time; //按键时间 __u16 type; //类型,在下面有定义 __u16 code; //要模拟成什么按键 __s32 value;//是按下还是释放 }; type: EV_KEY,键盘 EV_REL,相对坐标 EV_ABS,绝对坐标 code: 事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备...

ZKR_HN的博客 1905

struct input_event结构体定义

查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体 方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。linux/input.h中有

技术宅 3441

struct epoll_event

转载自:http://hi.baidu.com/jj_wj/blog/item/4da7c7ca013a1e14be09e693.html 这两天在看项目的数据结构定义及关系,遇到一些关于socket的知识点,还有一些C++的知识点,下面总结下: 1. struct epol

坚持、专注 6049

libevent--学习使用struct event结构体进行工作-2

event_add(…) 在创建事件后,需要将事件(event)加入到event_base,使其成为未决事件,event_add()的函数源码摘抄如下: int event_add(struct event *ev, const struct timeval *tv) { int res; /* 1.检查参数是否为空 */ if (EVUTIL_FAILURE_CHECK(!ev-...

hzq_blog 323

struct epoll_event结构体

epoll查字典没有实际意思,是一种功能的名称。epoll实际上代表一种I/O事件操作,在Linux内核中实现I/O多路复用。

m0_49862048的博客 221

Linux 调试之 TRACE_EVENT(二)

Linux 调试之 TRACE_EVENT的简单使用

小立仔 4995
上一篇: (三)libevent源文件结构
下一篇: (六)初始化并设置event
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值