event_new的实现其实是间接的调用的event_assign,首先调用mm_malloc分配一块内存,然后调用event_assign来给event类型的对象各个成员赋值。 1structevent*2event_new(structevent_base *base, evutil_socket_t fd,shortevents,void(*cb)(evutil_socket_t,short,void*),void*arg)3{4structevent*ev;5ev = mm_mall...
这两种方式的区别就是,event_assign是在栈上分配一个对象,然后给成员赋值;而event_new是在堆上分配一个对象,然后给成员赋值。
3.初始化event 对于已经在event_base中处于“挂起”状态的event,永远不要调用event_assign。这样做会导致极为难以诊断的错误。如果event已经初始化,并且处于“挂起”状态,那么在调用event_assign之前应该先调用event_del。* //申请内存创建event ,内部使用event_assign赋值 struct event *event_new(struct event_base ...
D-2:event_assign 注册监听器事件 注册监听器期间,也会关联对应的 listener_read_cb回调函数,这个函数是用在新连接过来时,他会触发用户自定义的回调函数。 D-3:listener_read_cb listener.c # listener_read_cb D-4:evconnlistener_ops 包括了 enable,disable等底层逻辑 listener.c # evconnlistener_ops 2.0...
而该函数内部实际上又会调用event_assign函数。需要注意的是,创建普通event时第二个参数传入的是需要监听的的文件描述符,而这里创建信号event时传入的第二个参数则应当是需要监听的信号值了,比如说需要监听的信号是SIGUSR1,那么调用evsignal_new时,传入的第二个参数就应该直接使用SIGUSR1。evsignal_new的第三个参数...
event_assign(structevent*ev,structevent_base*base,evutil_socket_tfd,shortevents,void(*callback)(evutil_socket_t,short,void*),void*arg){// 初始化event(包括所属base,绑定fd,callback函数,callback参数等)if(!base)base=current_base;if(arg==&event_self_cbarg_ptr_)arg=ev;if(!(events&EV_SIGNA...
使用event_new 或者event_assign函数 获得一个event,二者的区别是event_new 内部对结构体event进行申请空间后再调用event_assign操作。 event_new实现 event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void ...
我们也可以用event_assign去初始化栈分配和static栈初始化的events 永远不要在event已经绑定event_base后还在这个event上调用event_assign(),这会导致难以诊断的错误 当有多个event在同时激活,Libevent不会定义任何执行的顺序。我们可以通过定义优先级来达到 在调用event_add之前,调用函数 设置优先级。
intevent_assign(structevent*event,structevent_base*base,evutil_socket_t fd,shortwhat,void(*callback)(evutil_socket_t,short,void*),void*arg);//参数都和event_new一样//返回0成功,-1错误 //例子structevent_pair{evutil_socket_t fd;structeventread_event;structeventwrite_event;};voidreadcb(evutil...
使用`event_assign()`函数将需要监听的文件描述符、事件类型以及回调函数等绑定到一个`event`结构体上。 4. 添加事件到事件循环 使用`event_add()`函数将事件添加到事件循环中,这样libevent就会开始监听相应的文件描述符上的事件。 5. 启动事件循环 使用`event_base_dispatch()`函数启动事件循环,libevent会不断监...