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