Loading

【Linux系统编程】libevent库事件驱动

libevent库事件驱动

libevent库使用

  1. 创建并初始化event_base结构体。
  2. 创建并初始化event结构体,并设置文件描述符、监听事件、回调函数、回调函数参数。
  3. event添加到event_base中。
  4. 开始事件处理循环,监听事件是否发生,并在满足条件时自动调用回调函数。
  5. 事件处理完成后,释放event结构体的内存空间。
  6. 全部事件处理完成后,释放event_base结构体的内存空间。

相关函数

event_new()

函数说明
初始化event结构体。

函数原型

#include <event.h>
#include <event2/event.h>
struct event* event_new(struct event_base *base,
			evutil_socket_t fd,
			short events,
			event_callback_fn callback,
			void *callback_arg);

函数参数

  • struct event_base *baseevent将被添加到哪一个event_base
  • evutil_socket_t fd:要监听的文件描述符
  • short events:要监听的事件
    • #define EV_TIMEOUT 0x01:超时事件
    • #define EV_READ 0x02:读事件
    • #define EV_WRITE 0x04:写事件
    • #define EV_SIGNAL 0x08:信号事件
    • #define EV_PERSIST 0x10:周期性触发
    • #define EV_ET 0x20:边缘触发,需要底层事件I/O方法支持
  • event_callback_fn callback:回调函数
    • 回调函数定义:typedef void(* event_callback_fn) (evutil_socket_t, short, void *)
      • evutil_socket_t fd:监听的文件描述符,与event_new中的fd相同
      • short events:监听的事件,与event_new中的events相同
      • void *arg:回调函数的参数
  • void *callback_arg:要传递给回调函数的参数

函数返回值

  • struct event*
    • 成功返回初始化的event结构体指针
    • 失败返回nullptr

event_add()

函数说明
event添加到event_base监听集合。

函数原型

#include <event.h>
#include <event2/event.h>
int event_add	(struct event *ev,
		 const struct timeval *timeout);

函数参数

  • struct event *ev:要添加的event结构体
  • const struct timeval *timeout:事件监听的超时时间
    • struct timeval { long tv_sec; long tv_usec;};
      • long tv_sec:秒
      • long tv_usec:微秒

函数返回值

  • int
    • 成功返回0
    • 失败返回-1

event_del()

函数说明
eventevent_base监听移除。

函数原型

#include <event.h>
#include <event2/event.h>
int event_del(struct event *ev);

函数参数

  • struct event *ev:要删除的event结构体

函数返回值

  • int
    • 成功返回0
    • 失败返回-1

event_free()

函数说明
释放event结构体内存空间

函数原型

#include <event.h>
#include <event2/event.h>
void event_free(struct event *);

函数参数

  • struct event *:要释放空间的event结构体指针

event_base_loop()

函数说明
开始事件监听循环。

函数原型

#include <event.h>
#include <event2/event.h>
int event_base_loop(struct event_base *eb, int flags);

函数参数

  • struct event_base *eb:要开始监听的event_base结构体
  • int flags:监听方式的标志
    • 0:不设置标志位,默认处理方式,如果event_base中没有需要监听的事件则退出循环,或者被函数中止
    • #define EVLOOP_ONCE 0x01:阻塞等待事件满足,处理完所有满足条件的事件后,函数返回
    • #define EVLOOP_NONBLOCK 0x02:非阻塞处理满足条件的事件,如果没有满足条件的事件,直接返回,否则处理完所有事件后返回
    • #define EVLOOP_NO_EXIT_ON_EMPTY 0x04:一直循环监听,即使监听事件集合为空也不退出,直到被函数中止

函数返回值

  • int
    • 正常退出返回0
    • 出错返回-1

event_base_dispatch()

函数说明
相当于event_base_loop(eb, 0),使用默认处理方式监听处理事件。

函数原型

int event_base_dispatch(struct event_base *base);

event_base_loopexit()

函数说明
退出事件监听循环,该函数在等待下一次超时后,处理所有激活的事件,然后退出循环。

函数原型

#include <event.h>
#include <event2/event.h>
int event_base_loopexit(struct event_base *eb, const struct timeval * tv);

函数参数

  • struct event_base *eb:要退出监听循环的event_base结构体指针
  • const struct timeval * tv:等待退出循环的超时时间

函数返回值

  • int
    • 正常退出返回0
    • 出错返回-1

event_base_loopbreak()

函数说明
立即退出事件监听循环,在处理完目前的事件后立即退出循环。

函数原型

#include <event.h>
#include <event2/event.h>
int event_base_loopbreak(struct event_base *eb);

函数参数

  • struct event_base *eb:要退出监听循环的event_base结构体指针

函数返回值

  • int
    • 正常退出返回0
    • 出错返回-1
posted @ 2024-04-10 20:58  杨谖之  阅读(42)  评论(0编辑  收藏  举报