Manpages

名 前

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

書 式

#include <sys/epoll.h>

説 明

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

*

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

*

特 定 の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 す る 監 視 内 容 を epoll_ctl(2) で 登 録 す る 。 epoll イ ン ス タ ン ス に 現 在 登 録 さ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー の 集 合 は epoll 集 合 と 呼 ば れ る こ と も あ る 。
*

epoll_wait(2) は I/O イ ベ ン ト を 待 つ 。 現 在 利 用 可 能 な 状 態 の イ ベ ン ト が な け れ ば 、 呼 び 出 し た ス レ ッ ド を 停 止 す る 。

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

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

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

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

ii

read(2) ま た は write(2)EAGAIN を 返 し た 後 で の み 、 イ ベ ン ト を 待 つ 。 一 方 、 レ ベ ル ト リ ガ ー イ ン タ ー フ ェ ー ス と し て 使 う 場 合

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

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

EPOLLWAKEUP フ ラ グ が struct epoll_eventevents フ ィ ー ル ド で セ ッ ト さ れ た 場 合 、 イ ベ ン ト が キ ュ ー に 入 っ た 瞬 間 か ら 、 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_pwait");
exit(EXIT_FAILURE); }

for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &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 を 指 定 し て 呼 び 出 す こ と で EPOLLINEPOLLOUT の 連 続 的 な 切 り 替 え が 避 け ら れ る 。 質 問 と 解 答

Q0

epoll 集 合 内 の 登 録 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー を 区 別 す る に は 、 何 を キ ー と し て 使 え ば よ い か ?

A0

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

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

A1

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

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

A2

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

Q3

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

A3

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

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

A4

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

Q5

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

A5

可 能 だ が 、 こ れ を す る こ と に 意 味 は な い 。 な ぜ な ら 、 受 信 側 の プ ロ セ ス が epoll 集 合 内 の フ ァ イ ル デ ィ ス ク リ プ タ ー の コ ピ ー を 持 っ て い な い か ら で あ る 。

Q6

フ ァ イ ル デ ィ ス ク リ プ タ ー を ク ロ ー ズ す る と 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー は 全 て の epoll 集 合 か ら 自 動 的 に 削 除 さ れ る か ?

A6 削 除 さ れ る が 、

以 下 の 点 に 注 意 が 必 要 で あ る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー は オ ー プ ン フ ァ イ ル 記 述 (open(2) 参 照 ) へ の 参 照 で あ る 。 デ ィ ス ク リ プ タ ー の 複 製 を dup(2), dup2(2), fcntl(2)F_DUPFDfork(2) 経 由 で 行 う 度 に 、 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 新 規 の フ ァ イ ル デ ィ ス ク リ プ タ ー が 生 成 さ れ る 。 オ ー プ ン フ ァ イ ル 記 述 自 体 は 、 自 身 を 参 照 す る 全 て の フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ る ま で 存 在 し 続 け る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー が epoll 集 合 か ら 削 除 さ れ る の は 、 対 応 す る オ ー プ ン フ ァ イ ル 記 述 を 参 照 し て い る 全 て の フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ た 後 で あ る (epoll_ctl(2) EPOLL_CTL_DEL を 使 っ て そ の デ ィ ス ク リ プ タ ー を 明 示 的 に 削 除 し た 場 合 に も 削 除 さ れ る )。 こ の こ と は 、 epoll 集 合 に 属 し て い る あ る フ ァ イ ル デ ィ ス ク リ プ タ ー を ク ロ ー ズ し た 後 で あ っ て も 、 同 じ フ ァ イ ル 記 述 を 参 照 す る 他 の フ ァ イ ル デ ィ ス ク リ プ タ ー が オ ー プ ン さ れ て い る 間 は 、 ク ロ ー ズ し た フ ァ イ ル デ ィ ス ク リ プ タ ー 宛 に イ ベ ン ト が 報 告 さ れ る 可 能 性 が あ る と い う こ と を 意 味 す る 。
Q7

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

A7

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

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

A8 既 存 の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て

2 つ の 操 作 を 行 う こ と が で き る 。 こ の 場 合 、 削 除 に は 意 味 が な い 。 変 更 す る と 、 使 用 可 能 な I/O が 再 び 読 み 込 ま れ る 。

Q9

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

A9

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 な ど で あ る 。

関 連 項 目

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

こ の 文 書 に つ い て

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