名 前
epoll_ctl − epoll デ ィ ス ク リ プ タ ー の イ ン タ ー フ ェ ー ス を 操 作 す る
書 式
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
説 明
こ の シ ス テ ム コ ー ル は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー epfd が 参 照 す る epoll(7) イ ン ス タ ン ス に 対 す る 操 作 を 行 う 。 対 象 の フ ァ イ ル デ ィ ス ク リ プ タ ー fd に 対 し て 、 操 作 op の 実 行 が 要 求 さ れ る 。
op
引 き 数 に 指 定
で き る 有 効 な
値 は 以 下 の 通
り で あ る 。
EPOLL_CTL_ADD 対 象 の フ
ァ イ ル デ ィ ス
ク リ プ タ ー fd
を フ ァ イ ル デ
ィ ス ク リ プ タ
ー epfd が 参 照 す
る epoll イ ン ス タ
ン ス に 登 録 し
、 イ ベ ン ト event
を fd に 結 び 付
け ら れ た 内 部
フ ァ イ ル に 関
連 付 け る 。
EPOLL_CTL_MOD イ ベ ン ト
event を 対 象 の フ
ァ イ ル デ ィ ス
ク リ プ タ ー fd
に 関 連 付 け る
よ う に 変 更 す
る 。
EPOLL_CTL_DEL 対 象 の フ
ァ イ ル デ ィ ス
ク リ プ タ ー fd
を epfd が 参 照 す
る epoll イ ン ス タ
ン ス か ら 削 除
す る 。 event 引 き
数 は 無 視 さ れ
る の で 、 NULL に す
る こ と も で き
る (但 し 、 下 記
の 「 バ グ 」 を
参 照 )。
event 引 き 数 は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd に リ ン ク さ れ た オ ブ ジ ェ ク ト を 表 す 。 struct epoll_event は 以 下 の よ う に 定 義 さ れ る 。
typedef union
epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64; }
epoll_data_t;
struct
epoll_event {
uint32_t events; /* epoll イ ベ ン
ト */
epoll_data_t data; /* ユ ー ザ ー
デ ー タ 変 数 */ };
events
メ ン バ は 、 以
下 の よ う な 使
用 可 能 な イ ベ
ン ト タ イ プ を
使 っ て 構 成 さ
れ た ビ ッ ト セ
ッ ト で あ る 。
EPOLLIN 関 連 付 け ら
れ た フ ァ イ ル
に 対 し て 、 read(2)
操 作 が 可 能 で
あ る 。
EPOLLOUT 関 連 付 け ら
れ た フ ァ イ ル
に 対 し て 、 write(2)
操 作 が 可 能 で
あ る 。
EPOLLRDHUP"(Linux2.6.17以 降
)" ス ト リ ー ム
ソ ケ ッ ト の 他
端 が 、 コ ネ ク
シ ョ ン の close 、 ま
た は コ ネ ク シ
ョ ン の 書 き 込
み 側 の shutdown を 行
っ た 。 (こ の フ
ラ グ を 使 う と
、 エ ッ ジ ト リ
ガ ー の 監 視 を
行 う 場 合 に 、
通 信 の も う 一
端 が 閉 じ ら れ
た こ と を 検 知
す る コ ー ド を
非 常 に 簡 潔 に
書 く こ と が で
き る 。 )
EPOLLPRI
read(2) 操 作 が 可 能 な 緊 急 (urgent) デ ー タ が あ る 。
EPOLLERR 関
連 付 け ら れ た
フ ァ イ ル デ ィ
ス ク リ プ タ ー
に エ ラ ー 条 件
が 起 こ っ た 。
epoll_wait(2) は 常 に こ
の イ ベ ン ト を
待 つ の で 、 events
に 設 定 す る 必
要 は な い 。
EPOLLHUP 関 連 付 け ら
れ た フ ァ イ ル
デ ィ ス ク リ プ
タ ー に ハ ン グ
ア ッ プ が 起 こ
っ た 。 epoll_wait(2) は
常 に こ の イ ベ
ン ト を 待 つ の
で 、 events に 設 定
す る 必 要 は な
い 。
EPOLLET 関 連 付 け ら
れ た フ ァ イ ル
デ ィ ス ク リ プ
タ ー に エ ッ ジ
ト リ ガ ー 動 作 (Edge
Triggered behavior) を 設 定 す
る 。 epoll の デ フ
ォ ル ト の 動 作
は 、 レ ベ ル ト
リ ガ ー (Level Triggered) で
あ る 。 エ ッ ジ
ト リ ガ ー と レ
ベ ル ト リ ガ ー
に よ る イ ベ ン
ト 分 配 機 構 (event
distribution architectures) に つ い
て の 詳 細 な 情
報 は 、 epoll(7) を 参
照 す る こ と 。
EPOLLONESHOT (Linux 2.6.2 以 降 ) 関
連 付 け ら れ た
フ ァ イ ル デ ィ
ス ク リ プ タ ー
に 一 撃 動 作 (One−Shot
behavior) を 設 定 す る
。 こ れ は イ ベ
ン ト が epoll_wait(2) に
よ っ て 引 き 出
さ れ た 後 、 関
連 付 け ら れ た
フ ァ イ ル デ ィ
ス ク リ プ タ ー
が 内 部 的 に 破
棄 さ れ 、 epoll イ
ン タ ー フ ェ ー
ス に よ っ て イ
ベ ン ト が 報 告
さ れ な く な る
こ と を 意 味 す
る 。 新 し い イ
ベ ン ト マ ス ク
で フ ァ イ ル デ
ィ ス ク リ プ タ
ー を 再 度 有 効
に す る た め に
は 、 epoll_ctl() に
EPOLL_CTL_MOD を 指 定 し
て 呼 び 出 さ な
け れ ば な ら な
い 。 op 引 き 数
に 指 定 で き る
有 効 な 値 は 、
以 下 の 通 り :
EPOLLWAKEUP (Linux 3.5 以 降 )
EPOLLONESHOT と EPOLLET が ク リ ア さ れ て お り 、 プ ロ セ ス が CAP_BLOCK_SUSPEND ケ ー パ ビ リ テ ィ を 持 っ て い る 場 合 、 イ ベ ン ト が 処 理 待 ち か 処 理 中 か に か か わ ら ず 、 必 ず シ ス テ ム が "suspend" や "hibernate" に 入 ら な い よ う に す る こ と 。 epoll_wait(2) の 呼 び 出 し が 返 っ た 時 点 か ら 、 同 じ epoll(7) フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て epoll_wait(2) が 次 に 呼 び 出 さ れ る か 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 閉 じ ら れ る か 、 イ ベ ン ト フ ァ イ ル デ ィ ス ク リ プ タ ー が EPOLL_CTL_DEL で 削 除 さ れ る か 、 EPOLL_CTL_MOD で イ ベ ン ト フ ァ イ ル デ ィ ス ク リ プ タ ー の EPOLLWAKEUP が ク リ ア さ れ る か 、 の い ず れ か に な る ま で 、 イ ベ ン ト は 「 処 理 中 」 で あ る と み な さ れ る 。 「 バ グ 」 の 節 も 参 照 の こ と 。
返 り 値
成 功 し た 場 合 、 epoll_ctl() は 0 を 返 す 。 エ ラ ー が 起 こ っ た 場 合 、 epoll_ctl() は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。
エ ラ ー
EBADF |
epfd か fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 | ||||||
EEXIST |
op が EPOLL_CTL_ADD で あ り 、 か つ 与 え ら れ た フ ァ イ ル デ ィ ス ク リ プ タ ー fd が こ の epoll イ ン ス タ ン ス に 既 に 登 録 さ れ て い る 。 | ||||||
EINVAL |
epfd が epoll フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 ま た は fd が epfd と 同 一 で あ る 。 ま た は 要 求 さ れ た 操 作 op が こ の イ ン タ ー フ ェ ー ス で サ ポ ー ト さ れ て い な い 。 | ||||||
ENOENT |
op が EPOLL_CTL_MOD ま た は EPOLL_CTL_DEL で 、 か つ fd が こ の epoll イ ン ス タ ン ス に 登 録 さ れ て い な い 。
要 求 さ
れ た op 制 御 操
作 を 扱 う の に
十 分 な メ モ リ
ー が な い 。 epoll イ ン ス タ ン ス に 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー を 登 録 (EPOLL_CTL_ADD) し よ う と し た 際 に 、 /proc/sys/fs/epoll/max_user_watches で 決 ま る 上 限 に 達 し た 。 詳 細 は epoll(7) を 参 照 。 対 象 フ ァ イ ル fd が epoll に 対 応 し て い な い 。 こ の エ ラ ー は fd が 例 え ば 通 常 フ ァ イ ル や デ ィ レ ク ト リ を 参 照 し て い る 場 合 に も 起 こ り 得 る 。 バ ー ジ ョ ンepoll_ctl() は カ ー ネ ル 2.6 で 追 加 さ れ た 。 準 拠epoll_ctl() は Linux 独 自 で あ る 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.3.2 以 降 で 提 供 さ れ て い る 。 注 意epoll イ ン タ ー フ ェ ー ス は 、 poll(2) に 対 応 し て い る 全 て の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 応 し て い る 。 バ グLinux 2.6.9 よ り 前 で は 、 EPOLL_CTL_DEL 操 作 の 際 、 引 き 数 event に (た と え 無 視 さ れ る 場 合 で あ っ て も ) NULL で な い ポ イ ン タ ー を 渡 す 必 要 が あ っ た 。 カ ー ネ ル 2.6.9 以 降 で は 、 EPOLL_CTL_DEL を 使 う 際 に event に NULL を 指 定 で き る よ う に な っ て い る 。 2.6.9 よ り 前 の カ ー ネ ル へ の 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 event に NULL で な い ポ イ ン タ ー を 指 定 す べ き で あ る 。 flags に EPOLLWAKEUP が 指 定 さ れ た が 、 呼 び 出 し 元 が CAP_BLOCK_SUSPEND ケ ー パ ビ リ テ ィ を 持 っ て い な い 場 合 、 EPOLLWAKEUP フ ラ グ は 黙 っ て 無 視 さ れ る 。 元 の 実 装 で は flags 引 き 数 に 対 す る 正 当 性 チ ェ ッ ク が 実 行 さ れ て い な い た め 、 こ の 残 念 な 動 作 は 必 要 で あ る 。 ま た 、 呼 び 出 し 元 が CAP_BLOCK_SUSPEND ケ ー パ ビ リ テ ィ を 持 っ て い な か っ た 場 合 に 呼 び 出 し を 失 敗 さ せ る よ う に チ ェ ッ ク を EPOLLWAKEUP に 追 加 す る と 、 少 な く と も ひ と つ は 動 か な く な る 既 存 の ユ ー ザ ー 空 間 ア プ リ ケ ー シ ョ ン が あ っ た 。 そ の ア プ リ ケ ー シ ョ ン は た ま た ま (し か も 意 味 も な く ) こ の ビ ッ ト を 指 定 し て い た 。 し た が っ て 、 信 頼 性 が 求 め ら れ る ア プ リ ケ ー シ ョ ン で は 、 EPOLLWAKEUP フ ラ グ を 使 お う す る 場 合 に は CAP_BLOCK_SUSPEND ケ ー パ ビ リ テ ィ を 持 っ て い る か も 確 認 す る よ う に す べ き で あ る 。 関 連 項 目epoll_create(2), epoll_wait(2), poll(2), epoll(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |