Libevent学习笔记二——事件管理

libevent源码分析(9)--2.1.8--事件注册和删除 一、事件注册-event_add 1、将事件添加到等待事件中去,需要注意的是,event_add在event_new或者event_assign之后执行,即添加的事件必须是经过基本初始化过后的事件; 2、此处添加的事件包括IO事件、信号事件、定时事件,根据事件申请时设置的事件类型决定添加的流程; 3、超时控制包括两种方式:      (1)最小堆:时间超时时间存储在最小堆,每次执行超时 阅读详情

概述

在libevent中,事件分为3类:IO、signal和超时事件,其中IO和signal事件采用链表来管理,超时事件采用小根堆来管理;

具体实现

在此以IO事件(signal事件与其一样只需将文件描述符换为信号号即可)为例讲解libevent事件管理:
libevent中结构体struct event_base base的成员变量struct event_io_map io用于管理IO事件。

#define event_io_map event_signal_map
struct event_signal_map {
	/* An array of evmap_io * or of evmap_signal *; empty entries are
	 * set to NULL. */
	void **entries;
	/* The number of entries available in entries */
	int nentries;
};

该结构体成员变量void **entries我们可以理解为指针数组,而数组下标为文件描述符(或信号号)。
对于IO事件而言该数组成员变量为指向下述结构体变量的指针。

struct evmap_io {
	struct event_dlist events; // 指向链表头节点
	ev_uint16_t nread;
	ev_uint16_t nwrite;
	ev_uint16_t nclose;
};

上述结构体变量可以理解为与该文件描述符(或信号号)相关联的event的链表的入口。
libevent使用宏GET_IO_SLOT_AND_CTOR(x,map,slot,type,ctor,fdinfo_len)来获取指定文件描述符(或信号号)对应的event链表入口即上述数组成员并初始化与该文件描述符(信号号)相关联的数组成员。
使用宏LIST_INSERT_HEAD(head, elm, field)将event插入到通过宏GET_IO_SLOT_AND_CTOR获取到的链表的头部。
为了便于理解请参见下图:
在这里插入图片描述
以上描述的是libevent将IO事件加入到libevent库中,对应的libevent接口为:

// 添加IO事件
int evmap_io_add_(struct event_base *base, evutil_socket_t fd, struct event *ev)
// 添加signal事件
int evmap_signal_add_(struct event_base *base, int sig, struct event *ev)

而后libevent调用接口event_base_dispatch(base)进入死循环,在其中调用dispatch用于获取活跃事件,调用接口event_process_active处理活跃事件对应的回调函数。
其中关于活跃事件描述见这篇博文libevent之活跃事件管理。

libevent学习笔记五——socketpair socket既可以用于网络通信也可以用于进程间通信,libevent为了将信号事件集成到其自身的事件管理系统中采用了socketpair的机制,socketpair简言之就是在本地创建了一对用于通信的socket,libevent采用如下接口创建socketpair。 int evutil_socketpair(int family, int type, int protocol, evutil_... 阅读详情

相关推荐

libevent实战的那些坑

libevent,libev,libuv都是c实现的异步事件库,注册异步事件,检测异步事件,根据事件的触发先后顺序,调用相对应回调函数处理事件。网络 io 事件、定时事件以及信号事件。这三个事件驱动着服务器的运行。网络io事件:mac:kqueue定时事件:红黑树最小堆:二叉树、四叉树跳表时间轮信号事件libevent 和 libev 主要封装了异步事件库与操作系统的交互简单的事件管理接口,让用户无需关注平台检测处理事件的机制的差异,只需关注事件的具体处理。

qq_29750559的博客 936

通读 libevent 的设计思路与实现细节

libevent 流程图 libevent 沉思录 1 libevent的设计思路 设计思路做到统一 统一事件类型:信号事件,定时事件,IO时间 统一系统调用:epoll/ select/ poll/ win 等作为底层 去实现不同的eventop(事件多路分发器)的接口 struct eventop { int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo); int (*di

饭真好吃的博客 1291

【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 2480

Libevent 学习四:事件状态和事件处理

Libevent 学习四:事件状态和事件处理

myw31415926的专栏 3636

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 426

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

Libevent学习日记(二)

Libevent学习日志(二)Ubuntu下载Libeventevent_base创建默认的event_base创建复杂的event_base后端设置与特征选择检查event_base后端接口一接口二事件优先级event_base和fork事件循环event_loop算法概要停止循环转存event_base的状态事件event生成新事件事件标志事件的未决和非未决事件优先级检查事件状态一次触发事件手动激活事件事件状态间转换 Ubuntu下载Libevent 使用wget获得压缩包,也可以去libevent官

weixin_45146520的博客 1104

若依集成mybatisplus、兼容旧分页【亲测有效】

service类继承ServiceImpl类 实现 你的Service接口。hutool工具包和lombok工具包如果不需要的话可以自行删除并修改后面的类里面的代码。自带的pagehelper用的1.4.6里面的jsqlparser用的4.5.0。mybatis-plus用的3.4.2里面的jsqlparser用的4.0.0。jsqlparser包,不剔除是这样的,有个冲突,我用的前端写的请求,返回的格式和原来的一样,已兼容。你的Entity类上面需要增加表的名字。

lh155136的博客 3566

libevent的事件机制

1. 事件初始化 从上一篇文章《libevent是怎么选择底层实现的》可以看出来,调用event_base_new()函数就是初始化好底层实现,给event_base结构体中evsel赋值,evsel是一个eventop结构体,我们再来看下: struct eventop { /** The name of this backend. */ const char *name; /** Function to set up an event_base to use this backend. It sh

cpp加油站的专栏 323

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2187

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672

libevent学习笔记五:libevent源代码文件组织结构

libevent学习笔记五:libevent源代码文件组织结构 1 ,前言 详细分析源代码之前,如果能对其代码文件的基本结构有个大概的认识和分类,对于代码的分析将是大有裨益的。本节内容不多,我想并不是说它不重要! 2 ,源代码组织结构 Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent框架、...

jyl_sh的专栏 1112

Vue2+OpenLayers动态绘制两个经纬度并计算距离(提供Gitee源码)

动态绘制两个经纬度并计算它们之间的距离。

黄团团的个人博客 366

Libevent 事件管理和添加事件

/** 我们先来看一下事件的创建*/struct event * event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg) { struct event *ev; ev = mm...

weixin_30614109的博客 244

cesium 综合教程200+【目录】(已包含186篇文章)

cesium示例教程100+旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。目录中有链接的为已有文章,没链接的为目标文章,不断更新中…

大剑师兰特的GIS世界 8897

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

libevent学习笔记三——活跃事件管理

激活列表基本结构 libevent激活列表使用双向链表数据结构实现,其按优先级存放活跃事件,具体结构如下图: libevent在结构体struct event_base中维护了优先级双向队列头struct evcallback_list *activequeues数组,其下标越小表示优先级越高。各数组成员指向了双向链表的头和尾如下图所示: 激活列表基本操作 该宏用于声明一个表示双向列表头的结构...

NMG_CJS的博客 535

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

libevent学习笔记四:Libevent整体处理流程

libevent学习笔记四:Libevent整体处理流程 前面介绍了 1 、基本流程 基本应用场景也是使用libevnet的基本流程,下面来考虑一个最简单的场景,使用livevent设置定时器,应用程序只需要执行下面几个简单的步骤即可。 1)首先初始化libevent库,并保存返回的指针 1 struct event_base * base = event_init(); 实...

jyl_sh的专栏 1377

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

libevent学习笔记

libevent学习笔记 学习资料:链接:百度网盘 提取码:jqsp 包括libevent源码剖析,参考手册 另外推荐一个网站:学习网站 libevent工作结构 libevent是高性能i/o网路库,基于reactor事件驱动模型。 下面这张图直观地展示了libevent的工作模式。 这是Reactor模式的几个必备组件,事件源(Handle),Reactor框架,事件多路分发器(Event Demultiplexer),事件处理器(Event Handle),具体的事件处理器(Concrete Eve

Q755100802的博客 594

libevent使用教程

本文转载于此 1、简介 基本的socket变成是阻塞/同步的,每个操作除非已经完成,出错,或者超时才会返回,这样对于每一个请求,要使用一个线程或者单独的进程去处理,系统资源没有办法支撑大量的请求。posix定义了可以使用异步的select系统调用,但是因为它采用了轮询的方式来判断某个fd是否变成active,效率不高。于是各系统就分别提出了基于异步的系统调用,例如Linux的epoll,由于在内核层面做了支持,所以可以用O(1)的效率查找到active的fd。基本上,libevent就是对这些高效IO的封装

qq_35475714的博客 5458

libevent学习笔记七:libevent事件处理框架剖析

libevent学习笔记七:libevent事件处理框架剖析 前面几节已经对libevent的事件处理框架和event结构体做了描述和介绍,现在是需要进一步的深入剖析的时候了,更深入的对libevent事件的详细处理流程进行解析和理解,本节具体的将分析libevent的事件处理框架event_base和libevent注册、删除事件的流程,可结合前一节libevent对event的管理的流程进行...

jyl_sh的专栏 1266

libevent--事件管理、缓存管理

libevent是一个轻量级的开源高性能网络库,主要由事件管理、缓存管理、缓存事件,DNS,http这几部分构成:事件管理: 主要涉及2个结构体event:一个单独的事件,可以通过event_new创建一个新的事件,或者是event_assign重置一个时间event_base:保存所有事件的消息与状态,并且进行事件轮询 可以通过event_base_new创建一个base event_bas

Ada_baby的专栏 1617

libevent

(1)event_base   每一个线程都有且仅有一个event_base,暂且称之为“事件管理器”吧(我自己随便起的名字),对应着一个struct event_base结构体,负责管理schedule托管给它的一系列事件(即下面要介绍的event)。当一个事件发生时,它负责在适当的时间(不一定是立即)去调用相关的回调函数。当回调函数执行完之后,再返回schedule其他事件。 (2)eve...

wenxinfly的专栏 322

libevent的event管理相关接口

本文介绍了libevent的event管理相关接口

一个致力于开源代码学习、分析和交流的博客 1891

Libevent之定时器事件管理

事件如何管理先来对应的demo #include <event.h> struct event ev; struct timeval tv; void time_cb(int fd, short event, void *argc) { printf("timer wakeup\n"); event_add(&ev, &tv); // reschedu...

一个菜鸟的博客 1100

偷懒的网络框架libevent、libev框架介绍

本文对libevent的api进行深入的讲解,并剖析libevent的evbuffer源码。

清风 3467
上一篇: libevent学习笔记一——初始化
下一篇: libevent学习笔记七——集成信号事件到事件主循环
NMG_CJS
博客等级 码龄11年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值