# 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服务器