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)