epoll_wait(2) を
呼 び 出 す と 、
読 み 込 み 可 能
(ready) な フ ァ イ ル
デ ィ ス ク リ プ
タ ー と し て rfd
が 返 る 。
パ イ プ
か ら 読 み 出 す
プ ロ グ ラ ム が
、 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) イ ン タ ー
フ ェ ー ス と し
て 使 う た め に
提 案 さ れ る 方
法 は 以 下 の 通
り で あ る 。
|
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_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_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 を 指 定 し
て 呼 び 出 す こ
と で EPOLLIN と EPOLLOUT
の 連 続 的 な 切
り 替 え が 避 け
ら れ る 。 質 問
と 解 答
|
Q0 |
|
epoll 集 合 内 の
登 録 さ れ た フ
ァ イ ル デ ィ ス
ク リ プ タ ー を
区 別 す る に は
、 何 を キ ー と
し て 使 え ば よ
い か ?
キ ー は
フ ァ イ ル デ ィ
ス ク リ プ タ ー
番 号 と オ ー プ
ン フ ァ イ ル 記
述 (open file description) の 組 で
あ る (オ ー プ ン
フ ァ イ ル 記 述
は "open file handle" と も
呼 ば れ 、 オ ー
プ ン さ れ た フ
ァ イ ル の カ ー
ネ ル の 内 部 表
現 で あ る )。
Q1
1 つ
の epoll イ ン ス タ
ン ス に 同 じ フ
ァ イ ル デ ィ ス
ク リ プ タ ー を 2
回 登 録 す る と
ど う な る か ?
た ぶ ん
EEXIST を 受 け 取 る
だ ろ う 。 し か
し な が ら 、 同
じ epoll イ ン ス タ
ン ス に 対 し て
複 製 さ れ た デ
ィ ス ク リ プ タ
ー を 追 加 す る
こ と は 可 能 で
あ る (dup(2), dup2(2),
fcntl(2) F_DUPFD な ど )。
複 製 し た フ ァ
イ ル デ ィ ス ク
リ プ タ ー を 異
な る events マ ス ク
で 登 録 す れ ば
、 イ ベ ン ト を
フ ィ ル タ リ ン
グ す る の に こ
の 機 能 は 有 用
な 手 法 で あ る
。
Q2
2 つ
の epoll イ ン ス タ
ン ス が 同 じ フ
ァ イ ル デ ィ ス
ク リ プ タ ー を
待 ち 受 け る こ
と は 可 能 か ?
も し 可 能 で あ
れ ば 、 イ ベ ン
ト は 両 方 の epoll
フ ァ イ ル デ ィ
ス ク リ プ タ ー
に 報 告 さ れ る
か ?
A2
イ ベ ン
ト は 両 方 に 報
告 さ れ る 。 し
か し な が ら 、
こ れ を 正 し く
扱 う に は 注 意
深 く プ ロ グ ラ
ミ ン グ す る 必
要 が あ る か も
し れ な い 。
|
|
|
|
|
Q3 |
|
epoll フ ァ イ ル
デ ィ ス ク リ プ
タ ー 自 身 は
poll/epoll/select が 可 能 か
?
可 能 で
あ る 。 epoll フ ァ
イ ル デ ィ ス ク
リ プ タ ー に 処
理 待 ち の イ ベ
ン ト が あ る 場
合 は 、 読 み 出
し 可 能 だ と 通
知 さ れ る こ と
だ ろ う 。
Q4
epoll
フ ァ イ ル デ ィ
ス ク リ プ タ ー
を 自 身 の フ ァ
イ ル デ ィ ス ク
リ プ タ ー 集 合
に 入 れ よ う と
す る と ど う な
る か ?
A4
epoll_ctl(2)
の 呼 び 出 し は
(EINVAL で ) 失 敗 す
る だ ろ う 。 た
だ し epoll フ ァ イ
ル デ ィ ス ク リ
プ タ ー を 他 の
epoll フ ァ イ ル デ
ィ ス ク リ プ タ
ー 集 合 の 内 部
に 追 加 す る こ
と は 可 能 で あ
る 。
Q5
epoll
フ ァ イ ル デ ィ
ス ク リ プ タ ー
を UNIX ド メ イ ン ソ
ケ ッ ト で 他 の
プ ロ セ ス に 送
る こ と は 可 能
か ?
可 能 だ
が 、 こ れ を す
る こ と に 意 味
は な い 。 な ぜ
な ら 、 受 信 側
の プ ロ セ ス が
epoll 集 合 内 の フ
ァ イ ル デ ィ ス
ク リ プ タ ー の
コ ピ ー を 持 っ
て い な い か ら
で あ る 。
フ ァ イ
ル デ ィ ス ク リ
プ タ ー を ク ロ
ー ズ す る と 、
そ の フ ァ イ ル
デ ィ ス ク リ プ
タ ー は 全 て の
epoll 集 合 か ら 自
動 的 に 削 除 さ
れ る か ?
以 下 の
点 に 注 意 が 必
要 で あ る 。 フ
ァ イ ル デ ィ ス
ク リ プ タ ー は
オ ー プ ン フ ァ
イ ル 記 述 (open(2) 参
照 ) へ の 参 照 で
あ る 。 デ ィ ス
ク リ プ タ ー の
複 製 を dup(2), dup2(2),
fcntl(2) の F_DUPFD や
fork(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/ に 書
か れ て い る 。
| | |