libevent 是一个轻量级的开源的高性能的事件库,适用于 windows、linux、bsd 等多种平台,根据不同的平台,会选择使用 select、epoll、kqueue 等系统调用管理事件机制。
下面简单介绍下。
简介
很多程序在使用 libevent 库,包括了 memcached、tmux、tor 等,主要有如下的特点:
- 事件驱动,高性能,轻量级;
- 开源,代码相当精炼、易读;
- 跨平台,支持 Windows、Linux、BSD 和 Mac OS;
- 支持多种 IO 多路复用技术,如 epoll、poll、select、kqueue 等,不同平台会选择不同函数;
- 支持 IO、定时器和信号等事件;
- 采用 Reactor 模式。
接下来,看看如何安装。
安装
在 CentOS 中,可以直接通过 yum 安装。
----- 直接通过yum安装
# yum install libevent
----- 查看安装的库
$ rpm -ql libevent
/usr/lib64/libevent-2.0.so.5
/usr/lib64/libevent-2.0.so.5.1.9
/usr/lib64/libevent_core-2.0.so.5
/usr/lib64/libevent_core-2.0.so.5.1.9
/usr/lib64/libevent_extra-2.0.so.5
/usr/lib64/libevent_extra-2.0.so.5.1.9
/usr/lib64/libevent_openssl-2.0.so.5
/usr/lib64/libevent_openssl-2.0.so.5.1.9
/usr/lib64/libevent_pthreads-2.0.so.5
/usr/lib64/libevent_pthreads-2.0.so.5.1.9
可以看到,libevent 会安装如下的库:
- libevent_core
所有核心的事件和缓冲功能,包含了 event_base、evbuffer、bufferevent 以及工具函数; - libevent_extra
包括了程序可能需要的协议特定功能,包括 HTTP、DNS 和 RPC; - libevent
因为历史原因而存在,包含 libevent_core 和 libevent_extra 的内容,以后可能会去掉; - libevent_pthreads
添加基于 pthread 可移植线程库的线程和锁定实现,独立于 core,这样使用 libevent 时就不需要链接到 pthread,除非是以多线程方式使用 libevent。
示例程序
如下是一个简单的程序,每隔 1 秒输出 "Hello World!"
。
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <event.h>
void on_time(int sock, short event, void *arg)
{
struct timeval tv;
printf("Hello World!\n");
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add((struct event*)arg, &tv); // 重新添加定时事件,默认会自动删除
}
int main(void)
{
struct event ev_time;
struct timeval tv;
event_init(); // 初始化
evtimer_set(&ev_time, on_time, &ev_time); // 设置定时事件
tv.tv_sec = 1;
tv.tv_usec = 0;
event_add(&ev_time, &tv); // 添加定时事件
event_dispatch(); // 事件循环
return 0;
}
然后通过如下方式编译。
$ gcc -levent example.c -o example
然后执行即可。
参考
可以参考官方网站 libevent – an event notification library,以及 github libevent。