(2)libevent事件循环
libevent 的基本操作单元是事件。每个事件代表一组条件的集合,这些条件包括:
- 文件描述符已经就绪,可以读取或者写入
- 文件描述符变为就绪状态,可以读取或者写入(仅对于边沿触发 IO)
- 超时事件
- 发生某信号
- 用户触发事件
一、循环事件
1、默认循环事件
int event_base_dispatch(struct event_base *base)
2、消息循环事件
int event_base_loop(struct event_base *base, int flags);
#define EVLOOP_ONCE Ox01 等待一个事件运行,直到没有事件活动就退出(至少执行一次事件)。
#define EVLOOP_NONBLOCK Ox02 非阻塞循环事件,有活动事件就处理立马返回。
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04 没有注册事件也不返回,用于事件后期多线程添加。
3.停止循环
// 运行完所有激活事件的回调之后,等待超时后才退出。
int event_base_loopexit(struct event_base *base, const struct timeval *tv)
void run_base_with_ticks(struct event_base *base)
{
struct timeval ten_sec;
ten_sec.tv_sec = 10;
ten_sec.tv_usec = 0;
while (1)
{
event_base_loopexit(base, &ten_sec);
event_base_dispatch(base);
}
}
// 执行完当前正在处理的事件后立即追出,如无操作则立即退出
int event_base_loopbreak(struct event_base *base);
void cb(int sock, short what, void *arg)
{
struct event_base *base = arg;
event_base_loopbreak(base);
}
void main_loop(struct event_base *base, evutil_socket_t watchdog_fd)
{
struct event *watchdog_event;
watchdog_event = event_new(base, watchdog_fd, EV_READ, cb, base);
event_add(watchdog_event, NULL);
event_base_dispatch(base);
}
4.查看退出方式,返回true来确定是否调用了 loopexit 或者 break函数
int event_base_got_exit(struct event_base *base);
int event_base_got_break(struct event_base *base);
5.转储event_base的状态,为帮助调试程序(或者调试 libevent),有时候可能需要加入到 event_base 的事件及其状态 的完整列表。调用 event_base_dump_events()可以将这个列表输出到指定的文件中。
void event_base_dump_events(struct event_base *base, FILE *f);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步