epollの最も単純な使い方
eventfdとpoll,epoll。そしてepollの謎。 - みさきちは行き当たりばったり
これのepollに関してです。
ネットを漁ると詳細な(大掛かりな)説明ばかりです。
私自身が単純な使い方しかしないのでその備忘録的な。
epollは複数のファイルディスクリプタのイベントを受けることができます。
が、単純に使うと1:1です。
まずは作成。
ep = epoll_create(1);
引数は扱えるファイルディスクリプタの数ですが、Linux 2.6.8以降無視される。
無視されないとしても1:1であれば1でいい。
次に準備。
ちなみにefdはeventfdのファイルディスクリプタだとします。
struct epoll_event event = {};
event.events = EPOLLIN;
ret = epoll_ctl(ep, EPOLL_CTL_ADD, efd, &event);
epoll、epに対して、efdに関する操作を追加します。
ここではeventsにEPOLLINを指定しています。
readが可能になったときに通知を受けれるようになります。
ここで、よくあるサンプルだと、event.data.fd = efd; といった記述があります。
これは、epに別のファイルディスクリプタの操作を追加した際に役に立ちます。
イベント受信したときに、どのファイルディスクリプタに関することかが通知時に受け取るデータに入るからです。
ですが1:1なら不要です。
あってもいいのですが、使い方を漁るとどれもfdを入れていて、必須なのかな?と勘違いしてしまいました。私は。
あとは通知待ちです。
struct epoll_event evt = {}; epoll_wait(ep, &evt, 1, -1);
第4引数がタイムアウトmsecなので、これで無限待ちします。
正常に終了するとevt.eventsにはEPOLLINが入ってきます。
今回の場合、epoll_ctlでEPOLLINしか指定していません。
ですので、epoll_waitを抜けるのはEPOLLINが来るか、それ以外の割り込みで抜けてしまいエラーとなった時です。
参考
linuxjm.osdn.jp