libevent學習---簡介(轉)

1、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模式;

2、下載
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。 

3、libevent的功能。
Libevent提供了事件通知,io緩存事件,定時器,超時,異步解析dns,事件驅動的http server以及一個rpc框架。

事件通知:當文件描述符可讀可寫時將執行回調函數。

Io緩存:緩存事件提供了輸入輸出緩存,能自動的讀入和寫入,用戶沒必要直接操做io。

定時器:libevent提供了定時器的機制,可以在必定的時間間隔以後調用回調函數。

信號:觸發信號,執行回調。

異步的dns解析:libevent提供了異步解析dns服務器的dns解析函數集。

事件驅動的http服務器:libevent提供了一個簡單的,可集成到應用程序中的HTTP服務器。

RPC客戶端服務器框架:libevent爲建立RPC服務器和客戶端建立了一個RPC框架,能自動的封裝和解封數據結構。

4、Reactor(反應器)模式
libevent是一個典型的reactor模式的實現。這裏作一下簡單介紹:
咱們知道,普通的函數調用機制以下:程序調用某個函數,函數執行,程序等待,函數將結果返回給調用程序(若是含有函數返回值的話),也就是順序執行的。
而Reactor模式的基本流程以下:應用程序須要提供相應的接口而且註冊到reactor反應器上,若是相應的事件發生的話,那麼reactor將自動調用相應的註冊的接口函數(相似於回調函數)通知你,因此libevent是事件觸發的網絡庫。

4、編譯運行一個小例子
[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!\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 example1.c -o example1 -levent

大功告成,就能夠在終端看到每隔兩秒輸出"Hello,World!"了。
相關文章
相關標籤/搜索