当前位置: 代码迷 >> 综合 >> C++ Libevent 基础
  详细解决方案

C++ Libevent 基础

热度:41   发布时间:2024-01-29 07:38:55.0

Libevent的入门基础

Libevent 是 C语言编写的、轻量级事件通知库

根节点 基地 event_base

使用Libevent之前,需要先申请一个 event_base 结构,创建根节点

struct event_base *event_base_new(viod);

申请到event_base结构体,用完后,通过 event_base_free 释放

void event_base_free(struct event_base *)

如果你fork出一个子进程,在子进程中也想用event_base,

int event_reinit(struct event_base *base)

创建事件循环, event_loop

Libevent在基地打好之后,需要等待事件的产生,

int event_base_loop(struct event_base *base,int flags);
#define EVLOOP_ONCE 0x01     // 只触发一次,如果事件没有被触发,阻塞等待
#define EVLOOP_NONBLOCK 0x02 //非阻塞方式,非阻塞方式

而大多数情况下,我们都调用 libevent 给我们提供的另外一个api

int event_base dispatch(struct event_base *base);

调用该函数,相当于没有flag标志位的 event_base_loop, 程序将会一直运行,直到没有检测事件了,我们手动退出。

int event_base_loopexit(struct event_base *base,const struct timeval *tv); // 延迟退出事件
int event_base_loopbreak(struct event_base *base); //马上退出struct timeval {long tv_sec;long tv_usec;
}

事件驱动 event

event_new 就是要创建一个上树节点

struct event *event_new(struct event_base *base,evutil_socket_fd,short events,event_callback_fn cb,void *arg)
  • struct event_base *base 对应的根节点
  • evutil_socket_fd 要监听的文件描述符
  • short events 要监听的事件
  • event_callback_fn cb 回调函数
  • void *arg 回调函数的参数

具体解释

short events 要监听的事件

#define EV_TIMEOUT 0x01  // 超时事件
EV_READ    // 读事件
EV_WRITE   // 写事件
EV_SIGNAL  // 信号事件
EV_PERSIST // 周期性触发 一般的都要 位或|这个,不然只会监听一次
EV_ET      // 边缘触发,如果底层模型支持

event_callback_fn cb 回调函数 原型如下

typedef void (*event_callback_fn)(evutil_socket_t fd,short events,void *args)

上树 下树 释放

上树 :将 非未决态 变为 未决态

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

下树:与上树相反

int event_del(struct event *ev);

释放:如果节点不再使用,需要释放

void event_free(struct event *ev)
  相关解决方案