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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libevent的使用流程

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的使用流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。