先从一个 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;
}

编译并运行:

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

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

编译的时候需要链接 libev 动态库。

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

可以说这代码非常容易理解,代码间的注视也是非常的详细。

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


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

 

posted @ 2017-07-09 01:40  fengbohello  阅读(1158)  评论(0编辑  收藏  举报