libevent库学习 event_base和event

简介

libevent 库的使用少不了event_base和event

创建一个event_base

 struct event_base* event_base_new(viod);

释放evnet_base

event_base_free(struct event_base* base);

创建事件

	 struct event *event_new(
		struct event_base* base,
		evutil_socket_t fd,
		short what,
		event_callback_fn cb,
		void *arg
		);

调用event_new()函数之后, 新事件处于已初始化和非未决状态

有关于未决态和非未决态的理解:

  1. 非未决: 没有资格被处理
  2. 未决: 有资格被处理但是还没有处理
条目解释
base:event_base_new()返回值。
fd:绑定到 event 上的 文件描述符
what:对应的事件(r、w、e)
cb:一旦事件满足监听条件,回调的函数。
arg:回调的函数的参数。
返回值:成功创建的 event

回调函数

// 事件的处理回调函数
	typedef void (*event_callback_fn)(evutil_socket_t, short, void *); 
//	short what
	#define  EV_TIMEOUT         0x01    // 已淘汰(忽略)
	#define  EV_READ            0x02
	#define  EV_WRITE           0x04
	#define  EV_SIGNAL          0x08    //libevent封装了信号相关的操作 SIGNAL
	#define  EV_PERSIST         0x10    // 持续触发
	#define  EV_ET              0x20    // 边沿模式


event 的释放

void event_free(struct event *event); 

event_add

创建事件之后,在将其添加到 event_base 之前实际上是不能对其做任何操作的。
使用event_add()将事件添加到event_base

int event_add(
				struct event *ev, 
				const struct timeval *tv
				); 
tv:参数Value
NULL:事件被触发, 对应的回调被调用
tv = {0, n}设置的时间,在改时间段内检测的事件没被触发, 时间到达之后, 回调函数还是会被调用

添加事件循环

int event_base_dispatch(struct event_base* base);

等同于没有设置标志的 event_base_loop ( ),将一直运行,直到没有已经注册的事件了,或者调用 了event_base_loopbreak()或者 event_base_loopexit()为止

// event_base_loop()
int event_base_loop(struct event_base *base, int flags);
//正常退出返回0, 失败返回-1

//flages
#define EVLOOP_ONCE                        0x01
		//事件只会被触发一次
		//事件没有被触发, 阻塞等
#define EVLOOP_NONBLOCK                    0x02
		//非阻塞 等方式去做事件检测
		//不关心事件是否被触发了
#define EVLOOP_NO_EXIT_ON_EMPTY  		   0x04
		//没有事件的时候, 也不退出轮询检测

退出事件循环

可以选择执行完当前事件后退出还是立即退出循环。
执行完当前事件后退出:

int event_base_loopexit(
				struct event_base *base,
				const struct timeval *tv
				);
struct timeval {
			  long tv_sec;                    
				long   tv_usec;            
			};	

立即退出循环

int event_base_loopbreak(struct event_base *base);

使用流程

创建event_base
	struct event_base* base=event_base_new();
创建event
	struct event ev=event_new(base,fd,EV_WRITE,write_cb,NULL);
添加event
	event_add(ev,NULL);
event_base添加事件循环
	event_base_dispatch(base);
释放event
	event_free(ev);
释放event_base
	event_base_free(base);

注:其中fd是需要监听的文件描述符,有写事件时触发写事件回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值