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