libevent学习笔记二:libevent基础知识

libevent学习笔记二:libevent基础知识

     接着前面的笔记一,简单的介绍了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!"信息了。

 

你可能感兴趣的:(LIbevent)