#include<ev.h>
#include <stdio.h>
ev_io stdin_watcher;
ev_timer timeout_watcher;
static void stdin_cb (EV_P_ ev_io *w, int revents)
{
puts ("stdin ready");
ev_io_stop (EV_A_ w);
ev_unloop (EV_A_ EVUNLOOP_ALL);
}
static void timeout_cb (EV_P_ ev_timer *w, int revents)
{
puts ("timeout");
ev_unloop (EV_A_ EVUNLOOP_ONE);
}
int main (void)
{
struct ev_loop *loop = ev_default_loop (0);
ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);
ev_io_start (loop, &stdin_watcher);
ev_timer_init (&timeout_watcher, timeout_cb, 1, 0.);
ev_timer_start (loop, &timeout_watcher);
ev_loop (loop, 0);
return 0;
}
これはlibev本家サイトにあったサンプルコードそのままです。
http://software.schmorp.de/pkg/libev.html
ちなみにこれを libeventで書くとこんな感じになります。
#include<sys/types.h>
#include <event.h>
#include <stdio.h>
struct event stdin_watcher;
struct event timeout_watcher;
struct timeval t;
static void stdin_cb(int fd, short event, void *arg)
{
puts ("stdin ready");
event_del(arg);
event_base_loopbreak(((struct event *)arg)->ev_base);
}
static void timeout_cb(int fd, short event, void *arg)
{
puts ("timeout");
event_base_loopbreak(((struct event *)arg)->ev_base);
}
int main (void)
{
struct event_base *base = event_init();
event_set(&stdin_watcher, 0, EV_READ, stdin_cb, &stdin_watcher);
event_add(&stdin_watcher, NULL);
event_base_set(base, &stdin_watcher);
t.tv_sec = 1;
evtimer_set(&timeout_watcher, timeout_cb, &timeout_watcher);
timeout_add(&timeout_watcher, &t);
event_base_set(base, &timeout_watcher);
event_base_dispatch(base);
return 0;
}
当然といえば当然ですがどちらも似た感じです。
というかこれだけでは見た目以外の違いがわかりませんね。
今度libevとlibeventの実装方法についても比較してみます
参考
http://libev.schmorp.de/bench.html
http://d.hatena.ne.jp/akkt/20080425/1209080621