http://hi.baidu.com/baowup/item/732c590d956eef364ac4a300
头文件 event.h 。
编译标志 -levent 。(gcc -levent ... )
2 建立event句柄
struct event ev;
event_init();
event_set(&ev,s,EV_READ|EV_PERSIST,callback,&ev);
event_add(&ev,NULL);
event_dispatch();
3 函数声明格式
struct event_base* event_init() :
初始化事件API。
void event_set(struct event* ev, int fd, short events, void(*fn)(int, short, void*), void* arg) :
构造一个事件结构用于准备添加。
ev为事件句柄,
fd为文件描述符,
events为几种事件的组合,
然后是回调函数和附加传输参数。
可用的events组合包括: EV_TIMEOUT 、 EV_READ 、 EV_WRITE 、 EV_SIGNAL 、 EV_PERSIST 。
fn回调函数的第一个参数为文件描述符,
第二个是事件常量数字,
第三个为传递过来的附加参数。
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
#define EV_PERSIST 0x10
int event_add(struct event* ev, struct timeval* tv) :
添加事件到监控器,可以指定超时为参数tv。
int event_del(struct event* ev) :
删除事件。
4 超时事件
事件的超时功能是在 event_add() 函数中的第二个参数指定的。是一个timeval结构体。
当tv参数为NULL时就没有超时。
而当传递进去timeval结构体时就可以提供理论上高达1微秒的精度的超时。
这里一个超时示例:
struct timeval tv;
tv.tv_sec=1;
tv.tv_usec=0;
event_add(&ev,tv);
超时发生时可以在回调函数fn中的event参数得到值为EV_TIMEOUT的事件,
注意不要与其他类型事件混淆。
5 初始化小心
注意声明的 struct event 结构体实例的作用域,
在 main() 函数或者全局的尚且没事。
如果只是在某个函数内部声明,则出函数后该结构体被回收则会出错。最好将这个结构体放在堆里面:
struct event* ev_accept=(struct event*)malloc(sizeof(struct event));
6 回调函数
回调函数声明格式:
void fn(int fd, short event, void* arg);
其中fd为文件句柄,可以按照特定的环境使用不同的读写函数。
event为事件类型,见如上定义的5种事件类型中的前4种。
注意需要在回调函数中再次调用该事件的 event_add() 函数来确保事件继续下去。
所以至少需要使用arg来传递ev结构体,
如果需要传递的东西很多,则可能需要用arg来传递一个自定义的结构体,包含多个结构体的指针
【转】Libevent使用摘要
最新推荐文章于 2020-03-12 15:04:09 发布