1.libev簡介
Libev是一個event loop:向libev註冊感興趣的events,比如Socket可讀事件,libev會對所註冊的事件的源進行管理,並在事件發生時觸發相應的程序。
2.原理
通過event watcher來註冊事件,watcher是一個結果體。
libev通過分配和註冊watcher對不同類型的事件進行監聽。不同事件類型的watcher又對應不同的數據類型,watcher的定義模式是struct ev_TYPE或者ev_TYPE,其中TYPE爲具體的類型。當前libev定義瞭如下類型的watcher:
ev_io
ev_timer
ev_periodic
ev_signal
ev_child
ev_stat
ev_idle
ev_prepare and ev_check
ev_embed
ev_fork
ev_cleanup
ev_async
3.實例分析
下面是一個libev使用的例子,通過註冊io類型的watcher來監視STDIN可讀事件的發生:
//回調函數
static void my_cb (struct ev_loop*loop, ev_io *w, int revents)
{
ev_io_stop (w);
ev_break (loop, EVBREAK_ALL);
}
//設置預製的全局驅動器
struct ev_loop *loop = ev_default_loop(0);
//初始化和設置觸發條件
ev_io stdin_watcher;,
ev_init (&stdin_watcher, my_cb);
ev_io_set (&stdin_watcher,STDIN_FILENO, EV_READ);
ev_io_start (loop, &stdin_watcher);
//開始循環
ev_run (loop, 0);
上面的示例代碼中用到的與watcher相關的函數有ev_init,ev_io_set,ev_io_start,ev_io_stop。ev_init對一個watcher的與具體類型無關的部分進行初始化。ev_io_set對watcher的與io類型相關的部分進行初始化,顯然如果是TYPE類型那麼相應的函數就是ev_TYPE_set。可以採用ev_TYPE_init函數來替代ev_init和ev_TYPE_set。ev_io_start激活相應的watcher,watcher只有被激活的時候才能接收事件。ev_io_stop停止已經激活的watcher。
event loop的概念。示例程序中的ev_run、ev_break以及ev_loop_default都是event loop控制函數。event loop定義爲struct ev_loop。有兩種類型的event loop,分別是default類型和dynamically created類型,區別是前者支持子進程事件。ev_default_loop和ev_loop_new函數分別用於創建default類型或者dynamically created類型的event loop。
event_run函數告訴系統應用程序開始對事件進行處理,有事件發生時就調用watchercallbacks。除非調用了ev_break或者不再有active的watcher,否則會一直重複這個過程。