1.安装libevent
mac下下载源码安装,执行到make时报错,fatal error because of ‘openssl/bio.h’ file not found
openssl实际已经安装,并且版本是最新。
解决方法是:
./configure LDFLAGS=’-L/usr/local/opt/openssl/lib’ CPPFLAGS=’-I/usr/local/opt/openssl/include’
安装成功,安装的libevent在/usr/local/lib/目录下。
2.简单例子使用
在libevent-2.1.8-stable/sample/目录下有很多例子。
libevent支持3种事件:读写事件、signal事件、定时事件。
这里以定时事件为例子,定时器打印hello world。编译时链接libevent库,gcc timer.c -o timer -levent
#include <stdio.h>
#include <event.h>
void func(int sockfd, short event, void *arg) {
printf("hello world\n");
/* 事件执行完默认删除,所以重新添加 */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
/* int event_add(struct event *ev, const struct timeval *tv) */
event_add((struct event*)arg, &tv);
}
int main() {
event_init();
struct event ev_time;
evtimer_set(&ev_time, func, &ev_time);
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add(&ev_time, &tv);
event_dispatch();
return 0;
}
解释:
/* Global state; deprecated */
/* 这么写宏定义有什么好处? */
struct event_base *event_global_current_base_ = NULL;
#define current_base event_global_current_base_
/* 创建event_base对象,event_base代表什么? */
struct event_base *event_init(void)
{
struct event_base *base = event_base_new_with_config(NULL);
if (base == NULL) {
event_errx(1, "%s: Unable to construct event_base", __func__);
return NULL;
}
/* 指针 */
current_base = base;
return (base);
}
个人理解:event_base代表一个事件集合,并轮训该集合中是否有事件准备好。
慢慢理解:event_base是libevent的事务处理框架,负责事件注册、删除等,属于Reactor模式中的Reactor。
为了方便对超时的处理:libevent定义了一些接口函数,在event.h头文件中
/**
@name evtimer_* macros
Aliases for working with one-shot timer events */
/**@{*/
#define evtimer_assign(ev, b, cb, arg) \
event_assign((ev), (b), -1, 0, (cb), (arg))
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
#define evtimer_add(ev, tv) event_add((ev), (tv))
#define evtimer_del(ev) event_del(ev)
#define evtimer_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv))
#define evtimer_initialized(ev) event_initialized(ev)
/**@}*/
evtimer_set在event_compat.h头文件中,也是宏定义。
Reference:
[1] https://www.cnblogs.com/zxiner/p/6919036.html
[2] https://blog.csdn.net/u010710458/article/details/79437572