(五)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 系统调用的常见设计模式。 阅读详情

相关推荐

以太网接口及POE设计

PoE标准 Power Over Ethernet 是有源以太网供电的简称 通过Cat-5电缆供电在IEEE 802.3af以太网供电标准中进行了定义。PoE标准以前限制在几瓦以内,但更新的PoE技术可实现更高的功率。例如,PoE+允许每端口功率高达25 W,而PoE++(四 对以太网供电系统)通过使用现有电缆的所有电线允许70 W到100 W的功率。与此PoE标准并行的是ADI公司定义的专有标准 LTPoE++™,该标准定义高达90W的受电设备(PD)功率规范(请参见表1)。 表1. ADI...

u010783226的专栏 1万+

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

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

一个菜鸟的博客 2901

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

libevent的结构体struct event

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

luosuss的博客 1240

不用标注数据!用SAM 3零成本搞定遥感图像分割:SegEarth-OV3保姆级上手教程

本文介绍了如何利用SAM 3和SegEarth-OV3实现零标注遥感图像分割,提供从环境配置到结果优化的完整教程。通过开放词汇语义分割技术,用户无需标注数据即可快速获得专业级分割结果,适用于光伏板统计、灾害评估等场景。

weixin_30415113的博客 585

【工控基础】UVW平台踩坑

1 每个轴按顺时针或逆时针走一个距离,就是旋转。 2 图中W动,U轴V轴不动,就是X方向的平移 3 图中U轴V轴同时动,X不动,就是Y方向的平移。

songhuangong123的博客 6950

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

ZY1-02D (ZY1E)多光谱数据预处理

资源一号02D卫星(5米光学卫星)于2019年9月12日成功发射,卫星搭载的两台相机,可有效获取115公里幅宽的9谱段多光谱数据以及60公里幅宽的166谱段高光谱数据,其中全色谱段分辨率可达2.5米、 多光谱为10米、高光谱优于30米,高光谱载荷可见近红外和短波红外光谱分辨率分别达到10纳米和20纳米。

热爱分享,热爱记录 4830

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

计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)

以上总结覆盖了当前主流和前沿技术,实际选择需结合具体场景(速度/精度/资源限制)评估。

尘世冰封的专栏 1589

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8853

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

实验2 存储器设计与实现【计算机组成原理】

实验2 存储器设计与实现【计算机组成原理】

小心星的博客 2398

Linux下struct input_event结构体详解

linux 下 struct input_event结构体详解

weixin_47752005的博客 7791

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

wkd_007的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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、付费专栏及课程。

余额充值