# 4.1 創建event_base
###4.1.1 創建默認的event_base
***event_base_new()***函數分配并且返回一個新的具有默認設置的 event_base。函數會檢測環境變量,返回一個到 event_base 的指針。如果發生錯誤,則返回 NULL。選擇各種方法時,函數會選擇 OS 支持的最快方法。
```cpp
struct event_base *event_base_new(void);
```
>大多數程序使用這個函數就夠了。
event_base_new()函數聲明在<event2/event.h>中,首次出現在 libevent 1.4.3版。
###4.1.2 創建復雜的event_base
要對取得什么類型的 event_base 有更多的控制,就需要使用 **event_config**。
event_config 是一個容納 event_base 配置信息的不透明結構體。需要 event_base 時,將 event_config 傳遞給**event_base_new_with_config ()。**
###創建接口
```cpp
struct event_config *event_config_new(void);
struct event_base *
event_base_new_with_config(const struct event_config *cfg);
void event_config_free(struct event_config *cfg);
```
要使用這些函數分配 event_base,先調用 event_config_new()分配一個 event_config。 然后,對 event_config 調用其它函數,設置所需要的 event_base 特征。最后,調用 event_base_new_with_config()獲取新的 event_base。完成工作后,使用 event_config_free ()釋放 event_config。
```cpp
int event_config_avoid_method(struct event_config *cfg, const char *method);
enum event_method_feature {
EV_FEATURE_ET = 0x01,
EV_FEATURE_O1 = 0x02,
EV_FEATURE_FDS = 0x04,
};
int event_config_require_features(struct event_config *cfg,
enum event_method_feature feature);
enum event_base_config_flag {
EVENT_BASE_FLAG_NOLOCK = 0x01,
EVENT_BASE_FLAG_IGNORE_ENV = 0x02,
EVENT_BASE_FLAG_STARTUP_IOCP = 0x04,
EVENT_BASE_FLAG_NO_CACHE_TIME = 0x08,
EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST = 0x10,
EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
};
int event_config_set_flag(struct event_config *cfg,
enum event_base_config_flag flag);
```
調用 event_config_avoid_method ()可以通過名字讓 libevent 避免使用特定的可用后端 。 調用 event_config_require_feature ()讓 libevent 不使用不能提供所有指定特征的后端。 調用 event_config_set_flag()讓 libevent 在創建 event_base 時設置一個或者多個將在下面介紹的運行時標志。
**event_config_require_features()可識別的特征值有:**
* EV_FEATURE_ET:要求支持邊沿觸發的后端
* EV_FEATURE_O1:要求添加、刪除單個事件,或者確定哪個事件激活的操作是 O(1)復雜度的后端
* EV_FEATURE_FDS:要求支持任意文件描述符,而不僅僅是套接字的后端
**event_config_set_flag()可識別的選項值有:**
* EVENT_BASE_FLAG_NOLOCK :不要為 event_base 分配鎖。設置這個選項可以 為 event_base 節省一點用于鎖定和解鎖的時間,但是讓在多個線程中訪問 event_base 成為不安全的。
* EVENT_BASE_FLAG_IGNORE_ENV :選擇使用的后端時,不要檢測 EVENT_* 環境 變量。使用這個標志需要三思:這會讓用戶更難調試你的程序與 libevent 的交互。
* EVENT_BASE_FLAG_STARTUP_IOCP:僅用于 Windows,讓 libevent 在啟動時就 啟用任何必需的 IOCP 分發邏輯,而不是按需啟用。
* EVENT_BASE_FLAG_NO_CACHE_TIME :不是在事件循環每次準備執行超時回調時 檢測當前時間,而是在每次超時回調后進行檢測。注意:這會消耗更多的 CPU時間。
*
* EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST :告訴 libevent ,如果決定使 用 epoll 后端,可以安全地使用更快的基于 changelist 的后端。epoll-changelist 后端可以 在后端的分發函數調用之間,同樣的 fd 多次修改其狀態的情況下,避免不必要的系統 調用。但是如果傳遞任何使用 dup()或者其變體克隆的 fd 給 libevent,epoll-changelist 后端會觸發一個內核 bug,導致不正確的結果。在不使用 epoll 后端的情況下,這個標 志是沒有效果的。也可以通過設置
* EVENT_EPOLL_USE_CHANGELIST 環境變量來 打開 epoll-changelist 選項。
上述操作 event_config 的函數都在成功時返回0,失敗時返回-1。
>設置 event_config,請求 OS 不能提供的后端是很容易的 。比如說,對于 libevent 2.0.1-alpha, 在 Windows 中是沒有 O(1)后端的;在 Linux 中也沒有同時提供 EV_FEATURE_FDS 和 EV_FEATURE_O1 特征的后端。如果創建了 libevent 不能滿足的配置, event_base_new_with_config ()會返回 NULL。
- 封面
- 1 Libevent官方
- 2 epoll
- 2.1 流-IO操作-阻塞
- 2.2 解決阻塞死等待的辦法
- 2.3 什么是epoll
- 2.4 epollAPI
- 2.5 觸發模式
- 2.6 簡單的epoll服務器
- 3 epoll和reactor
- 3.1 reactor反應堆模式
- 3.2 epoll的反應堆模式實現
- 4 event_base
- 4.1 創建event_base
- 4.2 檢查event_base后端
- 4.3 釋放event_base
- 4.4 event_base優先級
- 4.5 event_base和fork
- 5 事件循環event_loop
- 5.1 運行循環
- 5.2 停止循環
- 5.3 轉儲event_base的狀態
- 6 事件event
- 6.1 創建事件
- 6.2 事件的未決和非未決
- 6.3 事件的優先級
- 6.4 檢查事件狀態
- 6.5 一次觸發事件
- 6.6 手動激活事件
- 6.7 事件狀態之間的轉換
- 7 數據緩沖Bufferevent
- 7.1 回調和水位
- 7.2 延遲回調
- 7.3 bufferevent 選項標志
- 7.4 使用bufferevent
- 7.5 通用bufferevent操作
- 7.5.1 釋放bufferevent操作
- 7.5.2 操作回調、水位和啟用/禁用
- 7.5.3 操作bufferevent中的數據
- 7.5.4 bufferevent的清空操作
- 8 數據封裝evBuffer
- 8.1 創建和釋放evbuffer
- 8.2 evbuffer與線程安全
- 8.3 檢查evbuffer
- 8.4 向evbuffer添加數據
- 8.5 evbuffer數據移動
- 8.6 添加數據到evbuffer前
- 8 鏈接監聽器evconnlistener
- 8.1 創建和釋放 evconnlistener
- 8.2 啟用和禁用 evconnlistener
- 8.3 調整 evconnlistener 的回調函數
- 8.4 檢測 evconnlistener
- 8.5 偵測錯誤
- 9 libevent常用設置
- 9.1 日志消息回調設置
- 9.2 致命錯誤回調設置
- 9.3 內存管理回調設置
- 9.4 鎖和線程的設置
- 9.5 調試事件的使用
- 10 基于libevent服務器
- 10.1 Hello_World服務器(基于信號)
- 10.2 基于事件服務器
- 10.3 回顯服務器
- 10.3 libevent實現http服務器