接着前面的笔记一,简单的介绍了libevent的简介。本笔记将继续整理相关的libevent知识内容。
一、关于libevent
libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于运行在windows、linux、bsd、mac osx等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。
在多个开源项目使用libevent库,如大名鼎鼎的memcached等软件。
技术特点:
事件驱动:轻量级的开源高性能事件触发;
轻量级:专注于网络(相对于ACE等产品);
开放源码:采用开放源码,代码相当精炼、易读;
跨平台:支持Windows、Linux、BSD和Mac OS等平台的;
支持多种I/O多路复用技术:(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可 以选择使用不同的模型,通过事件函数提供服务;
支持I/O:定时器和信号等事件;
模式:采用Reactor模式;
二、libevent包含的主要库
libevent_core:所有核心的事件和缓冲功能,包含了所有的event_base、evbuffer、bufferevent和工具函数。
libevent_extra:定义了程序可能需要,也可能不需要的协议特定功能,包括HTTP、DNS和RPC。
libevent:因历史原因,它包含libevent_core和libevent_extra的内容。随着版本的演进未来版本的libevent可能会去掉这个库。
libevent_pthreads:添加基于pthread可移植线程库的线程和锁定实现。它独立于libevent_core,这样程序使用libevent时就不需要链接到pthread,除非是以多线程方式使用libevent。
三、libevent的功能。
Libevent提供了事件通知,IO缓存事件,定时器,超时,异步解析DNS,事件驱动的http server以及一个RPC框架。
事件通知:当文件描述符可读可写时将执行回调函数。
IO缓存:缓存事件提供了输入输出缓存,能自动的读入和写入,用户不必直接操作io。
定时器:libevent提供了定时器的机制,能够在一定的时间间隔之后调用回调函数。
信号:触发信号,执行回调。
异步的DNS解析:libevent提供了异步解析DNS服务器的DNS解析函数集。
事件驱动的http服务器:libevent提供了一个简单的,可集成到应用程序中的HTTP服务器。
RPC客户端服务器框架:libevent为创建RPC服务器和客户端创建了一个RPC框架,能自动的封装和解封数据结构。
四、Reactor反应器模式
libevent是一个典型的reactor模式的实现。普通的函数调用机制如下:程序调用某个函数,函数执行,程序等待,函数将结果返回给调用程序(如果含有函数返回值的话),也就是顺序执行的。
在Reactor模式的基本流程如下:应用程序需要提供相应的接口并且注册到reactor反应器上,如果相应的事件发生的话,那么reactor将自动调用相应的注册的接口函数(类似于回调函数)通知你,所以libevent是事件触发的网络库。
五、一个简单的程序例子
编写一个简单的程序的例子,如简单的经典Helloword
#include
#include
#include
#include
// 定时事件回调函数
void onTime(int sock, short event, void *arg)
{
printf("Hello,World!\n");
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 重新添加定时事件(定时事件触发后默认自动删除)
event_add((struct event*)arg, &tv);
}
int main()
{
// 初始化
event_init();
struct event ev_time;
// 设置定时事件
evtimer_set(&ev_time, onTime, &ev_time);
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 添加定时事件
event_add(&ev_time, &tv);
// 事件循环
event_dispatch();
return 0;
}
gcc Helloworld.c -o Helloworld -levent
编译成功。在命令行下,运行Helloworld就可以在终端看到定时输出"Hello,World!"信息了。