libevent库学习 event_base和event

libevent源码学习(13):事件主循环event_base_loop 目录 开启事件主循环 执行事件主循环 校对时间 阻塞/非阻塞 处理激活队列中的event 事件主循环的退出 event_base_loopexit event_base_loopbreak 开启事件主循环 在libevent中,事件主循环的作用就是执行一个循环,在循环中监听事件以及超时的事件并且将这些激活的事件进行处理。libevent提供了对用户开放了两... 阅读详情

简介

libevent 库的使用少不了event_base和event

创建一个event_base

 struct event_base* event_base_new(viod);

释放evnet_base

event_base_free(struct event_base* base);

创建事件

	 struct event *event_new(
		struct event_base* base,
		evutil_socket_t fd,
		short what,
		event_callback_fn cb,
		void *arg
		);

调用event_new()函数之后, 新事件处于已初始化和非未决状态

有关于未决态和非未决态的理解:

  1. 非未决: 没有资格被处理
  2. 未决: 有资格被处理但是还没有处理
条目解释
base:event_base_new()返回值。
fd:绑定到 event 上的 文件描述符
what:对应的事件(r、w、e)
cb:一旦事件满足监听条件,回调的函数。
arg:回调的函数的参数。
返回值:成功创建的 event

回调函数

// 事件的处理回调函数
	typedef void (*event_callback_fn)(evutil_socket_t, short, void *); 
//	short what
	#define  EV_TIMEOUT         0x01    // 已淘汰(忽略)
	#define  EV_READ            0x02
	#define  EV_WRITE           0x04
	#define  EV_SIGNAL          0x08    //libevent封装了信号相关的操作 SIGNAL
	#define  EV_PERSIST         0x10    // 持续触发
	#define  EV_ET              0x20    // 边沿模式


event 的释放

void event_free(struct event *event); 

event_add

创建事件之后,在将其添加到 event_base 之前实际上是不能对其做任何操作的。
使用event_add()将事件添加到event_base

int event_add(
				struct event *ev, 
				const struct timeval *tv
				); 
tv:参数Value
NULL:事件被触发, 对应的回调被调用
tv = {0, n}设置的时间,在改时间段内检测的事件没被触发, 时间到达之后, 回调函数还是会被调用

添加事件循环

int event_base_dispatch(struct event_base* base);

等同于没有设置标志的 event_base_loop ( ),将一直运行,直到没有已经注册的事件了,或者调用 了event_base_loopbreak()或者 event_base_loopexit()为止

// event_base_loop()
int event_base_loop(struct event_base *base, int flags);
//正常退出返回0, 失败返回-1

//flages
#define EVLOOP_ONCE                        0x01
		//事件只会被触发一次
		//事件没有被触发, 阻塞等
#define EVLOOP_NONBLOCK                    0x02
		//非阻塞 等方式去做事件检测
		//不关心事件是否被触发了
#define EVLOOP_NO_EXIT_ON_EMPTY  		   0x04
		//没有事件的时候, 也不退出轮询检测

退出事件循环

可以选择执行完当前事件后退出还是立即退出循环。
执行完当前事件后退出:

int event_base_loopexit(
				struct event_base *base,
				const struct timeval *tv
				);
struct timeval {
			  long tv_sec;                    
				long   tv_usec;            
			};	

立即退出循环

int event_base_loopbreak(struct event_base *base);

使用流程

创建event_base
	struct event_base* base=event_base_new();
创建event
	struct event ev=event_new(base,fd,EV_WRITE,write_cb,NULL);
添加event
	event_add(ev,NULL);
event_base添加事件循环
	event_base_dispatch(base);
释放event
	event_free(ev);
释放event_base
	event_base_free(base);

注:其中fd是需要监听的文件描述符,有写事件时触发写事件回调函数。

libevent的event处理框架剖析 前几次剖析了libevent的tail queue和evbuffer,今天来剖析一下它的事件处理框架。这个在剖析evbuffer之前已经大致走过几遍,但思路不是很清晰,是因为我没有用实例去测试event流程。通过这次我学习到了剖析源码不仅要去看源码,而且你要测试它这项接口是怎么用的,不然只会似懂非懂。 首先来看一下event结构体: struct event { TAILQ_ENTR 阅读详情

相关推荐

libevent源码学习(6):事件处理基础——event_base的创建

目录 前言 创建默认的event_base event_base的配置 event_config结构体 创建自定义event_base——event_base_new_with_config 禁用(避免使用)某一种IO复用模型 设置IO复用模型需要满足的特征 设置event_base的flag特性 获取event_base所满足的特征 获取当前系统所支持的IO复用模型 总结 ...

HerofH_的博客 1534

libevent使用(二) ----- event_base 和 event

如果设置event_base使用锁,则可以安全的在多线程这使用它。 然而,其事件循环则只能运行在一个线程中,如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。 建立默认的event_base struct event_base *event_base_new(void) //函数分配并返回一个新的具有默认设置的event_base。函数会检测环境变量

博客 1156

DCN交换机通过boot模式升级

LIC导入成功后,输入enable进入特权模式,把网线接到通讯网口上,配置好对应interface vlan地址,在enable模式用 copy tftp://x.x.x.x/xxxxxx_nos.img nos.img待提示write ok时,reload设备完成升级。交换机启动后,在显示以下信息时输入“Ctrl+B”,一定得是手动按“Ctrl+B”进入的boot模式才能正常升级。升级交换机成功,在BootROM模式下,执行命令run或reboot,回到CLI配置界面。# 交换机通过boot模式升级。

m0_72501865的博客 946

libevent 多线程调用event_base

/*********************************************************************************************************** ,编译程序 g++ -Wall -g event-server.c -o server -levent -lpthread **************************

晴天的专栏 3865

某头部能源集团“数据治理”到“数智应用”跃迁案例剖析

本次案例能源企业实现了从“数据可用”到“指标驱动”再到“智能决策”的全链条升级,标志着集团在数字化、智能化治理能力上的系统跃升,构建起面向未来的数智管理新范式。

a958014226的博客 1257

SAP ABAP开发避坑:BAPI_MATVAL_PRICE_CHANGE调用报‘估价未维护’的完整解决流程

本文深入解析SAP ABAP开发中调用BAPI_MATVAL_PRICE_CHANGE函数时遇到的'估价未维护'错误,提供从基础配置检查到CKML_PRICE_SEND表维护的完整解决方案。通过实战案例和代码示例,帮助开发者快速定位问题并实现批量价格更新的自动化处理,提升开发效率。

weixin_28705087的博客 426

Libevent 使用多线程

1 、evthread_use_pthreads(); int CTcpServer::Start() {     if(m_bStartFlag)     {         printf("repeat start");         return -2;     }     if (NULL == m_pEventBase)     {         evth

wumingzcj的专栏 951

用C#和MQTTnet在WinForm里做个简易物联网监控后台(附完整源码)

本文详细介绍了如何使用C#和MQTTnet库在WinForm中构建一个简易物联网监控后台。通过实战案例,包括环境配置、MQTT服务端实现、客户端监控功能及高级优化技巧,帮助开发者快速搭建高效的物联网监控系统,适用于工业自动化和智能家居场景。

weixin_29540599的博客 392

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

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

一个菜鸟的博客 2901

(第100天)Oracle GoldenGate 常见故障处理指南

OGG 运维的核心在于细致的配置管理和主动的问题排查。熟悉常见错误、掌握关键操作流程、并善用日志和调试工具,是保障数据同步任务稳定运行的关键。希望这份指南能帮助您更高效地解决 OGG 同步中遇到的问题。祝您运维顺利!

LuciferLiu_DBA 301

Django 6.0:有哪些新特性以及它们对实际项目的重要性

Django 6.0 感觉像是一个成熟的版本,它基于实际应用案例而打造。它减少了不必要的复杂性,同时扩展了框架的开箱即用功能。升级到 Django 6.0 不仅仅是为了保持版本更新,更是为了构建更易于维护、更安全、更能适应未来发展的应用程序。

iCloudEnd的博客 340

Libevent源码分析(四)--- libevent事件机制

之前几个章节都是分析libevent的辅助功能,这一节将要详细分析libevent处理事件的流程和机制,在分析之前先看一下libevent的使用方法,本文也将以libevent的使用方式入手来分析libevent的工作机制。void cb_func(evutil_socket_t fd, short what, void *arg) { const char *data = arg;

tbyzs的专栏 1897

一个代码循环计算水在石墨烯表面的接触角

石墨烯接触角

Rockyoung 2574

Libevent库的学习笔记(1)

event_base_new( ) 函数分配并且返回一个新的、默认配置的event_base,返回一个event_base 指针。如果发生错误,会返回NULL。new以后使用完了,要记得event_base_free(base)掉。还有一个是event_init(),但是这个一般不用,基本上都用event_base_new()。

weixin_58581250的博客 925

Unity插件NodeCanvas之行为树的详细教程

NodeCanvas 是一个用于 Unity 的可视化脚本工具,主要用于游戏开发中的行为树、状态机和流程图的设计。它通过节点编辑器的方式,让开发者可以更直观地创建和管理游戏逻辑,减少了传统编码的复杂性。今天我们就来详细介绍一下NodeCanvas插件。

TxNet 1955

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

07.libevent定时器使用

test.cpp #include<iostream> #include<event2/event.h> #include <event2/event.h> #include <event2/thread.h> #include<event2/listener.h> #ifndef _WIN32 #include <signal.h> #else #endif using namespace std; static timeval t

xiaoduan6的博客 282

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

libevent基础介绍,event_base详解

ubuntu中安装libevent步骤:1. 更新软件库:sudo apt-get update2. 安装libevent库:sudo apt-get install libevent-dev (这个命令会自动安装libevent的运行时库及其依赖项)安装完成后,你可以通过检查libevent库的版本来验证它是否成功安装。

cyz322649的博客 1057

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Libevent库的学习

Libevent 是开源社区的一款高性能的 I/O 框架库,使用 Libevent 的著名案例有:高性能 的分布式内存对象缓存软件 memcached,Google 浏览器 Chromium 的 Linux 版本。作为一个 I/O 框架库,Libevent 具有如下特点:◼ 跨平台支持。Libevent 支持 Linux、Unix 和 Windows。◼ 统一事件源。Libevent 对 I/O 事件、信号和定时事件提供统一的处理。◼ 线程安全。

oorik的博客 1877

[libevent]event,event_base结构体描述

libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄。 //在event2/event_struct.h中event的结构描述 struct event

超越 4634

libevent学习笔记 - 2 event_base

在使用libevent时需要分配一个或多个event_base,每个event_base持有多个event,还能够决定哪一个event处于活动状态。为了多线程访问安全,event_base可加锁,但是同一时刻只能有一个线程在运行loop。

未名湖917号的博客 1081

event_base

这个函数告诉event_config在生成多线程event_base的时候,应该试图使用给定数目的CPU。这个函数的工作与event_base_new()类似,它将分配的event_base设置成当前的。选择各种方法时,函数会选择OS支持的最快方法。本文描述的函数有一些用于操作当前event_base的变体,这些函数与新版本函数的行为类似,只是它们没有event_base参数。这个函数在new_event_base被调用,传入的参数是event_config,根据cfg的内容来配置event_base。

hesphoros的个人博客 1624

libevent学习——event_base

使用 libevent 函数之前需要分配一个或者多个event_base结构体。每个event_base结构 体持有一个事件集合,可以检测以确定哪个事件是激活的。如果设置event_base使用锁,则可以安全地在多个线程中访问它。然而,其事件循环只能 运行在一个线程中。如果需要用多个线程检测 IO,则需要为每个线程使用一个event_base。每个event_base都有一种用于检测哪种事件已经就绪的 “方法”,或者说后端。

czw 661

LibEvent中文帮助文档-第6章【创建Event_base】

LibEvent中文帮助文档:http://blog.youkuaiyun.com/zhouyongku LibEvent快速可移植非阻塞式网络编程

zhouyongku的专栏 3700

【Libevent】Libevent学习笔记(二):创建event_base

00. 目录 文章目录00. 目录01. 简介02. 创建默认的event_base03. 创建复杂的event_base3.1 event_config_new函数3.4 event_config_avoid_method函数3.5 event_config_require_features函数3.6 event_config_set_flag函数3.7 event_config_set_num...

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1952
上一篇: c++ 使用mysql++ 操作数据库进行增删改查
下一篇: c++实现一个高并发服务器(三)服务器
Sweler*19
博客等级 码龄7年 65粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值