首先调用ev_default_loop初始化struct ev_loop结构; 然后调用ev_io_init初始化监视器中的属性,该宏主要就是调用ev_init和ev_io_set; 然后调用ev_io_start启动该监视器,该函数主要是将监视器添加到loop->anfds结构中,将监视的描述符添加到((loop)->fdchanges)中; 调用ev_run开始等待事件的触发,该函数中: ...
-增:在 `ev_io_start()` 中,添加 watcher 到 `anfds[fd].head` 链表。-删:在 `ev_io_stop()` 中,删除 `anfds[fd].head` 链表中的 watcher。-修改:-anfds[fd]->active:在 `ev_io_start()->fd_change()` 中被修改 。-anfds[fd]->events:在 `ev_run()->fd_reify()` 中被修改 ,修...
libev中所有事件的基础类型ev_watcher,所有的事件都可以通过(W)watcher转换成ev_watcher,大写的W在libev定义的是ev_watcher *。抽象出ev_watcher作用是所有的watcher都可以共用ev_start、ev_stop函数 下面用ev_TYPE表示ev_io、ev_timer、ev_async各种watcher类型的通用形式。各种类型的ev_TYPE都继承自ev_watcher,还有...
一旦增加,下个循环即会检查 ev_io 所指定的事件有否发生;假设该事件被探測到,则 ev_loop 会自己主动运行 ev_io 的回调函数 callback();假设 ev_io 被注销。则不再检測相应事件。 不管某 ev_loop 启动与否,都能够对其加入或删除一个或多个 ev_io,加入删除的接口是 ev_io_start() 和 ev_io_stop()。
static void stdin_cb (EV_P_ ev_io *w, int { puts ("stdin ready"); //对ev_io事件的监控不会自动停止,需要手动在需要的时候停止 ev_io_stop (EV_A_ w); //整体的loop事件在所有监控停止时停止,也可以手动关闭全部的ev_run ev_break (EV_A_ EVBREAK_ALL); ...
ev_io_stop (EV_A_ w); // this causes all nested ev_run's to stop iterating ev_break (EV_A_ EVBREAK_ALL); } // another callback, this time for a time-out static void timeout_cb (EV_P_ ev_timer *w, int revents)
void ev_loop_destroy(struct ev_loop *loop); 初使化观察者: 主要用到以下宏: #defineev_init(ev,cb_)do{\((ev_watcher*)(void*)(ev))->active=\((ev_watcher*)(void*)(ev))->pending=0;\((ev_watcher*)(void*)(ev))->priority=0;\(ev)->cb=cb_;\}while(0)#defineev_io_set(ev,...
EVBACKEND_KQUEUE:大多数 BSD 的后端 EVBACKEND_DEVPOLL:Solaris 8 后端 EVBACKEND_PORT:Solaris 10 后端 voidev_loop_destroy(structev_loop *loop); 销毁ev_loop。注意这里要将所有的 IO 清除光之后再调用,因为这个函数并不中止所有活跃(active)的 IO。部分 IO 不会被清除,比如 signal。这些需要手动清除。这...
无论某 ev_loop 启动与否,都可以对其添加或删除一个或多个 ev_io,添加删除的接口是 ev_io_start() 和 ev_io_stop()。 void ev_io_start( ev_loop *loop, ev_io* io ) void ev_io_stop( EV_A_* ) 由此,我们可以容易得出如下的“一问一答”的服务器模型。由于没有考虑服务器端主动终止连接机制...
网络的封装又分为:IO检测和IO操作。解决的问题分为:连接建立的问题(限制最大连接数,黑白名单等)和连接断开的问题,数据到达和数据发送。 在这里插入图片描述 如果不想自己操作IO事件,那么我们就将IO读写的操作交给libevent进行管理,让其帮我们去处理边界问题。从较高的封装层次去使用libevent,我们只需要在libevent...