日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libevent的使用流程

發(fā)布時(shí)間:2023/12/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libevent的使用流程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 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)秀。

具體使用流程:

  • 首先需要?jiǎng)?chuàng)建一個(gè)事件的處理框架:也就是一些數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建,維護(hù)事件的。
  • 創(chuàng)建事件,也就是說要?jiǎng)?chuàng)建你所關(guān)注得事件。
  • 添加事件,把事件添加到事件處理框架。
  • 開始循環(huán)去監(jiān)聽事件,在網(wǎng)絡(luò)或者服務(wù)器等,都會(huì)通過這種循環(huán)操作處理要處理得事件。
  • 釋放資源,這一步就是釋放那些事件的資源。
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。