一、libevent库的安装

Libevent 使用源码安装的方式,源码下载地址:http://libevent.org/
下载下来后,将 Libevent 的压缩包拷贝到 Linux 系统中,然后按照以下步骤执行:

  1. 打开终端,并且进入到 Libevent 所在位置
  2. 利用 tar 命令解压 Libevent 压缩包
  3. 进入到解压开的目录中
  4. 切换到 root 模式下执行命令: ./configuer --prefix=/usr
  5. 使用 make 命令完成编译
  6. 使用 make install 命令完成安装
  7. 使用 ls -al /usr/lib | grep libevent 测试安装是否成功

二、libevent的简介及原理

1. 简介

Libevent 是开源社区的一款高性能的 I/O 框架库,作为一个I/O 框架库,Libevent 具有如下特点:

  1. 跨平台支持。 Libevent 支持 Linux、Unix 和 Windows。
  2. 统一事件源。Libevent 对 I/O 事件、信号和定时事件提供统一的处理。
  3. 线程安全。Libevent 使用 libevent_pthreads 库来提供线程安全支持。
  4. 基于 Reactor 模式的实现。

2. 原理

  • 将要检查的描述符、读写事件、和要处理此描述符的方法交给libevent库,如果检测到此描述符上有读写事件此库就调用处理方法将其处理掉。
  • 基于 Reactor 模式的I/O框架库由如下几个组件构成:
    1. 句柄:也就是文件描述符
    2. 事件多路分发器:对应的I/O函数,elect,poll,epoll等。
    3. 事件处理器:就是要传输到库中处理事件的方法。
    4. Reactor :这是核心,需要有事件循环、注册事件、删除事件等方法。
      在这里插入图片描述

三、具体使用

1. 示例

此示例所做的事情就是将文件描述符,索要检测的事件,事件处理的方法交给libevent,如果在此文件描述符上检测到了此事件发生,就调用这个方法处理此事件。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<signal.h>
#include<event.h>
#include<sys/time.h>

void sig_fun(int fd,short ev,void*arg)
{
     printf("sig=%d\n",fd);
}
void timeout_cb(int fd,short ev,void*arg)
{
     printf("time out\n");
}

int main()
{
    struct event_base *base=event_init();//定义一个libevent实例
    assert(base!=NULL);
    //struct event *sig_ev=evsignal_new(base,SIGINT,sig_fun,NULL);
struct event *sig_ev=event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,sig_fun ,NULL);
    event_add(sig_ev,NULL);
    struct timeval tv={3,0};
	struct event *time_ev = evtimer_new(base,timeout_cb,NULL);//定义事件
	event_add(time_ev,&tv);//添加事件
    event_base_dispatch(base);//事件循环

    event_free(sig_ev);
    event_free(time_ev);
    event_base_free(base);

2. 对libevent的图解

在这里插入图片描述
程序结束的两中情况:

  1. 当I/O函数检测不到事件的时候。
  2. 强制结束程序。
Logo

更多推荐