libevent简介
libevent是一个事件通知库,封装了reactor。
libevent API 提供了一种机制,用于在文件描述符上发生特定事件或达到超时后执行回调函数。此外,libevent还支持由于信号或常规超时而导致的回调。
libevent 旨在替换在事件驱动的网络服务器中找到的事件循环。应用程序只需要调用event_dispatch(),然后动态添加或删除事件,而无需更改事件循环。
目前,该控件支持/dev/poll,kqueue(),event ports,POSIX select(),Windows select(),poll()和epoll()。内部事件机制完全独立于公开的事件 API,并且 libevent 的简单更新可以提供新功能,而无需重新设计应用程序。因此,Libevent 允许可移植应用程序开发,并提供操作系统上可用的最具可扩展性的事件通知机制。libevent 还可用于多线程应用程序,方法是隔离每个event_base,以便只有单个线程访问它,或者锁定对单个共享event_base的访问。
libevent 还为缓冲网络 IO 提供了一个复杂的框架,支持套接字、筛选器、速率限制、SSL、零副本文件传输和 IOCP。自由度包括对几种有用协议的支持,包括 DNS、HTTP 和最小的 RPC 框架。
libevent编译安装,官网下载安装包并解压。进入解压目录执行:
代码语言:Bash
自动换行
AI代码解释
wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz tar -zxvf libevent-2.1.12-stable.tar.gz cd libevent-2.1.12-stable ./configure make sudo make install
三、libevent库的封装层级
3.1、reactor对象封装struct event_base
reactor对象封装为struct event_base;通过:
(1)event_base_new()构造对象。
(2)event_base_free()销毁对象。
3.2、事件对象struct event
事件对象通过struct event的结构体封装使用。
展开
代码语言:C
自动换行
AI代码解释
struct event { struct event_callback ev_evcallback; /* for managing timeouts */ union { TAILQ_ENTRY(event) ev_next_with_common_timeout; int min_heap_idx; } ev_timeout_pos; evutil_socket_t ev_fd; struct event_base *ev_base; union { /* used for io events */ struct { LIST_ENTRY (event) ev_io_next; struct timeval ev_timeout; } ev_io; /* used by signal events */ struct { LIST_ENTRY (event) ev_signal_next; short ev_ncalls; /* Allows deletes in callback */ short *ev_pncalls; } ev_signal; } ev_; short ev_events; short ev_res; /* result passed to event callback */ struct timeval ev_timeout; };
变量 | 含义 |
|---|---|
ev_evcallback | 回调函数。事件是异步处理的,需要回调函数。 |
min_heap_idx | 时间事件的最小堆的索引。 |
ev_fd | 定时事件的fd。 |
ev_base | 事件对象所属的reactor的对象。 |
ev_io | 网络事件关注的事情。 |
ev_signal | 信号事件关注的事情。 |
ev_timeout | 超时。 |
ev_timeout_pos和ev_fd | 定时任务处理的事情。 |
ev_events | 具体注册的事件。 |
ev_ | 具体的信号。 |
通常,event对象可以自己处理IO。
(1)event_new():构建事件对象、绑定、事件回调。
(2)event_free():销毁事件对象。
bufferevent和evconnlistener对象只需要关注业务逻辑的处理,由libevent内部处理IO操作。
bufferevent是在event对象上面封装的缓冲区。