struct event* event_new(struct event_base* base,evutil_socket_t fd,short events, void(*cb)(evutil_socket_t,short,void*),void* arg)
3.调用event_add函数进行注册(可以理解为epoll中的epoll_ctl(base,EPOLL_ADD,fd,*event))
4.调用event_base_dispatch(可以理解为epoll_wait函数)函数执行事件循环
5.循环结束,*_free系列函数释放系统资源
event结构体源码
struct event{
TAILQ_ENTRY(event) ev_active_next;//所有已经激活的事件串联成的尾队列(活动事件队列)
TAILQ_ENTRY(event) ev_next;//所有已经注册的事件处理器串联成的一个尾队列(注册事件队列)
union{
TAILQ_ENTRY(event)ev_next_with_timeout;//指出该定时器在通用定时器队列中的位置
int min_heap_idx;//定时器在时间堆中的位置
}ev_timeout_pos;
evutil_socket_t ev_fd;//句柄
struct event_base* ev_base;//从属的event_base实例
union{
struct{
TAILQ_ENTRY(event)ev_io_next;
struct timeval ev_timeout;
}ev_io;//io事件队列
struct{
TAILQ_ENTRY(event) ev_signal_next;
short ev_ncalls;//信号到来调用多少次回调
short* ev_pncalls;//指向ev_ncall或者为NULL
}ev_signal;//信号事件队列
}_ev;
short ev_events;//事件类型P240
short ev_res;//激活事件类型
short ev_flags;//事件标志
ev_uint8_t ev_pri;//事件优先级
ev_uint8_t ev_closure;//回调函数行为
struct timeval ev_timeout;//定时器超时值(仅对定时器事件处理器有效)
void (*ev_callback)(evutil_socket_,short,void* arg);//回调函数(传入ev_fd,ev_res,ev_arg)
void* ev_arg;//回调函数的参数
}
eventop结构体源码 eventop结构体封装了IO复用机制的一些必要操作,为event_base支持的所有后端IO复用机制提供了一个统一的接口,默认选择的技术是epoll
struct eventop{
//后端IO复用技术的名称
const char* name;
//初始化函数
void*(*init)(struct event_base *);
//注册事件
int (*add)(struct event_base *,evutil_socket_t fd,short old,short events,void *fdinfo);
//删除事件
int (*del)(struct event_base *,evutil_socket_t fd,short old,short events,void *fdinfo);
//等待事件
int (*dispatch)(struct event_base *,struct timeval *);
//释放IO复用机制使用的资源
void (*dealloc)(struct event_base *);
//程序调用fork后是否需要重新初始化
int need_reinit;
//IO复用技术支持的一些特性:边沿触发事件,事件检测算法复杂度O(1),监听其他类型的文件描述符上的事件
enum event_method_feature features;
//分配额外内存的长度
size_t fdinfo_len;
}



