本文简单的说一下 libev 的 使用关键点。
libev 是一种高性能事件循环 / 事件驱动库。作为 libevent 的替代作品,由于其支持linux,而且其作者声称其相比libevent速度更快,代码更少,所以我们在嵌入式linux中采用 libev。
libev 同样需要循环探测事件是否产生。Libev 的循环体用 ev_loop 结构来表达,并用 ev_loop( ) 来启动。
void ev_loop( ev_loop* loop, int flags )
libev 支持八种事件类型,其中包括 IO 事件。一个 IO 事件用 ev_io 来表征,,并用 ev_io_init() 函数来初始化:
void ev_io_init(ev_io *io, callback, int fd, int events)
初始化内容包括回调函数 callback,被探测的句柄 fd 和需要探测的事件,EV_READ 表“可读事件”,EV_WRITE 表“可写事件”。
其他的事件依次类推,对应接口为 ev_xxx_init ,
现在,用户需要做的仅仅是在合适的时候,将某些 ev_io 从 ev_loop 加入或剔除。一旦加入,下个循环即会检查 ev_io 所指定的事件有否发生;如果该事件被探测到,则 ev_loop 会自动执行 ev_io 的回调函数 callback();如果 ev_io 被注销,则不再检测对应事件。
无论某 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_* )
由此,我们可以容易得出如下的“一问一答”的服务器模型。由于没有考虑服务器端主动终止连接机制,所以各个连接可以维持任意时间,客户端可以自由选择退出时机。
使用 libev 库的服务器模型
上述模型可以接受任意多个连接,且为各个连接提供完全独立的问答服务。借助 libev 提供的事件循环 / 事件驱动接口,上述模型有机会具备其他模型不能提供的高效率、低资源占用、稳定性好和编写简单等特点。