2 .\" epoll by Davide Libenzi ( efficient event notification retrieval )
3 .\" Copyright (C) 2003 Davide Libenzi
5 .\" This program is free software; you can redistribute it and/or modify
6 .\" it under the terms of the GNU General Public License as published by
7 .\" the Free Software Foundation; either version 2 of the License, or
8 .\" (at your option) any later version.
10 .\" This program is distributed in the hope that it will be useful,
11 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
12 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 .\" GNU General Public License for more details.
15 .\" You should have received a copy of the GNU General Public License
16 .\" along with this program; if not, write to the Free Software
17 .\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 .\" Davide Libenzi <davidel@xmailserver.org>
21 .\" Japanese Version Copyright (c) 2004-2005 Yuichi SATO
22 .\" all rights reserved.
23 .\" Translated Sat Jun 19 07:50:04 JST 2004
24 .\" by Yuichi SATO <ysato444@yahoo.co.jp>
25 .\" Updated & Modified 2005-01-18, Yuichi SATO
26 .\" Updated 2006-07-14, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
27 .\" Catch up to LDP v2.34. epoll.4 is renamed to epoll.7.
28 .\" Updated 2007-09-07, Akihiro MOTOKI, LDP v2.64
29 .\" Updated 2008-04-08, Akihiro MOTOKI, LDP v2.79
30 .\" Updated 2009-02-23, Akihiro MOTOKI, LDP v3.19
32 .TH EPOLL 7 2009-02-01 "Linux" "Linux Programmer's Manual"
36 .B #include <sys/epoll.h>
42 レベルトリガインタフェースのどちらとしても使用することができ、
43 監視するファイルディスクリプタの数が多い場合にも使用できる。
53 は作成した epoll インスタンスを参照するファイルディスクリプタを返す。
60 特定のファイルディスクリプタに対する監視内容を
64 インスタンスに現在登録されているファイルディスクリプタの集合は
73 イベント配送 (distribution) インタフェースは、
74 エッジトリガ (ET) としてもレベルトリガ (LT) としても動作させることができる。
75 二つの配送機構の違いは、次のように説明できる。
78 パイプの読み込み側を表すファイルディスクリプタ
84 パイプへ書き込むプログラムが 2 kB のデータをパイプの書き込み側へ書き込む。
87 を呼び出すと、読み込み可能 (ready) なファイルディスクリプタとして
91 パイプから読み出すプログラムが、1 kB のデータを
104 利用可能なデータがファイル入力バッファにまだ存在するにもかかわらず
110 その一方で、リモートの接続先 (peer) は既に送られたデータに
112 このようなことが起こる理由は、エッジトリガイベント配送では、
113 モニタしているファイルでイベントが起ったときにのみイベントが
118 入力バッファ内にすで存在するデータを待つことになるかもしれない。
125 でイベントが消費 (consume) される。
127 で行われる読み込み操作では、全部のバッファデータを消費しないので、
133 無期限に停止 (block) するかもしれない。
137 インタフェースはブロックしない (nonblocking) ファイルディスクリプタを
139 これは、ブロックされる読み込みや書き込みによって、
140 複数のファイルディスクリプタを扱うタスクが
145 インタフェースとして使うために提案される方法は以下の通りである。
149 ブロックしないファイルディスクリプタと共に使う。
160 一方、レベルトリガインタフェースとして使う場合
169 が使われているところではどこでも使用することができる。
171 エッジトリガを使った場合でも、複数のデータを受信すると複数の
181 によるイベントを受信した後で、関連するファイルディスクリプタを無効にさせる。
187 を指定してファイルディスクリプタを再度使用できるようにするのは、
190 epoll が消費するカーネルメモリの量を制限するために、
191 以下のインタフェースを使用することができる。
193 .\" Following was added in 2.6.28, but them removed in 2.6.29
195 .\" .IR /proc/sys/fs/epoll/max_user_instances " (since Linux 2.6.28)"
196 .\" This specifies an upper limit on the number of epoll instances
197 .\" that can be created per real user ID.
199 .IR /proc/sys/fs/epoll/max_user_watches " (Linux 2.6.28 以降)"
200 このファイルは、あるユーザがシステム上の全ての epoll インスタンスに
201 登録できるファイルディスクリプタの総数の上限を規定する。
203 登録されたファイルディスクリプタ 1 つが消費するメモリ量は、
204 32 ビットカーネルでおよそ 90 バイト、
205 64 ビットカーネルでおよそ 160 バイトである。
206 .\" 2.6.29 (in 2.6.28, the default was 1/32 of lowmem)
209 のデフォルト値は、利用可能なメモリ下限の 1/25 (4%) であり、
210 登録で消費されるメモリ量 (バイト単位) で割った値となる。
212 レベルトリガインタフェースとして使用するときの
218 アプリケーションのイベントループでストール (stall) しないように、
220 この例では、リスナはブロックしないソケットであり、
231 が返されるまでは、新しい準備済みのファイルディスクリプタを使う。
232 イベント駆動ステートマシンアプリケーションは、
234 を受信した後、カレントの状態を記録しておくべきである。
237 呼び出しのときに、以前に停止したところから
245 #define MAX_EVENTS 10
246 struct epoll_event ev, events[MAX_EVENTS];
247 int listen_sock, conn_sock, nfds, epollfd;
249 /* Set up listening socket, \(aqlisten_sock\(aq (socket(),
252 epollfd = epoll_create(10);
253 if (epollfd == \-1) {
254 perror("epoll_create");
259 ev.data.fd = listen_sock;
260 if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == \-1) {
261 perror("epoll_ctl: listen_sock");
266 nfds = epoll_wait(epollfd, events, MAX_EVENTS, \-1);
268 perror("epoll_pwait");
272 for (n = 0; n < nfds; ++n) {
273 if (events[n].data.fd == listen_sock) {
274 conn_sock = accept(listen_sock,
275 (struct sockaddr *) &local, &addrlen);
276 if (conn_sock == \-1) {
280 setnonblocking(conn_sock);
281 ev.events = EPOLLIN | EPOLLET;
282 ev.data.fd = conn_sock;
283 if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
285 perror("epoll_ctl: conn_sock");
289 do_use_fd(events[n].data.fd);
296 エッジトリガインタフェースとして使う場合、性能上の理由により、
298 .RB ( EPOLLIN | EPOLLOUT )
317 集合内の登録されたファイルディスクリプタを区別するには、
321 キーはファイルディスクリプタ番号とオープンファイル記述 (open file
322 description) の組である (オープンファイル記述は "open file handle" とも
323 呼ばれ、オープンされたファイルのカーネルの内部表現である)。
328 インスタンスに同じファイルディスクリプタを 2 回登録するとどうなるか?
336 インスタンスに対して複製されたディスクリプタを追加することは可能である
342 .\" But a descriptor duplicated by fork(2) can't be added to the
343 .\" set, because the [file *, fd] pair is already in the epoll set.
344 .\" That is a somewhat ugly inconsistency. On the one hand, a child process
345 .\" cannot add the duplicate file descriptor to the epoll set. (In every
346 .\" other case that I can think of, descriptors duplicated by fork have
347 .\" similar semantics to descriptors duplicated by dup() and friends.) On
348 .\" the other hand, the very fact that the child has a duplicate of the
349 .\" descriptor means that even if the parent closes its descriptor, then
350 .\" epoll_wait() in the parent will continue to receive notifications for
351 .\" that descriptor because of the duplicated descriptor in the child.
353 .\" See http://thread.gmane.org/gmane.linux.kernel/596462/
354 .\" "epoll design problems with common fork/exec patterns"
359 マスクで登録すれば、イベントをフィルタリングするのに
365 インスタンスが同じファイルディスクリプタを待ち受けることは可能か?
372 しかしながら、これを正しく扱うには注意深くプログラミングする必要が
377 ファイルディスクリプタ自身は poll/epoll/select が可能か?
382 ファイルディスクリプタに処理待ちのイベントがある場合は、
387 ファイルディスクリプタを自身のファイルディスクリプタ集合に
399 ファイルディスクリプタ集合の内部に追加することは可能である。
403 ファイルディスクリプタを UNIX ドメインソケットで他のプロセスに送ることは可能か?
409 集合内のファイルディスクリプタのコピーを持っていないからである。
412 ファイルディスクリプタをクローズすると、そのファイルディスクリプタは全ての
417 削除されるが、以下の点に注意が必要である。
418 ファイルディスクリプタはオープンファイル記述
429 経由で行う度に、同じオープンファイル記述を参照する新規のファイル
431 オープンファイル記述自体は、自身を参照する全てのファイルディスクリプタ
435 集合から削除されるのは、対応するオープンファイル記述を参照している
436 全てのファイルディスクリプタがクローズされた後である
439 を使ってそのディスクリプタを明示的に削除した場合にも削除される)。
442 集合に属しているあるファイルディスクリプタをクローズした後であっても、
443 同じファイル記述を参照する他のファイルディスクリプタがオープンされている間は、
444 クローズしたファイルディスクリプタ宛にイベントが報告される可能性があると
450 コールの間に発生した場合、それらはまとめて報告されるか、
458 既に集められているがまだ報告されていないイベントに影響するか?
461 既存のファイルディスクリプタに対して 2 つの操作を行うことができる。
463 変更すると、使用可能な I/O が再び読み込まれる。
467 フラグ (エッジトリガ動作) を使っている場合、
470 継続してファイルディスクリプタを読み書きする必要があるか?
475 そのファイルディスクリプタが要求された I/O 操作に対して準備済みである、
477 次の (ブロックしない) read/write で
479 を受け取るまではファイルディスクリプタは準備済みであると
481 そのファイルディスクリプタをいつどのように使うかは、
484 パケット指向やトークン指向のファイル (例えば、データグラムソケット、
485 canonical モードの端末) では、
486 読み込み用 / 書き込み用の I/O 空間の末尾を検知する唯一の方法は
488 になるまで read/write を行うことである。
490 ストリーム指向のファイル (例えば、パイプ、FIFO、ストリームソケット) では、
491 読み込み用 / 書き込み用の I/O 空間が使い尽くされた状態は、
492 対象となるファイルディスクリプタから読み込んだデータ量または
493 書き込んだデータ量をチェックすることでも検知できる。
494 例えば、ある特定の量のデータを読み込むために
498 が返したバイト数がそれより少なかった場合、
499 そのファイルディスクリプタの読み込み用 I/O 空間が
502 を使って書き込みをするときも、同じことが言える
503 (監視しているファイルディスクリプタが常にストリーム指向のファイルを
504 参照していることを保証できない場合には、後者の手法の使用を避けること)。
507 .B o 飢餓 (starvation) (エッジトリガ)
510 その I/O 空間のデータを全て処理 (drain) しようとすると、
511 他のファイルが処理されず、飢餓を発生させることがある
516 この問題の解決法は、準備済み状態のリストを管理して、
517 関連する data 構造体の中でファイルディスクリプタが
519 それによって、利用可能なすべてのファイルの中で
520 どのファイルを処理する必要があるかを憶えることができ、
521 しかも順番に処理 (round robin) することができる。
522 既に利用可能であるファイルディスクリプタに対して
523 それ以後に受け取るイベントを無視することもできる。
525 .B o イベントキャッシュを使っている場合
530 から返された全てのファイルディスクリプタを格納している場合、
532 (つまり前のイベントの処理によってマークされる) 方法を提供すべきである。
535 イベント #47 ではある条件でイベント #13 が閉じられると仮定する。
536 イベント #13 の構造体を削除しファイルディスクリプタを
538 すると、イベントキャッシュはそのファイルディスクリプタを待つイベントが
541 この問題を解決する 1 つの方法は、イベント 47 の処理をしている間に、
545 .BR epoll_ctl ( EPOLL_CTL_DEL )
546 を呼び出し、関連付けられた data 構造体を削除済みとマークして、
547 クリーンアップリストにリンクすることである。
548 バッチ処理の中でファイルディスクリプタ 13 についての
550 そのファイルディスクリプタが以前に削除されたものであると分かるので、
554 API は Linux カーネル 2.5.44 に導入された。
555 .\" インタフェースは Linux カーネル 2.5.66 で確定されるべきである。
556 glibc でのサポートはバージョン 2.3.2 で追加された。
560 他のシステムでも同様の機構が提供されている場合がある。
567 .BR epoll_create (2),
568 .BR epoll_create1 (2),