libev學習一

原文鏈接:https://blog.csdn.net/cxy450019566/article/details/52416349

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,否則會一直重複這個過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章