libevent是基于reactor模式建立的,reactor由四部分构成:
句柄(文件描述符),时间多路分发器(I/O复用函数),
事件处理器(回调函数),reactor
libevent有如下特点:跨平台支持,同一事件源,线程安全;
所以第一步定义libevent实例:
struct event base *base = event_init();
接下来:因为libevent可以监听三种事件:I/O事件,信号事件,定时事件
所以定义事件可以用统一的event_new();
也可以用evsignal_new()/evtimer_new();
如果定义信号事件:
struct event *sig_ev = evsignal_new(base,SIGINT,sig_fun,NULL);
或者 struct event *sig_ev = event_new(base,SIGINT,EV_SIGNAL,sig_fun,NULL);
这里sig_fun是事件处理函数,如果要求不断地响应事件,可以将其设置为永久事件
即就是:EV_SIGNAL|EV_PERSIST;
下来就是注册事件,将事件添加至反应堆里,event_add(sig_ev,NULL);
第四步,事件循环,调用event_base_dispath(base);
之后当事件处理完将事件移除反应堆:event_free(sig_ev);
event_base_free(base);
差不多就是libevent处理事件的全过程。
时间: 2024-10-22 15:37:39