libevent 使用流程

libevent 使用流程

使用流程

  1. 建立一個事件處理框架
  2. 建立一個事件
  3. 事件添加處處理框架
  4. 開始事件循環
  5. 釋放資源

事件處理框架 - event_base

  1. 使用libevent函數以前須要分配一個或者多個event_base結構體. 每一個event_base結構體有一個事件集合,能夠檢測以肯定哪一個事件是激活的.
    • 至關於epoll紅黑樹的樹根
    • 底座
    • 抽象層,完成對event_base的封裝
    • 每一個event_base都有一種用於檢測那種事件已經就緒的"方法",或者說後端
  2. 具體操做
    • 建立event_base
      • struct event_base* event_base_new(void);
      • 失敗返回NULL
    • 釋放event_base
      • event_base_free(struct event_base* base);
    • 循環監聽base對應的事件, 等待條件知足
      • event_base_dispatch(struct event_base* base);
  3. 查看event_base封裝的後端(當前系統中支持那些函數)
    • const char **event_get_supported_methods();
    • 返回一個字符串數組中
    • const char * event_base_get_method(const struct event_base *base);
    • 返回當前使用的IO轉接
  4. event_base和fork
    • 子進程建立成功後,父進程能夠繼續使用event_base
    • 子進程中須要繼續使用event_base須要從新進行初始化
      • int event_reinit(struct event_base * base)

事件 - event

  1. 建立新事件
#define  EV_TIMEOUT         0x01    // 廢棄
#define  EV_READ            0x02
#define  EV_WRITE           0x04
#define  EV_SIGNAL          0x08
#define  EV_PERSIST         0x10    // 持續觸發
#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,     // 文件描述符-int
    shord what,
    event_callback_fn cb,   // 事件處理動做
    void *arg
);
  1. 釋放事件
    • void event_free(struct event *event);
  2. 設置未決事件(有資格可是沒有被處理的事件)後端

    • 構造事件以後,在將其添加到 event_base 以前其實是不能對其作任何操做的。使用event_add()將事件添加到event_base, 非未決事件 -> 未決事件.
    • 函數
      int event_add( struct event *ev, const struct timeval *tv );
    • tv:
      • NULL: 事件被觸發, 對應的回調被調用
      • tv = {0, 100}, 若是設置的時間,
        • 在改時間段內檢測的事件沒被觸發, 時間到達以後, 回調函數仍是會被調用
    • 函數調用成功返回0, 失敗返回-1
  3. 設置非未決(尚未資格被處理的事件)
    • int event_del(struct event *ev);
    • 對已經初始化的事件調用 event_del()將使其成爲非未決和非激活的。若是事件不是未決的或者激活的,調用將沒有效果。成功時函數返回 0,失敗時返回-1。

事件循環

  1. 開始循環
    • 一旦有了一個已經註冊了某些事件的 event_base, 就須要讓 libevent 等待事件而且通知事件的發生。
    #define EVLOOP_ONCE                        0x01
        事件只會被觸發一次
        事件沒有被觸發, 阻塞等
    #define EVLOOP_NONBLOCK                    0x02
        非阻塞 等方式去作事件檢測
        不關心事件是否被觸發了
    #define EVLOOP_NO_EXIT_ON_EMPTY  0x04
        沒有事件的時候, 也不退出輪詢檢測
    • int event_base_loop(struct event_base *base, int flags);
      • 正常退出返回0, 失敗返回-1
    • event_base_dispatch(struct event_base* base)
      • 等同於沒有設置標誌的 event_base_loop()
      • 將一直運行,直到沒有已經註冊的事件了,或者調用 了event_base_loopbreak()或者 event_base_loopexit()爲止。
  2. 中止循環
    • 返回值:成功0,失敗-1
    struct timeval{
        long tv_sec;
        long tv_usec;
    };
    • 若是 event_base 當前正在執行激活事件的回調 ,它將在執行完當前正在處理的事件後當即退出
    int event_base_loopexit(
        struct event_base *base,
        const struct timeval *tv
    );
    • 讓event_base 當即退出循環
    int event_base_loopbreak(struct event_base *base);
相關文章
相關標籤/搜索