先从一个 libev 的 demo 入手

最近想研究下 libev 这个网络库,因此先从官方文档一个最简单的 demo 开始,代码以下:网络

//io.c
// a single header file is required
#include <ev.h>
#include <stdio.h> // for puts
// every watcher type has its own typedef'd struct
// with the name ev_TYPE
ev_io stdin_watcher;
ev_timer timeout_watcher;
// all watcher callbacks have a similar signature
// this callback is called when data is readable on stdin
static void stdin_cb (EV_P_ ev_io *w, int revents) {
    puts ("stdin ready");
    // for one-shot events, one must manually stop the watcher
    // with its corresponding stop function.
    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) {
    puts ("timeout");
    // this causes the innermost ev_run to stop iterating
    ev_break (EV_A_ EVBREAK_ONE);
} 

int main (void) {
    // use the default event loop unless you have special needs
    struct ev_loop *loop = EV_DEFAULT;
    // initialise an io watcher, then start it
    // this one will watch for stdin to become readable
    ev_io_init (&stdin_watcher, stdin_cb,
            /* STDIN_FILENO*/ 0, EV_READ);
    ev_io_start (loop, &stdin_watcher);
    // initialise a timer watcher, then start it
    // simple non-repeating 5.5 second timeout
    ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
    ev_timer_start (loop, &timeout_watcher);
    // now wait for events to arrive
    ev_run (loop, 0);
    // break was called, so exit
    return 0;
}

编译并运行:less

gcc -c -o io.o io.c
gcc -o io io.o -lev

$ ./io 
$ timeout
$ ./io 
$
$ stdin ready

编译的时候须要连接 libev 动态库。oop

从上面能够看出,我是运行了这个程序两次。第一次是运行后就再也不执行任何操做, 等待程序本身由于超时而结束。第二次就是按了一个回车,使 stdin 处于可读状态,触发了 io 事件, 程序也结束了。ui

能够说这代码很是容易理解,代码间的注视也是很是的详细。this

之后会对 libev 的具体数据结果和实现进行分析。这个 demo 就到这里啦。spa


同步地址:http://www.fengbohello.top/code/libev-001code

相关文章
相关标签/搜索