首页 > 其他分享 >Libevent的入门级使用

Libevent的入门级使用

时间:2023-12-04 16:22:42浏览次数:29  
标签:struct epoll Libevent 入门级 base 事件 使用 event 函数

一、Libevent的地基event_base

在使用libevent的函数之前,需要先申请一个或event_base结构,相当于盖房子时的地基,在event_base基础上会有一个事件集合,可以检测哪个事件是激活的(就绪),通常情况下可以通过event_base_new函数获得event_base结构,函数如下:

struct event_base *event_base_new(void);

申请到event_base结构体指针可以通过event_base_free进行释放,函数如下:

void event_base_free(struct event_base *);

如果fork出了子进程,想在子进程这继续使用event_base,那么子进程需要对event_base重新初始化,函数如下:

int event_reinit(struct event_base *base);

 对于不同系统而言,event_base就是调用不同的多路IO接口去判断事件是否已经激活,对于linux系统而言,核心调用的就是epoll,同时支持poll和select。

二、等待事件产生(循环等待event_loop)

Libevent在地基打好之后,需要等待事件的产生,也就是等待想要等待的事件的激活,那么程序不能退出,对于epoll来说,我们需要自己控制循环,而在libevent中也给我们提供了api接口。函数如下:

int event_base_loop(struct event_base *, int flags);

flags的取值:

  • #define EVLOOP_ONCE  0x01:只触发一次,如果事件没有被触发,阻塞等待。
  • #define EVLOOP_NONBLOCK:非阻塞方式检测事件是否被 触发,不管事件是否被触发,都会立即返回。

而大多数我们都调用libevent给我们提供的另一个api,函数如下:

int event_base_dispatch(struct event_base *);

调用该函数,相当于没有设置标志位的event_base_loop,程序将会一直运行,直到没有需要检测的事件了,或者被结束循环的api终止了。  

int event_base_loopexit(struct event_base *, const struct timeval *);
int event_base_loopbreak(struct event_base *);

 两个函数的区别是如果正在执行激活事件的回调函数,那么event_base_loopexit将在事件回调执行结束后终止循环(如果tv时间非NULL,那么将等待tv设置的时间后立即结束循环),而event_base_loopbreak会立即终止循环。

三、事件驱动event

事件驱动实际上是libevent的核心思想,主要的状态转化如下:

主要的几个状态:

  • 无效的指针:此时仅仅是定义了struct event *ptr;
  • 非未决:相当于创建了事件,但是事件还没有处于被监听状态,类似于我们使用epoll的时候定义了struct epoll_event ev并且对ev的两个字段进行了赋值,但是此时尚未调用epoll_ctl。
  • 未决:就是对事件开始监听,暂时未有事件产生,相当于调用epoll_ctl。
  • 激活:代表监听的事件已经产生,这时需要处理,相当于epoll所说的事件就绪

Libevent的事件驱动对应的结构体为struct event,对应的函数在图上也比较清晰。

1.event_new函数

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

event_new负责新创建event结构体指针,同时指定对应的地基base,还用对应的文件描述符、事件、以及回调函数和回调函数的参数。参数说明:

  • base:对应的根节点
  • fd:要监听的文件描述符
  • events:要监听的事件
    1. #define EV_TIMEOUT     0x01  //超时事件
    2. #define EV_READ                0x02  //读事件
    3. #define EV_WRITE              0x04  //写事件
    4. #define EV_SIGNAL                  0x80  //信号事件
    5. #define EV_PERSIST          0x10  //周期性触发
    6. #define EV_ET                     0x20  //边缘触发,如果底层模型支持

cb回调函数,原型如下:

typedef void (*event_callback_fn)(evutil_socket_t, short, void *);

arg回调函数的参数

2.event_add函数

int event_add(struct event *ev, const struct timeval *timeout);

将非未决态事件转为未决态,相当于调用epoll_ctl函数,开始监听事件是否产生。

参数说明:

  • ev:就是前面event_new创建的事件
  • timeout:限时等待事件的产生,也可以设置未NULL,没有限时。

3.event_del函数

int event_del(struct event *);

 将事件从未决状态变为非未决状态,相当于epoll的下树(epoll_ctl调用EPOLL_CTL_DEL操作)操作。

4.event_free()函数

void event_free(struct event *);

释放event_ne申请的event节点    

标签:struct,epoll,Libevent,入门级,base,事件,使用,event,函数
From: https://www.cnblogs.com/TechNomad/p/17875260.html

相关文章

  • 为什么stack和queue默认使用deque作为底层容器?
    在C++中,stack和queue默认使用deque作为底层容器的原因主要有以下几点:操作效率:deque(双端队列)支持在头尾两端进行插入和删除操作,且时间复杂度都为O(1),非常高效1。而vector在增长到一定长度时为了保证完全连续,需要重新申请更长的内存,并把原来的元素全部拷贝过去2。这使得vector......
  • 手写类似于BetterScroll样式的左右联动菜单 uni-app+vue3+ts (使用了script setup语法
     注意:在模拟器用鼠标滚动是不会切换光标的,因为使用的是触摸滑动。【自定义类型贴在最后了】script部分如下:import{onMounted}from'vue'importtype{orderDetail}from'@/types/category'importtype{mainArr}from'@/types/main-arr'import{nextTick,ref}......
  • 如何使用Python提升网站的SEO效果
     Python是一种功能强大的编程语言,可以应用于各种领域,包括优化网站的搜索引擎优化(SEO)效果。本文将探讨如何使用Python来改善网站的SEO效果,并提供一些实用的技巧和工具。 1.网站地图生成器:网站地图是搜索引擎索引网页的重要工具之一。使用Python可以编写脚本来自动生成网站地图,以......
  • 在 Sublime Text 4 for macOS 中使用多个光标
    在SublimeText4formacOS中使用多个光标在SublimeText4formacOS中使用多个光标(也称为多点编辑)是一项非常强大的功能,允许您在多个地方同时进行编辑。以下是一些常用的方法来使用多个光标:1.添加额外的光标按住Command键并点击:您可以在需要添加新光标的每个位置按......
  • 【ABAQUS2023-Output Vars】使用记录
    计算结构的应变能,ALLSE=所有单元的ESEDEN*EVOL。但这不适用于模态分析,因为模态分析EVOL不能用ALLSEField:noHistory:yes.fil:automatic.dat:automaticRecoverablestrainenergy.Insteady-statedynamicandfrequencyextractionanalyses,thisisthecyclicm......
  • vue3使用::v-deep深度选择器不生效
    会出现 ::v-deepusageasacombinatorhasbeendeprecated.Use:deep(<inner-selector>)insteadof::v-deep<inner-selector>.的报错::v-depth用作组合子已被弃用。使用:deep(<内部选择器>)而不是::v-deep<内部选择器>。需要改成:deep(class),示例代码如下:deep(.el-checkbo......
  • ogg logdump基本使用
    GoldenGateLogdump基本使用 Logdump是GoldenGate复制软件中附带的一个工具软件,在OGG的目录下可以找到。这个工具主要用于分析OGG生成的队列文件,查找记录、统计队列文件中的数据等。在OGG安装目录下执行logdump.exeor./logdump即可进入命令行。开始查找记录之前,先要做一些......
  • Libevent的安装与使用(一)
    一、了解libeventLibevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动(event-driven),高性能;轻量级专注于网络,不如ACE那么臃肿庞大;源代码相当精炼、易读;跨平台,支持Windows、Linux、*BSD和MacOs;支持多种I/O多路复用技术,epoll、......
  • 解决云电脑无法使用本地终端连接的USB设备
    本文分享自天翼云开发者社区《解决云电脑无法使用本地终端连接的USB设备》,作者:2****m云计算技术的广泛应用已经改变了我们对计算资源的使用方式。云电脑作为云计算的一个重要应用场景,提供了一种将计算资源从本地转移到云端的解决方案。通过云电脑,用户可以在任何地方使用云服务提......
  • 在线CAD(网页编辑DWG)中使用mxcad库绘制矩形
    前言在mxcad中绘制矩形,本质上还是绘制多段线,那如何用mxcad中的多段线去绘制一个支持倒角和圆角的矩形呢,在autocad中绘制一个矩形会通过一些命令或者输入关键字来确定是否需要倒角圆角或者通过面积,宽高去绘制。下面我们将模仿autocad的绘制矩形的交互绘制,完整的实现一个动态交......