libevent + 使い方

日本語でlibeventの解説をしているページが少ないので、使用方法などメモ。

インストール

http://www.monkey.org/~provos/libevent/
libevent-1.3e.tar.gz をダウンロード。
* 2009-02-22 時点では、libevent-1.4.9-stable.tar.gz が最新。

  
$ ./configure --prefix=/usr/local/libevent-1.3e  
$ make  
$ make install  

仕組みについて

configure 時に、epoll, select, poll, kqueue などの通知メカニズムの中から、
使用可能かつもっとも scalable なメカニズムを選択する。
configure オプションで通知メカニズムの選択は出来ない。

超簡潔使用法

1.event_init で初期化
2.event_set でイベント設定
3.event_add で設定したイベントを追加
4.event_del で追加したイベントを削除
5.event_dispatch でイベント通知の検知を開始

ソース(例えばlibevent-1.3e)のsampleディレクトリにサンプルソースコードがある。

イベントフラグ関連

EV_READ
読み込みイベント。

EV_WRITE
書き込みイベント

EV_PERSIST
継続フラグ。
指定するとイベント通知を受け取った後も継続してイベント通知を受け取る。
逆に指定しなければ、イベント通知を受け取った後、内部で設定したイベントが削除され、
再度 event_add しない限り、イベント通知を受け取らなくなる。
また、event_add の第2引数に timeval 構造体を渡していると、
EV_PERSISTを追加していても、イベント通知を受け取った後、
内部で設定したイベントが削除される。
timeval 構造体を渡した場合、イベント通知を受け取った後、
もう一度 event_add を行う必要がある。

サーバーサンプル

main.cpp

ごちゃごちゃして見にくくなった orz

せっかくなのでアップップ。
sample.zip

おしまい

ちなみにうちの MacBook さんでは、kqueueが選択された。

関連:チャットサーバのサンプル