Libevent初识

Page content

libevent初识,简单应用

1. 简介

libevent是一个基于事件触发的网络库,使用者众多,其采用C语言编写,大佬们的最爱还是C啊。libevent有如下几个有点:

  • 事件驱动,高性能
  • 轻量级,专注于网络
  • 跨平台,支持Windows、Linux、*BSD和Mac os
  • 支持多种I/O多路复用技术,epoll/poll/select/kqueue等
  • 支持I/O,定时器和信号等事件
  • 支持注册事件优先级设定

2. macos安装

macos上安装libevent很简单,采用brew安装:

brew install libevent

源码下载地址:https://libevent.org/ 。目前稳定版本为2.1.8

3. 简单使用

设计一个定时器,每10s输出一行“hello world”。先上代码:

#include <stdio.h>
#include <iostream>

#include <event.h>

using namespace std;
struct timeval tv;

void onTime(int sock, short event, void *arg)
{
    cout << "Hello World!" << endl;

    event_add((struct event *)arg, &tv);
}

int main()
{
    // init
    event_init();
    struct event evTime;
    // set timer
    evtimer_set(&evTime, onTime, &evTime);
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    // add event
    event_add(&evTime, &tv);
    // event loop
    event_dispatch();
    return 0;
}

编译运行:

g++ test.cpp -o test -levent
./test 

可以看到每十秒打印了一次“Hello World”。下面就来分析整个代码过程和原理。

4. 示例浅析

  • 首先初始化一个libevent库,event_init()
  • 初始化事件,设置回调函数和关注的事件
struct event evTime;
// set timer
evtimer_set(&evTime, onTime, &evTime);

evtimer_set函数的原型如下:

void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);
#define evtimer_set(ev, cb, arg)	event_set((ev), -1, 0, (cb), (arg))

这里初始化一个定时器事件,ev为事件,cb是一个函数指针,即回调函数,arg是参数。

  • 添加事件
event_add(&evTime, &tv);

这里将evTime这个事件添加到事件循环中,相当于调用的Reactor的事件注册函数。

event_add的函数原型如下:

int event_add(struct event *ev, const struct timeval *timeout);

所以这里设置的是超时事件,该事件10s超时会触发,从而达到定时的目的。

  • 事件循环
event_dispatch();

调用该函数,进入到事件循环,等待就绪事件并执行事件处理

5. 小结

libevent的简单应用就如上所述了,有时间还是深入看看源码,吸收一下源码中的养分,并将它应用到日常工作中。