Open Source Web Development Tutorials - Dev Shed
Linuxファイルとイベントポーリングインターフェース
(2009/03/10公開)
Linuxファイルとイベントポーリングインターフェース
本連載は、7回に分けて、Linux I/Oファイルのシステムコールを解説しています。第2回では、ロバート・ラブ著『Linux System Programming: Talking Directly to the Kernel and C Library(Linuxシステム・プログラミング-カーネルおよびCライブラリへ直接話しかける:仮題)』第4章から抜粋して、イベントポーリングインターフェースを取り上げます。(原著はオライリーより2007年に出版、ISBN: 0596009585(Copyright 2007 O'Reilly Media, Inc.))禁無断転載。出版社の許可を得て使用しています。書店あるいはオライリーメディアから直接購入できます。
イベントポーリングインターフェース
poll()およびselect()の限界が認識されたことから、2.6 Linux カーネル*は便利なイベント・ポーリング(event pollあるいはepoll)を導入しました。Epollは、以前のふたつのインターフェースに比べると複雑ですが、それらに共通して見られた根本的な性能上の問題を解決し、いくつかの新機能を追加しています。
poll()とselect()は、どちらも、ファイル記述子の完全なリストがないと呼び出しを監視できません。次に、カーネルは、監視する各ファイル記述子のリストをひとつずつチェックしなくてはなりません。このリストが大きくなると-何百、何千ものファイル記述子を含むリストもあります-呼び出しごとのリストチェックが拡張面での障害となります。
イベントポーリングは、実際のモニタリングからモニター登録を分離することで、この問題を回避します。ひとつのシステムコールによってイベントポーリングのコンテクストを初期化し、次のシステムコールによってモニターしたファイル記述子をそのコンテクストに追加/そのコンテクストから削除し、3番目のシステムコールによって実際のイベントの待機を実行します。
新規Epollインスタンスの作成
イベントポーリングコンテクストは、以下のように、poll_create()で作成します。
#include <sys/epoll.h>
int epoll_create (int size)
epoll_create()のコールが成功すると、新規のepollインスタンスが作成され、そのインスタンスに関連付いたファイル記述子が戻ります。このファイル記述子は、実際のファイルとはなんの 関連 もなく、epollを利用した以後のコールで使用するハンドルに過ぎません。sizeパラメータはモニターの対象となるファイル記述子の数であり、カーネルに手掛かりとして与えます。すなわち、最大数を意味するものではありません。近似の値を渡せば性能が向上しますが、正確な数は必要ではありません。エラーが生じた場合は、-1が戻り、errnoが以下のいずれかを示します。
EINVAL
sizeパラメータが正の数ではありません。
ENFILE
システムがオープンファイル合計数の制限に達しました。
ENOMEM
メモリー不足のため、作業を完了できませんでした。
コールは、通常、以下のようになります。
int epfd;
epfd = epoll_create (100); /* plan to watch ~100 fds */
if (epfd < 0)
perror ("epoll_create");
epoll_create()から戻されたファイル記述子は、ポーリングの終了後、close()のコールによって破棄しなくてはなりません。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








