Man page - epoll(7)

Packages contains this manual

Available languages:

en fr ja ru zh_TW zh_CN

Manual

EPOLL

名 前
書 式
説 明
レ ベ ル ト リ ガ ー と エ ッ ジ ト リ ガ ー
autosleep と の 関 係
/proc イ ン タ ー フ ェ ー ス
お す す め な 使 用 例
質 問 と 解 答
あ り が ち な 落 と し 穴 と 回 避 方 法
バ ー ジ ョ ン
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

epoll - I/O イ ベ ン ト 通 知 機 能

書 式

#include <sys/epoll.h>

説 明

epoll API は poll (2) と 同 様 の 処 理 を 行 う 、 つ ま り 、 複 数 の フ ァ イ ル デ ィ ス ク リ プ タ を 監 視 し 、 そ の 中 の い ず れ か が 入 出 力 可 能 な 状 態 で あ る か を 確 認 す る 。 epoll API は 、 エ ッ ジ ト リ ガ ー イ ン タ ー フ ェ ー ス と レ ベ ル ト リ ガ ー イ ン タ ー フ ェ ー ス の い ず れ と し て も 使 用 す る こ と が で き 、 監 視 す る フ ァ イ ル デ ィ ス ク リ プ タ ー の 数 が 多 い 場 合 に も 使 用 で き る 。

The central concept of the epoll API is the epoll instance , an in-kernel data structure which, from a user-space perspective, can be considered as a container for two lists:

The interest list (sometimes also called the epoll set): the set of file descriptors that the process has registered an interest in monitoring.

The ready list: the set of file descriptors that are "ready" for I/O. The ready list is a subset of (or, more precisely, a set of references to) the file descriptors in the interest list. The ready list is dynamically populated by the kernel as a result of I/O activity on those file descriptors.

The following system calls are provided to create and manage an epoll instance:

epoll_create (2) は 新 規 の epoll イ ン ス タ ン ス を 作 成 し 、 そ の イ ン ス タ ン ス を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 返 す 。 (も っ と 新 し い epoll_create1 (2) で は 、 epoll_create (2) の 機 能 が 拡 張 さ れ て い る )。

Interest in particular file descriptors is then registered via epoll_ctl (2), which adds items to the interest list of the epoll instance.

epoll_wait (2) waits for I/O events, blocking the calling thread if no events are currently available. (This system call can be thought of as fetching items from the ready list of the epoll instance.)

レ ベ ル ト リ ガ ー と エ ッ ジ ト リ ガ ー

epoll イ ベ ン ト 配 送 (distribution) イ ン タ ー フ ェ ー ス は 、 エ ッ ジ ト リ ガ ー (ET) と し て も レ ベ ル ト リ ガ ー (LT) と し て も 動 作 さ せ る こ と が で き る 。 二 つ の 配 送 機 構 の 違 い は 、 次 の よ う に 説 明 で き る 。 こ の よ う な シ ナ リ オ が 起 こ っ た と し よ う :

1.

パ イ プ の 読 み 込 み 側 を 表 す フ ァ イ ル デ ィ ス ク リ プ タ ー ( rfd ) が epoll イ ン ス タ ン ス に 登 録 さ れ る 。

2.

パ イ プ へ 書 き 込 む プ ロ グ ラ ム が 2 kB の デ ー タ を パ イ プ の 書 き 込 み 側 へ 書 き 込 む 。

3.

epoll_wait (2) を 呼 び 出 す と 、 読 み 込 み 可 能 (ready) な フ ァ イ ル デ ィ ス ク リ プ タ ー と し て rfd が 返 る 。

4.

パ イ プ か ら 読 み 出 す プ ロ グ ラ ム が 、 1 kB の デ ー タ を rfd か ら 読 み 出 す 。

5.

epoll_wait (2) の 呼 び 出 し が 行 わ れ る 。

rfd フ ァ イ ル デ ィ ス ク リ プ タ ー が EPOLLET フ ラ グ (エ ッ ジ ト リ ガ ー ) を 使 っ て epoll に 追 加 さ れ て い る と 、 利 用 可 能 な デ ー タ が フ ァ イ ル 入 力 バ ッ フ ァ ー に ま だ 存 在 す る に も か か わ ら ず ス テ ッ プ 5 epoll_wait (2) の 呼 び 出 し で ハ ン グ す る 可 能 性 が あ る 。 そ の 一 方 で 、 リ モ ー ト の 接 続 先 (peer) は 既 に 送 ら れ た デ ー タ に 基 づ い て 応 答 を 期 待 し て い る か も し れ な い 。 こ の よ う な こ と が 起 こ る 理 由 は 、 エ ッ ジ ト リ ガ ー イ ベ ン ト 配 送 で は 、 モ ニ タ し て い る フ ァ イ ル で イ ベ ン ト が 起 っ た と き に の み イ ベ ン ト が 配 送 さ れ る た め で あ る 。 し た が っ て 、 ス テ ッ プ 5 で は 、 呼 び 出 し 側 は 結 果 的 に 入 力 バ ッ フ ァ ー 内 に す で 存 在 す る デ ー タ を 待 つ こ と に な る か も し れ な い 。 上 記 の 例 で は 、 2 で 行 わ れ た 書 き 込 み に よ っ て rfd に 関 す る イ ベ ン ト が 生 成 さ れ 、 3 で イ ベ ン ト が 消 費 (consume) さ れ る 。 4 で 行 わ れ る 読 み 込 み 操 作 で は 、 全 部 の バ ッ フ ァ ー デ ー タ を 消 費 し な い の で 、 ス テ ッ プ 5 で 行 わ れ る epoll_wait (2) の 呼 び 出 し が 無 期 限 に 停 止 (block) す る か も し れ な い 。

EPOLLET フ ラ グ を 採 用 す る ア プ リ ケ ー シ ョ ン で は 、 イ ン タ ー フ ェ ー ス は ブ ロ ッ ク し な い (nonblocking) フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 う べ き で あ る 。 こ れ は 、 ブ ロ ッ ク さ れ る 読 み 込 み や 書 き 込 み に よ っ て 、 複 数 の フ ァ イ ル デ ィ ス ク リ プ タ ー を 扱 う タ ス ク が 停 止 し て し ま う の を 避 け る た め で あ る 。 epoll を エ ッ ジ ト リ ガ ー ( EPOLLET ) イ ン タ ー フ ェ ー ス と し て 使 う た め に 提 案 さ れ る 方 法 は 以 下 の 通 り で あ る 。

a)

ブ ロ ッ ク し な い フ ァ イ ル デ ィ ス ク リ プ タ ー と 共 に 使 う 。

b)

read (2) ま た は write (2) が EAGAIN を 返 し た 後 で の み 、 イ ベ ン ト を 待 つ 。

一 方 、 レ ベ ル ト リ ガ ー イ ン タ ー フ ェ ー ス と し て 使 う 場 合
(こ ち ら が デ フ ォ ル ト で あ る 、 EPOLLET が 指 定 さ れ な か っ た 場 合 )、 epoll は 単 に 高 速 な poll (2) で あ り 、 使 い 方 が 同 じ な の で 、 poll (2) が 使 わ れ て い る と こ ろ で は ど こ で も 使 用 す る こ と が で き る 。

エ ッ ジ ト リ ガ ー を 使 っ た 場 合 で も 、 複 数 の デ ー タ を 受 信 す る と 複 数 の epoll イ ベ ン ト が 生 成 さ れ る の で 、 呼 び 出 し 側 に は EPOLLONESHOT フ ラ グ を 指 定 す る オ プ シ ョ ン が あ る 。 こ の フ ラ グ は epoll に 対 し て 、 epoll_wait (2) に よ る イ ベ ン ト を 受 信 し た 後 で 、 関 連 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 無 効 に さ せ る 。 EPOLLONESHOT フ ラ グ が 指 定 さ れ た 場 合 、 epoll_ctl (2) に EPOLL_CTL_MOD を 指 定 し て フ ァ イ ル デ ィ ス ク リ プ タ ー を 再 度 使 用 で き る よ う に す る の は 、 呼 び 出 し 側 の 責 任 で あ る 。

If multiple threads (or processes, if child processes have inherited the epoll file descriptor across fork (2)) are blocked in epoll_wait (2) waiting on the same epoll file descriptor and a file descriptor in the interest list that is marked for edge-triggered ( EPOLLET ) notification becomes ready, just one of the threads (or processes) is awoken from epoll_wait (2). This provides a useful optimization for avoiding "thundering herd" wake-ups in some scenarios.

autosleep と の 関 係

シ ス テ ム が /sys/power/autosleep 経 由 で autosleep モ ー ド に な っ て い て 、 デ バ イ ス を ス リ ー プ 状 態 か ら 起 こ す イ ベ ン ト が 発 生 し た 場 合 、 デ バ イ ス ド ラ イ バ ー は デ バ イ ス を 起 こ し て お く の は そ の イ ベ ン ト が キ ュ ー に 入 る ま で だ け で あ る 。 イ ベ ン ト が 処 理 さ れ る ま で デ バ イ ス を 起 こ し た ま ま に し て お く に は 、 epoll_ctl (2) EPOLLWAKEUP フ ラ グ を 使 う 必 要 が あ る 。

EPOLLWAKEUP フ ラ グ が struct epoll_event events フ ィ ー ル ド で セ ッ ト さ れ た 場 合 、 イ ベ ン ト が キ ュ ー に 入 っ た 瞬 間 か ら 、 epoll_wait (2) が そ の イ ベ ン ト を 返 し 次 の epoll_wait (2) の 呼 び 出 し が 行 わ れ る ま で の 間 、 シ ス テ ム は 起 き た ま ま の 状 態 に な る 。 イ ベ ン ト が 上 記 の 時 間 の 範 囲 を 超 え て シ ス テ ム を 起 き た ま ま の 状 態 に し て お く 必 要 が あ る 場 合 は 、 2 番 目 の epoll_wait (2) の 呼 び 出 し の 前 に 別 の wake_lock を 取 る 必 要 が あ る 。

/proc イ ン タ ー フ ェ ー ス

epoll が 消 費 す る カ ー ネ ル メ モ リ ー の 量 を 制 限 す る た め に 、 以 下 の イ ン タ ー フ ェ ー ス を 使 用 す る こ と が で き る 。
/proc/sys/fs/epoll/max_user_watches
(Linux 2.6.28 以 降 )

こ の フ ァ イ ル は 、 あ る ユ ー ザ ー が シ ス テ ム 上 の 全 て の epoll イ ン ス タ ン ス に 登 録 で き る フ ァ イ ル デ ィ ス ク リ プ タ ー の 総 数 の 上 限 を 規 定 す る 。 こ の 上 限 は 実 ユ ー ザ ー ID 単 位 で あ る 。 登 録 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 1 つ が 消 費 す る メ モ リ ー 量 は 、 32 ビ ッ ト カ ー ネ ル で お よ そ 90 バ イ ト 、 64 ビ ッ ト カ ー ネ ル で お よ そ 160 バ イ ト で あ る 。 現 在 の と こ ろ 、 max_user_watches の デ フ ォ ル ト 値 は 、 利 用 可 能 な メ モ リ ー 下 限 の 1/25 (4%) で あ り 、 登 録 で 消 費 さ れ る メ モ リ ー 量 (バ イ ト 単 位 ) で 割 っ た 値 と な る 。

お す す め な 使 用 例

レ ベ ル ト リ ガ ー イ ン タ ー フ ェ ー ス と し て 使 用 す る と き の epoll の 使 い 方 は poll (2) と 同 じ で あ る 。 し か し エ ッ ジ ト リ ガ ー と し て 使 う 場 合 は 、 ア プ リ ケ ー シ ョ ン の イ ベ ン ト ル ー プ で ス ト ー ル (stall) し な い よ う に 、 使 い 方 を よ り 明 確 に し て お く 必 要 が あ る 。 こ の 例 で は 、 リ ス ナ は ブ ロ ッ ク し な い ソ ケ ッ ト で あ り 、 listen (2) が 呼 ば れ て い る 。 関 数 do_use_fd() は 、 read (2) ま た は write (2) に よ っ て EAGAIN が 返 さ れ る ま で は 、 新 し い 準 備 済 み の フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 う 。 イ ベ ン ト 駆 動 ス テ ー ト マ シ ン ア プ リ ケ ー シ ョ ン は 、 EAGAIN を 受 信 し た 後 、 カ レ ン ト の 状 態 を 記 録 し て お く べ き で あ る 。 こ れ に よ り 、 次 の do_use_fd() 呼 び 出 し の と き に 、 以 前 に 停 止 し た と こ ろ か ら read (2) ま た は write (2) を 継 続 す る こ と が で き る 。

#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;

/* Code to set up listening socket, 'listen_sock',
(socket(), bind(), listen()) omitted */

epollfd = epoll_create1(0);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}

ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}

for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}

for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &addr, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}

エ ッ ジ ト リ ガ ー イ ン タ ー フ ェ ー ス と し て 使 う 場 合 、 性 能 上 の 理 由 に よ り 、 一 度 ( EPOLLIN | EPOLLOUT ) を 指 定 し て か ら ( EPOLL_CTL_ADD で ) フ ァ イ ル デ ィ ス ク リ プ タ ー を epoll イ ン タ ー フ ェ ー ス に 追 加 す る こ と が で き る 。 こ れ に よ り 、 epoll_ctl (2) に EPOLL_CTL_MOD を 指 定 し て 呼 び 出 す こ と で EPOLLIN EPOLLOUT の 連 続 的 な 切 り 替 え が 避 け ら れ る 。

質 問 と 解 答

0.

What is the key used to distinguish the file descriptors registered in an interest list?

キ ー は フ ァ イ ル デ ィ ス ク リ プ タ ー 番 号 と オ ー プ ン フ ァ イ ル 記 述 (open file description) の 組 で あ る (オ ー プ ン フ ァ イ ル 記 述 は "open file handle" と も 呼 ば れ 、 オ ー プ ン さ れ た フ ァ イ ル の カ ー ネ ル の 内 部 表 現 で あ る )。

1.

1 つ の epoll イ ン ス タ ン ス に 同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー を 2 回 登 録 す る と ど う な る か ?

た ぶ ん EEXIST を 受 け 取 る だ ろ う 。 し か し な が ら 、 同 じ epoll イ ン ス タ ン ス に 対 し て 複 製 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー を 追 加 す る こ と は 可 能 で あ る ( dup (2), dup2 (2), fcntl (2) F_DUPFD な ど )。 複 製 し た フ ァ イ ル デ ィ ス ク リ プ タ ー を 異 な る events マ ス ク で 登 録 す れ ば 、 イ ベ ン ト を フ ィ ル タ リ ン グ す る の に こ の 機 能 は 有 用 な 手 法 で あ る 。

2.

2 つ の epoll イ ン ス タ ン ス が 同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー を 待 ち 受 け る こ と は 可 能 か ? も し 可 能 で あ れ ば 、 イ ベ ン ト は 両 方 の epoll フ ァ イ ル デ ィ ス ク リ プ タ ー に 報 告 さ れ る か ?

イ ベ ン ト は 両 方 に 報 告 さ れ る 。 し か し な が ら 、 こ れ を 正 し く 扱 う に は 注 意 深 く プ ロ グ ラ ミ ン グ す る 必 要 が あ る か も し れ な い 。

3.

epoll フ ァ イ ル デ ィ ス ク リ プ タ ー 自 身 は poll/epoll/select が 可 能 か ?

可 能 で あ る 。 epoll フ ァ イ ル デ ィ ス ク リ プ タ ー に 処 理 待 ち の イ ベ ン ト が あ る 場 合 は 、 読 み 出 し 可 能 だ と 通 知 さ れ る こ と だ ろ う 。

4.

epoll フ ァ イ ル デ ィ ス ク リ プ タ ー を 自 身 の フ ァ イ ル デ ィ ス ク リ プ タ ー 集 合 に 入 れ よ う と す る と ど う な る か ?

epoll_ctl (2) の 呼 び 出 し は ( EINVAL で ) 失 敗 す る 。 た だ し epoll フ ァ イ ル デ ィ ス ク リ プ タ ー を 他 の epoll フ ァ イ ル デ ィ ス ク リ プ タ ー 集 合 の 内 部 に 追 加 す る こ と は 可 能 で あ る 。

5.

epoll フ ァ イ ル デ ィ ス ク リ プ タ ー を UNIX ド メ イ ン ソ ケ ッ ト で 他 の プ ロ セ ス に 送 る こ と は 可 能 か ?

Yes, but it does not make sense to do this, since the receiving process would not have copies of the file descriptors in the interest list.

6.

Will closing a file descriptor cause it to be removed from all epoll interest lists?

Yes, but be aware of the following point. A file descriptor is a reference to an open file description (see open (2)). Whenever a file descriptor is duplicated via dup (2), dup2 (2), fcntl (2) F_DUPFD , or fork (2), a new file descriptor referring to the same open file description is created. An open file description continues to exist until all file descriptors referring to it have been closed.

A file descriptor is removed from an interest list only after all the file descriptors referring to the underlying open file description have been closed. This means that even after a file descriptor that is part of an interest list has been closed, events may be reported for that file descriptor if other file descriptors referring to the same underlying file description remain open. To prevent this happening, the file descriptor must be explicitly removed from the interest list (using epoll_ctl (2) EPOLL_CTL_DEL ) before it is duplicated. Alternatively, the application must ensure that all file descriptors are closed (which may be difficult if file descriptors were duplicated behind the scenes by library functions that used dup (2) or fork (2)).

7.

2 つ 以 上 の イ ベ ン ト が epoll_wait (2) コ ー ル の 間 に 発 生 し た 場 合 、 そ れ ら は ま と め て 報 告 さ れ る か 、 そ れ と も 別 々 に 報 告 さ れ る か ?

ま と め て 報 告 さ れ る だ ろ う 。

8.

フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 操 作 は 、 既 に 集 め ら れ て い る が ま だ 報 告 さ れ て い な い イ ベ ン ト に 影 響 す る か ?

既 存 の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 2 つ の 操 作 を 行 う こ と が で き る 。 こ の 場 合 、 削 除 に は 意 味 が な い 。 変 更 す る と 、 使 用 可 能 な I/O が 再 び 読 み 込 ま れ る 。

9.

EPOLLET フ ラ グ (エ ッ ジ ト リ ガ ー 動 作 ) を 使 っ て い る 場 合 、 EAGAIN を 受 け 取 る ま で 、 継 続 し て フ ァ イ ル デ ィ ス ク リ プ タ ー を 読 み 書 き す る 必 要 が あ る か ?

epoll_wait (2) か ら イ ベ ン ト を 受 け 取 る こ と は 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 要 求 さ れ た I/O 操 作 に 対 し て 準 備 済 み で あ る 、 と い う こ と を ユ ー ザ ー に 示 す も の で あ る 。 次 の (ブ ロ ッ ク し な い ) read/write で EAGAIN を 受 け 取 る ま で は フ ァ イ ル デ ィ ス ク リ プ タ ー は 準 備 済 み で あ る と 考 え な け れ ば な ら な い 。 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー を い つ ど の よ う に 使 う か は 、 全 く ユ ー ザ ー に 任 さ れ て る 。

パ ケ ッ ト 指 向 や ト ー ク ン 指 向 の フ ァ イ ル (例 え ば 、 デ ー タ グ ラ ム ソ ケ ッ ト 、 canonical モ ー ド の 端 末 ) で は 、 読 み 込 み 用 / 書 き 込 み 用 の I/O 空 間 の 末 尾 を 検 知 す る 唯 一 の 方 法 は EAGAIN に な る ま で read/write を 行 う こ と で あ る 。

ス ト リ ー ム 指 向 の フ ァ イ ル (例 え ば 、 パ イ プ 、 FIFO、 ス ト リ ー ム ソ ケ ッ ト ) で は 、 読 み 込 み 用 / 書 き 込 み 用 の I/O 空 間 が 使 い 尽 く さ れ た 状 態 は 、 対 象 と な る フ ァ イ ル デ ィ ス ク リ プ タ ー か ら 読 み 込 ん だ デ ー タ 量 ま た は 書 き 込 ん だ デ ー タ 量 を チ ェ ッ ク す る こ と で も 検 知 で き る 。 例 え ば 、 あ る 特 定 の 量 の デ ー タ を 読 み 込 む た め に read (2) を 呼 ん だ と き に 、 read (2) が 返 し た バ イ ト 数 が そ れ よ り 少 な か っ た 場 合 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー の 読 み 込 み 用 I/O 空 間 が 使 い 尽 く さ れ た こ と が 分 か る 。 write (2) を 使 っ て 書 き 込 み を す る と き も 、 同 じ こ と が 言 え る (監 視 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー が 常 に ス ト リ ー ム 指 向 の フ ァ イ ル を 参 照 し て い る こ と を 保 証 で き な い 場 合 に は 、 後 者 の 手 法 の 使 用 を 避 け る こ と )。

あ り が ち な 落 と し 穴 と 回 避 方 法

o 飢 餓 (starvation) (エ ッ ジ ト リ ガ ー )

大 き な I/O 空 間 が あ る 場 合 、 そ の I/O 空 間 の デ ー タ を 全 て 処 理 (drain) し よ う と す る と 、 他 の フ ァ イ ル が 処 理 さ れ ず 、 飢 餓 を 発 生 さ せ る こ と が あ る (こ の 問 題 は epoll に 固 有 の も の で は な い )。

こ の 問 題 の 解 決 法 は 、 準 備 済 み 状 態 の リ ス ト を 管 理 し て 、 関 連 す る data 構 造 体 の 中 で フ ァ イ ル デ ィ ス ク リ プ タ ー が 利 用 可 能 で あ る と マ ー ク す る こ と で あ る 。 そ れ に よ っ て 、 利 用 可 能 な す べ て の フ ァ イ ル の 中 で ど の フ ァ イ ル を 処 理 す る 必 要 が あ る か を 憶 え る こ と が で き 、 し か も 順 番 に 処 理 (round robin) す る こ と が で き る 。 既 に 利 用 可 能 で あ る フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て そ れ 以 後 に 受 け 取 る イ ベ ン ト を 無 視 す る こ と も で き る 。
o イ ベ ン ト キ ャ ッ シ ュ を 使 っ て い る 場 合

イ ベ ン ト キ ャ ッ シ ュ を 使 っ て い る 場 合 、 ま た は epoll_wait (2) か ら 返 さ れ た 全 て の フ ァ イ ル デ ィ ス ク リ プ タ ー を 格 納 し て い る 場 合 、 ク ロ ー ズ さ れ た こ と を 動 的 に マ ー ク す る (つ ま り 前 の イ ベ ン ト の 処 理 に よ っ て マ ー ク さ れ る ) 方 法 を 提 供 す べ き で あ る 。 epoll_wait (2) か ら 100 個 の イ ベ ン ト を 受 け 取 り 、 イ ベ ン ト #47 で は あ る 条 件 で イ ベ ン ト #13 が 閉 じ ら れ る と 仮 定 す る 。 イ ベ ン ト #13 の 構 造 体 を 削 除 し フ ァ イ ル デ ィ ス ク リ プ タ ー を close (2) す る と 、 イ ベ ン ト キ ャ ッ シ ュ は そ の フ ァ イ ル デ ィ ス ク リ プ タ ー を 待 つ イ ベ ン ト が 存 在 す る と い っ て 、 混 乱 が 起 き る 。

こ の 問 題 を 解 決 す る 1 つ の 方 法 は 、 イ ベ ン ト 47 の 処 理 を し て い る 間 に 、 フ ァ イ ル デ ィ ス ク リ プ タ ー 13 を 削 除 し て close (2) す る た め に epoll_ctl ( EPOLL_CTL_DEL ) を 呼 び 出 し 、 関 連 付 け ら れ た data 構 造 体 を 削 除 済 み と マ ー ク し て 、 ク リ ー ン ア ッ プ リ ス ト に リ ン ク す る こ と で あ る 。 バ ッ チ 処 理 の 中 で フ ァ イ ル デ ィ ス ク リ プ タ ー 13 に つ い て の 他 の イ ベ ン ト を 見 つ け た 場 合 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 以 前 に 削 除 さ れ た も の で あ る と 分 か る の で 、 混 乱 は 起 き な い 。

バ ー ジ ョ ン

epoll API は Linux カ ー ネ ル 2.5.44 に 導 入 さ れ た 。 glibc で の サ ポ ー ト は バ ー ジ ョ ン 2.3.2 で 追 加 さ れ た 。

準 拠

epoll API は Linux 固 有 で あ る 。 他 の シ ス テ ム で も 同 様 の 機 構 が 提 供 さ れ て い る 場 合 が あ る 。 例 え ば 、 FreeBSD の kqueue や Solaris の /dev/poll な ど で あ る 。

注 意

The set of file descriptors that is being monitored via an epoll file descriptor can be viewed via the entry for the epoll file descriptor in the process’s /proc/[pid]/fdinfo directory. See proc (5) for further details.

The kcmp (2) KCMP_EPOLL_TFD operation can be used to test whether a file descriptor is present in an epoll instance.

関 連 項 目

epoll_create (2), epoll_create1 (2), epoll_ctl (2), epoll_wait (2), poll (2), select (2)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。