# 5.1 運行循環
一旦有了一個已經注冊了某些事件的 event_base(關于如何創建和注冊事件請看下一節 ), 就需要讓 libevent 等待事件并且通知事件的發生。
```cpp
#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);
```
默認情況下,event_base_loop()函數運行 event_base 直到其中沒有已經注冊的事件為止。執行循環的時候 ,函數重復地檢查是否有任何已經注冊的事件被觸發 (比如說,讀事件 的文件描述符已經就緒,可以讀取了;或者超時事件的超時時間即將到達 )。如果有事件被觸發,函數標記被觸發的事件為 “激活的”,并且執行這些事件。
在 flags 參數中設置一個或者多個標志就可以改變 event_base_loop()的行為。如果設置了 EVLOOP_ONCE ,循環將等待某些事件成為激活的 ,執行激活的事件直到沒有更多的事件可以執行,然會返回。如果設置了 EVLOOP_NONBLOCK,循環不會等待事件被觸發: 循環將僅僅檢測是否有事件已經就緒,可以立即觸發,如果有,則執行事件的回調。
完成工作后,如果正常退出, event_base_loop()返回0;如果因為后端中的某些未處理 錯誤而退出,則返回 -1。
為幫助理解,這里給出 event_base_loop()的算法概要:
```cpp
while (any events are registered with the loop,
or EVLOOP_NO_EXIT_ON_EMPTY was set) {
if (EVLOOP_NONBLOCK was set, or any events are already active)
If any registered events have triggered, mark them active.
else
Wait until at least one event has triggered, and mark it active.
for (p = 0; p < n_priorities; ++p) {
if (any event with priority of p is active) {
Run all active events with priority of p.
break; /* Do not run any events of a less important priority */
}
}
if (EVLOOP_ONCE was set or EVLOOP_NONBLOCK was set)
break;
}
```
為方便起見,也可以調用
```cpp
int event_base_dispatch(struct event_base *base);
```
event_base_dispatch ()等同于沒有設置標志的 event_base_loop ( )。所以, event_base_dispatch ()將一直運行,直到沒有已經注冊的事件了,或者調用 了 event_base_loopbreak()或者 event_base_loopexit()為止。
這些函數定義在<event2/event.h>中,從 libevent 1.0版就存在了。
- 封面
- 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服務器