libevent

2016-02-12 linux network

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