• libevent学习---简介(转)


    一、libevent是什么
    libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。
    它被众多的开源项目使用,例如大名鼎鼎的memcached等。
    特点:
    事件驱动,高性能;
    轻量级,专注于网络(相对于ACE);
    开放源码,代码相当精炼、易读;
    跨平台,支持Windows、Linux、BSD和Mac OS;
    支持多种I/O多路复用技术(epoll、poll、dev/poll、select和kqueue等),在不同的操作系统下,做了多路复用模型的抽象,可以选择使用不同的模型,通过事件函数提供服务;
    支持I/O,定时器和信号等事件;
    采用Reactor模式;

    二、下载
    libevent1.4代码量比较少,结构比较简单,也适合入门学习,1.4很早以前看过了,大家想学习也可以学习1.4。
    这里学习的是libevent2.0以上版本。代码量也比1.4高很多,也加了很多功能。

    libevent下载:http://libevent.org/

    我下载的是 libevent-2.0.22-stable.tar.gz

    下载之后解压,然后进入目录就可以安装了。

    [mjf@localhost libevent-2.0.22-stable]$ ./configure --prefix=/home/mjf/lib  (prefix是我配置目录,默认可以不加)
    [mjf@localhost libevent-2.0.22-stable]$ make
    [mjf@localhost libevent-2.0.22-stable]$ sudo make install

    注:./configure --prefix=/home/mjf/lib 因为如果我不加prefix,后面执行示例程序的时候会如下错误:error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory, 所以我自己定制了路径,就没问题了,当然你的可能没问题,那就不用加,install之后直接在/usr/lib或者/usr/local/lib里面就 能看到了libevent*.so了。

    [mjf@localhost libevent-2.0.22-stable]$ whereis libevent-2.0.so.5

    [mjf@localhost ~]$ ls -al /usr/lib | grep libevent 
    lrwxrwxrwx.  1 root root      21 Jun 13 22:15 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9
    -rwxr-xr-x.  1 root root  971951 Jun 13 22:15 libevent-2.0.so.5.1.9
    -rw-r--r--.  1 root root 1575744 Jun 13 22:15 libevent.a
    lrwxrwxrwx.  1 root root      26 Jun 13 22:15 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9
    -rwxr-xr-x.  1 root root  588276 Jun 13 22:15 libevent_core-2.0.so.5.1.9
    -rw-r--r--.  1 root root  982040 Jun 13 22:15 libevent_core.a
    -rwxr-xr-x.  1 root root     970 Jun 13 22:15 libevent_core.la
    lrwxrwxrwx.  1 root root      26 Jun 13 22:15 libevent_core.so -> libevent_core-2.0.so.5.1.9
    lrwxrwxrwx.  1 root root      27 Jun 13 22:15 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9
    -rwxr-xr-x.  1 root root  405038 Jun 13 22:15 libevent_extra-2.0.so.5.1.9
    -rw-r--r--.  1 root root  593776 Jun 13 22:15 libevent_extra.a
    -rwxr-xr-x.  1 root root     977 Jun 13 22:15 libevent_extra.la
    lrwxrwxrwx.  1 root root      27 Jun 13 22:15 libevent_extra.so -> libevent_extra-2.0.so.5.1.9
    -rwxr-xr-x.  1 root root     935 Jun 13 22:15 libevent.la
    lrwxrwxrwx.  1 root root      30 Jun 13 22:15 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9
    -rwxr-xr-x.  1 root root   18446 Jun 13 22:15 libevent_pthreads-2.0.so.5.1.9
    -rw-r--r--.  1 root root   18686 Jun 13 22:15 libevent_pthreads.a
    -rwxr-xr-x.  1 root root     998 Jun 13 22:15 libevent_pthreads.la
    lrwxrwxrwx.  1 root root      30 Jun 13 22:15 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9
    lrwxrwxrwx.  1 root root      21 Jun 13 22:15 libevent.so -> libevent-2.0.so.5.1.9


    我们可以看到有以下一些库。
    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是事件触发的网络库。

    四、编译运行一个小例子
    [cpp] view plain copy
    
        #include <stdlib.h>  
        #include <stdio.h>  
        #include <sys/time.h>  
        #include <event.h>  
        // 定时事件回调函数   
        void onTime(int sock, short event, void *arg)   
        {   
            printf("Hello,World!
    ");  
          
            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 example1.c -o example1 -levent

    大功告成,就可以在终端看到每隔两秒输出"Hello,World!"了。
  • 相关阅读:
    Spring学习(一)初识Spring
    搜索引擎学习(七)解析查询
    搜索引擎学习(六)Query的子类查询
    Oracle学习(十四)分表分区
    Oracle学习(十三)优化专题
    Python学习————流程控制之while循环
    Python学习————深浅copy
    Python学习————while循环作业
    Python学习————运算符
    Python学习————与用户交互
  • 原文地址:https://www.cnblogs.com/tianzhiyi/p/5345336.html
Copyright © 2020-2023  润新知