(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);
posted @ 2023-11-09 00:02  osbreak  阅读(13)  评论(0编辑  收藏  举报