libevent入門和使用

boshuzhang發表於2016-02-23

libevent是什麼?

   libevnet是一個事件驅動框架,提供一種處理機制,當fd有事件發生或超時時執行回撥函式;同時libevent支援posix訊號和普通超時回撥。libevent的目標就是要取代事件驅動server的事件迴圈。應用僅僅需要呼叫event_dispatch(),接著就可以在不改變事件迴圈的情況下增加刪除事件。libevent提供統一的event api來封裝底層事件機制,比如select,poll,epoll,kqueue等。libevent可以使用在多執行緒環境中,一種方法是一個執行緒只能訪問event_base,另一種方式是多個執行緒加鎖訪問一個event_base。libevent事件框架也是典型的Reactor模式,event封裝了fd和fd事件處理函式,event_base處理多個event,對應Reactor。libevnet還是一個緩衝網路io的高階框架,支援sockets, filters, rate-limiting, SSL, zero-copy file transmission, and IOCP。libevent還支援幾個有用的協議,包括dns,http,rpc框架。


之後的程式碼分析以libevent-1.4.14b-stable版本為準,底層多路複用機制分析epoll。

libevent原始碼分析,只專注於I/O讀寫事件和超時事件,對signal不做分析。

libevnet的事件框架和reids的事件框架類似。


libevent使用例子

1)首先初始化libevent庫,並儲存返回的指標

struct event_base * base = event_init();

實際上這一步相當於初始化一個Reactor例項;在初始化libevent後,就可以註冊事件了。

 

2)初始化事件event,設定回撥函式和關注的事件

event_set(&ev, -1, 0, timer_cb, NULL);

event_set的函式原型是:void event_set(struct event *ev, int fd, short event, void (*cb)(int, short, void *), void *arg)

  ev:執行要初始化的event物件;

  fd:該event繫結的“控制程式碼”,對於訊號事件,它就是關注的訊號;

  event:在該fd上關注的事件型別,它可以是EV_READ, EV_WRITE, EV_SIGNAL;

  cb:這是一個函式指標,當fd上的事件event發生時,呼叫該函式執行處理,它有三個引數,呼叫時由event_base負責傳入,按順序,實際   上就是event_set時的fd, event和arg;

  arg:傳遞給cb函式指標的引數;

這一步相當於設定fd,對fd要關注的事件,事件的處理函式;

 

3)設定event從屬的event_base

event_base_set(base, &ev);

這一步相當於指明event要註冊到哪個event_base例項上;

 

4)新增事件,底層呼叫epoll_ctl

event_add(&ev, timeout);    //   timeout是定時值;

 

5)程式進入無限迴圈,等待就緒事件並執行事件處理,底層呼叫epoll_wait

event_base_dispatch(base);

 

參考:

 官方網站:http://libevent.org/

書籍programming with libevent:http://www.wangafu.net/~nickm/libevent-book/

相關文章