libevent 常用函数最全讲解

本文介绍了C语言中使用libevent库进行事件处理的基本概念,包括事件处理框架的创建与释放、事件循环的设置与终止、事件的创建、添加和删除等关键操作。
摘要由CSDN通过智能技术生成

目录

1、事件处理框架

2、设置事件循环

3、终止事件循环

4、事件的创建与释放

5、事件的添加和删除

1、事件处理框架

//头文件
#include <event2/event.h>
//创建一个事件处理框架
struct event_base * event_base_new(void)
//释放一个事件处理框架
//参数: event_base_free(struct event_base *base)
void event_base_free(struct event_base *base);
//查看底层支持的IO转换模型
const char** event_get_supported_methods(void)
//查看当前实际处理框架使用的IO转接模型
const char *event_base_get_method(const struct event_base *base);

2、设置事件循环

//头文件
#include <event2/event.h>
//启动事件处理框架中的事件循环
//参数: event_base_new() 的返回值
/*
    事件检测过程中的特点
        举例: 检测读事件
            -如果对方没有发送数据过来,会一直持续检测,等待事件被触发
            -检测到有读事件,默认情况下只会被处理一次,事件循环就停止了,只能接受一次数据
            -如果要持续的接收数据,需要额外设置
*/
//这个函数被调用,内部会进行事件检测,代码阻塞在这一行
int event_base_dispatch(struct event_base *base);

3、终止事件循环

//头文件
#include <event2/event.h>

//表示一个时间段,tv_sec+tv_usec
struct timeval{
    long tv_sec;
    long tv_usec; //微秒
};

//假设事件循环正在继续,并且在处理一个实际纪有效的事件,代用这个函数终止事件循环
//事件循环不会马上终止,在tv指定的时长之后,事件就被终止了
int event_base_loopexit(struct event_base *base,const struct timeval *tv);

参数:
    -base:事件处理框架
    -tv: 在指定的时间段之后,退出事件循环
//马上终止事件循环
int event_base_loopbreak(struct event_base *base);

4、事件的创建与释放

//头文件
#include <event2/event.h>
#define EV_TIMEOUT   0x01  //定时器超时
#define EV_READ      0x02  //读,检测读缓冲区是否有数据
#define EV_WRITE     0x04  //写,检测写缓冲区是否可写
#define EV_SIGNAL    0x08  //信号
#define EV_PERSIST   0x10  //设置事件被重复检测
#define EV_ET        0x20  //边沿模式

typedef void (*event_callback_fn)(evutil_socket_t fd, short what,void *arg);
参数:
    -fd: 文件描述符,是event_new()第二个参数
    -what: 记录了实际文件描述符触发的事件
    -arg: event_new()的最后一个参数

//创建一个需要检测的事件,struct event 就是创建出的事件
//evutil_socket_t == int
//event_new()函数的本质就是对一个文件描述符进行封装
struct event* event_new(struct evnet_base *base, evutil_socket_t fd, 
                        short what, event_callback_fn cb, void *arg);
参数:
    -base:事件处理框架
    -fd:  一个文件描述符,比如管道的文件描述符,套接字通信的文件描述符
    -what:要检测的事件,检测第二个参数fd的事件
        -EV_READ: 读事件
        -EV_WRITE:写事件
        -EV_SIGNAL:信号事件(linux)
        -EV_ET: 设置边沿模式
    -cb:函数指针对应一个回调函数,当检测的事件被触发,这个函数就被调用
    -arg: 作为实参传递给回调函数cb

void event_free(struct event *event);

5、事件的添加和删除

struct timeval{
    long tv_sec;  //秒
    long tv_usec; //微秒
};
//事件被创建之后,不能被事件处理框架直接检测,需要做添加处理
int event_add(struct event *ev, const struct timeval *tv)
参数:
    -ev: 通过 event_new() 创建得到的事件
    -tv: 超时时长,如果不用指定为NULL
        -检测了一个事件,并且在tv指定的时间段中没有被触发,这个事件对应的回调函数会被强制调用
        -如果指定为NULL,事件不触发,对应的回调函数就不被调用
//被检测的事件从事件处理框架上删除

int event_del(struct event *ev);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落雨碎江南 Lucinda

如果您喜欢这篇文章欢迎打赏支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值