libevent的使用流程
文章目錄
- libevent的使用流程
- 具體使用流程:
- 1、事件處理的框架:event_base
- 2、3、創建事件和添加事件
- 4、事件循環
- 5、釋放資源
- 總結
libevent的使用流程
libevent是一個高性能事件通知庫,它的優點主要有這些:
- 事件驅動的:也就是說當某一個被關注的事件發生時會啟動事件的回調函數。比如epoll就是事件驅動的。
- 高性能輕量級:libevent雖然很小,代碼十分簡潔清量,但是它優秀的數據結構和框架的設計,性能很高,專注于網絡,不像ACE那么臃腫。
- 源代碼易讀、簡練:看過源代碼就知道,真的一點不拖泥帶水,非常優秀。
具體使用流程:
1、事件處理的框架:event_base
這個就相當于整個事件框架的根,什么意思呢,很多的事件肯定是用一種數據結構維護的,比如鏈表,這個就相當于表頭,方便后續管理事件。當然libevent維護的是雙向鏈表,堆等。
想要處理框架上的事件都是通過這個event_base的對象管理的。
常用操作:
struct event_base* event_base_new(void);創建一個event_base,看libevent的代碼一定要帶著面向對象的思想,誰說C不能面向對象。
event_base_free(struct event_base* base);釋放掉event_base對象。
int event_base_dispatch(struct event_base* base);,這個函數就是循環監聽base對應的整個事件框架,當有事件發生就回調,內部調用int event_base_loop(struct event_base *base, int flags),一會再說他,這里已經屬于第四步了。
2、3、創建事件和添加事件
說到這里就很簡單了,其實沒必要先去關注事件復雜的結構體,結構體中也只不過是對事件各種信息的封裝,先懂了流程原理,至于結構,那只是實現方式。我們這兩步要做的就是往已有的事件處理框架上再繼續增加事件,需要關注什么事件就添加什么事件。主要一個創建事件和添加事件的方法:
#define EV_TIMEOUT 0x01 // 廢棄 #define EV_READ 0x02 #define EV_WRITE 0x04 #define EV_SIGNAL 0x08 #define EV_PERSIST 0x10 // 水平觸發,不處理一直觸發,類似于epoll #define EV_ET 0x20 // 邊沿觸發,這個是跳變才觸發typedef void(*event_callback_fn)(evutil_sockt_t,short,void *);struct event *event_new(struct event_base *base,evutil_socket_t fd, // 文件描述符-intshord what,event_callback_fn cb, // 事件處理動作void *arg );不要被結構這個嚇到,看不懂可以先不看,主要這個結構體就是為了創建一個事件對象的,可以看一下事件的回調函數就是在這時候指定的,也就是說一個事件你要指定回調函數,因為,事件處理框架在檢測到事件發生就會回調這個函數,在C語言中就只能用函數指針實現,回調函數就是事件驅動實現的基本所在,沒有回調函數,就談不上事件驅動了。
好了用這個結構體創建一個事件對象以后,就可以往事件處理框架上添加事件了:
int event_add( struct event *ev, const struct timeval *tv );
這樣就可以了,這個時間就是說,如果事件沒觸發,有這么個超時時間啊,到時間我這個事件的回調函數也會被調用,剩下的什么未決不未決的就不說了,我這里主要介紹工作流程,這些細節,還得慢慢研究才行。弄懂了流程,那些細節可能就一下子通透了。
4、事件循環
事件循環就是去循環管理檢測這些事件,當有事件發生的時候,調用事件的回調函數。
int event_base_loop(struct event_base *base, int flags);剛剛在上面已經說過這個函數了,它需要的就一個base,也就是事件管理框架,然后一個flags,這個flags是幾個宏可以自己去查看一下,控制是否阻塞的。
停止循環:int event_base_loopbreak(struct event_base *base);調用這個函數停止循環
5、釋放資源
就是去釋放上面申請的內存資源
總結
這個流程還是比較清晰的,網絡中基于事件驅動的利用的思想就是回調函數,在主線程中循環檢測事件,當有事件發生就調用事件的回調函數,至于在回調函數中再去啟動多任務,那又是另外的操作了。
總結
以上是生活随笔為你收集整理的libevent的使用流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apollo学习笔记(12)Lattic
- 下一篇: windows NTFS文件系统手动数据