Manpages

名 前

fcntl − フ ァ イ ル デ ィ ス ク リ プ タ ー の 操 作 を 行 う

書 式

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

説 明

fcntl() は 、 オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー fd に 関 し て 下 記 の 操 作 を 行 う 。 操 作 は cmd に よ っ て 決 ま る :

fcntl() は オ プ シ ョ ン と し て 第 三 引 き 数 を と る こ と が で き る 。 第 三 引 き 数 が 必 要 か ど う か は cmd に よ り 決 ま る 。 必 要 な 引 き 数 の 型 は cmd 名 の 後 ろ の 括 弧 内 で 指 定 さ れ て い る (ほ と ん ど の 場 合 、 必 要 な 型 は int で あ り 、 こ の 引 き 数 を 表 す の に arg と い う 名 前 を 使 っ て い る )。 引 き 数 が 必 要 な い 場 合 に は void が 指 定 さ れ て い る 。 下 記 の い く つ か の 操 作 は 特 定 の バ ー ジ ョ ン の Linux カ ー ネ ル で の み サ ポ ー ト さ れ て い る 。 ホ ス ト カ ー ネ ル が 特 定 の 操 作 を サ ポ ー ト し て い る か を 確 認 す る 推 奨 の 方 法 は 、 fcntl() を 所 望 の cmd 値 で 呼 び 出 し 、 EINVAL で 失 敗 す る か を 検 査 す る こ と で あ る 。 EINVAL が 返 っ た 場 合 、 カ ー ネ ル が こ の 値 を 認 識 し て い な い こ と を 示 す 。 フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製
F_DUPFD
(int) 利 用 可 能 な フ ァ イ ル デ ィ ス ク リ プ タ ー の う ち 、 arg 以 上 で 最 小 の も の を 探 し 、 fd の コ ピ ー と す る 。 こ れ は 別 の 形 の dup2(2) で あ る 。 dup2(2) で は 指 定 さ れ た デ ィ ス ク リ プ タ ー が 使 わ れ る 点 が 違 う 。 成 功 す る と 、 新 し い デ ィ ス ク リ プ タ ー が 返 さ れ る 。 詳 細 は dup(2) を 参 照 の こ と 。
F_DUPFD_CLOEXEC
(int; Linux 2.6.24 以 降 )

F_DUPFD と 同 様 だ が 、 そ れ に 加 え て 複 製 さ れ た デ ィ ス ク リ プ タ ー に 対 し て close−on−exec フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ を 指 定 す る こ と で 、 プ ロ グ ラ ム は FD_CLOEXEC フ ラ グ を セ ッ ト す る た め に fcntl() の F_SETFD 操 作 を 追 加 で 行 う 必 要 が な く な る 。 こ の フ ラ グ が な ぜ 有 用 か に つ い て は 、 open(2)O_CLOEXEC の 説 明 を 参 照 の こ と 。 フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ 以 下 の コ マ ン ド を 使 っ て 、 フ ァ イ ル デ ィ ス ク リ プ タ ー に 関 連 す る フ ラ グ を 操 作 す る こ と が で き る 。 現 在 の と こ ろ 、 定 義 さ れ て い る フ ラ グ は 一 つ だ け で あ る : FD_CLOEXEC (close−on−exec フ ラ グ )。 FD_CLOEXEC ビ ッ ト が 0 な ら 、 フ ァ イ ル デ ィ ス ク リ プ タ ー は execve(2) を 行 っ て も オ ー プ ン さ れ た ま ま だ が 、 そ う で な い 場 合 は ク ロ ー ズ さ れ る 。

F_GETFD (void) フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ を 読 み 出 す 。 arg は 無 視 さ れ る 。
F_SETFD
(int) フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ に arg で 指 定 し た 値 を 設 定 す る 。 マ ル チ ス レ ッ ド プ ロ グ ラ ム で は 、 fcntl() の F_SETFD を 使 っ て close−on−exec フ ラ グ を 設 定 す る の と 同 時 に 、 別 の ス レ ッ ド で execve(2)fork(2) を 実 行 す る こ と は 、 競 合 条 件 次 第 で は 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 子 プ ロ セ ス で 実 行 さ れ る プ ロ グ ラ ム に 意 図 せ ず 見 え て し ま う と い う 危 険 性 が あ る 。 詳 細 と こ の 問 題 へ の 対 処 法 に つ い て は open(2)O_CLOEXEC フ ラ グ の 議 論 を 参 照 の こ と 。 フ ァ イ ル 状 態 フ ラ グ オ ー プ ン フ ァ イ ル 記 述 (open file description) に は 、 フ ァ イ ル 記 述 毎 に 設 定 さ れ る 状 態 フ ラ グ が い く つ か あ る 。 こ れ ら の フ ラ グ は open(2) に よ っ て 初 期 化 さ れ 、 fcntl(2) に よ り 変 更 す る こ と も で き る 。 こ れ ら は 、 (dup(2), fcntl(F_DUPFD), fork(2) な ど で ) 複 製 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 同 士 は 同 じ オ ー プ ン フ ァ イ ル 記 述 を 参 照 す る 。 そ の た め 、 同 じ フ ァ イ ル 状 態 フ ラ グ が 共 有 さ れ る 。 フ ァ イ ル 状 態 フ ラ グ と そ の 意 味 は open(2) で 説 明 さ れ て い る 。
F_GETFL
(void) フ ァ イ ル の ア ク セ ス モ ー ド と フ ァ イ ル 状 態 フ ラ グ を 取 得 す る 。 arg は 無 視 さ れ る 。
F_SETFL
(int) フ ァ イ ル 状 態 フ ラ グ に arg で 指 定 さ れ た 値 を 設 定 す る 。 arg の う ち 、 フ ァ イ ル の ア ク セ ス モ ー ド (O_RDONLY, O_WRONLY, O_RDWR) と フ ァ イ ル 作 成 フ ラ グ (す な わ ち O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) に 関 す る ビ ッ ト は 無 視 さ れ る 。 Linux で は 、 こ の コ マ ン ド で 変 更 で き る の は O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, O_NONBLOCK フ ラ グ だ け で あ る 。 フ ラ グ O_DSYNC, O_SYNC を 変 更 す る こ と は で き な い 。 下 記 の 「 バ グ 」 を 参 照 。 ア ド バ イ ザ リ ー レ コ ー ド ロ ッ ク
Linux は 昔 か ら あ る (「 プ ロ セ ス に 関 連 付 け ら れ る 」 ) UNIX の レ コ ー ド ロ ッ ク を 実 装 し て い る 。 こ の レ コ ー ド ロ ッ ク は POSIX で 標 準 化 さ れ て い る 。 Linux 固 有 の よ り 良 い 動 作 を 行 う ロ ッ ク に つ い て は 、 下 記 の オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク の 議 論 を 参 照 の こ と 。

F_SETLK, F_SETLKW, F_GETLK は 、 レ コ ー ド ロ ッ ク の 獲 得 / 解 放 / テ ス ト の た め に 使 用 す る (レ コ ー ド ロ ッ ク は 、 バ イ ト 範 囲 ロ ッ ク 、 フ ァ イ ル セ グ メ ン ト ロ ッ ク 、 フ ァ イ ル 領 域 ロ ッ ク と も 呼 ば れ る )。 三 番 目 の 引 き 数 lock は 、 以 下 に 示 す フ ィ ー ル ド を 含 む 構 造 体 へ の ポ イ ン タ ー で あ る (フ ィ ー ル ド の 順 序 は 関 係 な く 、 構 造 体 に 他 の フ ィ ー ル ド が あ っ て も よ い )。

struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(set by F_GETLK and F_OFD_GETLK) */
... }; こ の 構 造 体 の l_whence, l_start, l_len フ ィ ー ル ド で 、 ロ ッ ク を 行 い た い バ イ ト 範 囲 を 指 定 す る 。 フ ァ イ ル の 末 尾 よ り 後 ろ の バ イ ト を ロ ッ ク す る こ と は で き る が 、 フ ァ イ ル の 先 頭 よ り 前 の バ イ ト を ロ ッ ク す る こ と は で き な い 。

l_start は ロ ッ ク を 行 う 領 域 の 開 始 オ フ セ ッ ト で あ る 。 そ の 意 味 は l_whence に よ り 異 な る : l_whenceSEEK_SET の 場 合 は フ ァ イ ル の 先 頭 か ら の オ フ セ ッ ト 、 l_whenceSEEK_CUR の 場 合 は 現 在 の フ ァ イ ル オ フ セ ッ ト か ら の オ フ セ ッ ト 、 l_whenceSEEK_END の 場 合 は フ ァ イ ル の 末 尾 か ら の オ フ セ ッ ト と 解 釈 さ れ る 。 後 ろ の 2 つ の 場 合 に は 、 フ ァ イ ル の 先 頭 よ り 前 に な ら な い 範 囲 で 、 l_start に 負 の 値 を 指 定 す る こ と が で き る 。

l_len は ロ ッ ク し た い バ イ ト 数 を 示 す 。 l_len が 正 の 場 合 、 ロ ッ ク さ れ る バ イ ト 範 囲 は l_start 以 上 l_start+l_len−1 以 下 と な る 。 l_len に 0 を 指 定 し た 場 合 は 特 別 な 意 味 を 持 つ : l_whence and l_start で 指 定 さ れ る 位 置 か ら フ ァ イ ル の 末 尾 ま で の 全 て の バ イ ト を ロ ッ ク す る (フ ァ イ ル が ど ん な に 大 き く な っ た と し て も フ ァ イ ル の 末 尾 ま で ロ ッ ク す る )。

POSIX.1−2001 で は 、 負 の 値 の l_len を サ ポ ー ト す る 実 装 を 認 め て い る (必 須 で は な い )。 l_len が 負 の 場 合 、 ロ ッ ク さ れ る バ イ ト 範 囲 は l_start+l_len 以 上 l_start−1 以 下 と な る 。 こ の 動 作 は カ ー ネ ル 2.4.21 以 降 お よ び 2.5.49 以 降 の Linux で サ ポ ー ト さ れ て い る 。

l_type フ ィ ー ル ド は 、 フ ァ イ ル に 対 し て 読 み 出 し ロ ッ ク (F_RDLCK) と 書 き 込 み ロ ッ ク (F_WRLCK) の ど ち ら を 設 定 す る か を 指 定 す る 。 フ ァ イ ル の あ る 領 域 に 対 し て 、 読 み 出 し ロ ッ ク (共 有 ロ ッ ク ) を 保 持 で き る プ ロ セ ス 数 に 制 限 は な い が 、 書 き 込 み ロ ッ ク (排 他 ロ ッ ク ) を 保 持 で き る の は 一 つ の プ ロ セ ス だ け で あ る 。 排 他 ロ ッ ク を 設 定 す る と 、 (共 有 ロ ッ ク か 排 他 ロ ッ ク に か か わ ら ず ) 他 の ロ ッ ク は 何 も 設 定 で き な い 。 一 つ の プ ロ セ ス は 、 フ ァ イ ル の あ る 領 域 に 対 し て 一 種 類 の ロ ッ ク し か 保 持 で き な い 。 新 規 の ロ ッ ク が ロ ッ ク が 設 定 さ れ て い る 領 域 に 対 し て 適 用 さ れ る と 、 既 存 の ロ ッ ク は 新 規 の ロ ッ ク の 種 別 に 変 換 さ れ る (新 規 の ロ ッ ク で 指 定 さ れ た バ イ ト 範 囲 が 既 存 ロ ッ ク の 範 囲 と 一 致 す る 場 合 以 外 で は 、 変 換 の 過 程 で 既 存 の ロ ッ ク の 分 割 、 縮 小 、 結 合 が 行 わ れ る こ と が あ る )。
F_SETLK
(struct flock *)

(l_typeF_RDLCKF_WRLCK の 場 合 は ) ロ ッ ク の 獲 得 を 、 (F_UNLCK の 場 合 は ) ロ ッ ク の 解 放 を 、 flock 構 造 体 の フ ィ ー ル ド l_whence, l_start, l_len で 指 定 さ れ た 範 囲 の バ イ ト に 対 し て 行 う 。 指 定 さ れ た ロ ッ ク が 他 の プ ロ セ ス が 設 定 し て い る ロ ッ ク と 衝 突 す る 場 合 は 、 −1 を 返 し 、 errnoEACCESEAGAIN を 設 定 す る 。 (こ の 場 合 に 返 さ れ る エ ラ ー は 実 装 に よ り 異 な る 。 そ の た め 、 POSIX で は 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 こ れ ら の 両 方 の エ ラ ー を チ ェ ッ ク す る こ と が 必 要 と し て い る 。 )

F_SETLKW (struct flock *)

F_SETLK と 同 様 だ が 、 こ ち ら で は そ の フ ァ イ ル に 対 し て 衝 突 す る ロ ッ ク が 適 用 さ れ て い た 場 合 に 、 そ の ロ ッ ク が 解 放 さ れ る の を 待 つ 点 が 異 な る 。 待 っ て い る 間 に シ グ ナ ル を 受 け た 場 合 は 、 シ ス テ ム コ ー ル は 中 断 さ れ 、 (シ グ ナ ル ハ ン ド ラ ー が 戻 っ た 直 後 に ) 返 り 値 −1 を 返 す (ま た errnoEINTR が 設 定 さ れ る ; signal(7) 参 照 )。

F_GETLK (struct flock *) こ の コ ー ル の 呼 び 出 し 時 に は 、 lock に は そ の フ ァ イ ル に 適 用 し よ う と す る ロ ッ ク に 関 す る 情 報 が 入 っ て い る 。 ロ ッ ク を 適 用 で き る 場 合 に は 、 fcntl() は 実 際 に は ロ ッ ク を 行 わ ず 、 構 造 体 lockl_type フ ィ ー ル ド に F_UNLCK を 返 し 、 他 の フ ィ ー ル ド は 変 更 し な い 。 違 う 種 別 の ロ ッ ク が (一 つ も し く は 複 数 ) 適 用 さ れ て い て ロ ッ ク を 適 用 で き な い よ う な 場 合 に は 、 fcntl() は 、 原 因 と な っ た ロ ッ ク の 一 つ に つ い て の 詳 細 を 、 lock の フ ィ ー ル ド l_type, l_whence, l_start, l_len で 返 す 。 衝 突 す る ロ ッ ク が 昔 か ら あ る (プ ロ セ ス に 関 連 付 け ら れ る ) レ コ ー ド ロ ッ ク の 場 合 、 l_pid フ ィ ー ル ド に ロ ッ ク を 保 持 し て い る プ ロ セ ス の PID が 設 定 さ れ る 。 衝 突 す る ロ ッ ク が オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク の 場 合 、 l_pid に −1 が 設 定 さ れ る 。 呼 び 出 し 元 が そ の 内 容 を 参 照 し た 時 点 で は 、 返 さ れ た 情 報 は す で に 古 い も の と な っ て い る 可 能 性 が あ る 点 に 注 意 す る こ と 。 読 み 出 し ロ ッ ク を 適 用 す る に は 、 fd は 読 み 出 し 用 に オ ー プ ン さ れ て い な け れ ば な ら な い 。 書 き 込 み ロ ッ ク を 適 用 す る に は 、 fd は 書 き 込 み 用 に オ ー プ ン さ れ て い な け れ ば な ら な い 。 読 み 書 き 両 方 の ロ ッ ク を 適 用 す る に は 、 読 み 書 き 両 用 で フ ァ イ ル を オ ー プ ン し な け れ ば な ら な い 。

F_SETLKW で ロ ッ ク を 適 用 す る 際 、 カ ー ネ ル は デ ッ ド ロ ッ ク の 検 出 を 行 う 。 2 つ 以 上 の プ ロ セ ス が 、 他 の プ ロ セ ス が 保 持 す る ロ ッ ク に よ り 互 い に ブ ロ ッ ク さ れ る よ う な ロ ッ ク 要 求 を 行 っ て い る か を 検 査 す る 。 例 え ば 、 プ ロ セ ス A が あ る フ ァ イ ル の バ イ ト 100 に 対 し て 書 き 込 み ロ ッ ク を 保 持 し て い て 、 プ ロ セ ス B が バ イ ト 200 に 対 し て 書 き 込 み ロ ッ ク を 保 持 し て い る と す る 。 各 プ ロ セ ス が F_SETLKW を 使 っ て 他 の プ ロ セ ス に よ る す で に ロ ッ ク さ れ て い る バ イ ト を ロ ッ ク し よ う と す る と 、 デ ッ ド ロ ッ ク 検 出 が な い 場 合 、 両 方 の プ ロ セ ス が 無 限 に 停 止 す る こ と に な る 。 カ ー ネ ル は こ の よ う な デ ッ ド ロ ッ ク を 検 出 す る と 、 停 止 し て い た ロ ッ ク 要 求 の 一 つ を エ ラ ー EDEADLK で す ぐ に 失 敗 さ せ る 。 こ の エ ラ ー を 受 け 取 っ た ア プ リ ケ ー シ ョ ン は 、 必 要 な ロ ッ ク を 再 度 獲 得 し よ う と す る 前 に 、 他 の ア プ リ ケ ー シ ョ ン が 実 行 で き る よ う に 自 分 が 保 持 す る ロ ッ ク の い く つ か を 解 放 す る 必 要 が あ る 。 3 つ 以 上 の プ ロ セ ス が 関 連 す る 循 環 す る デ ッ ド ロ ッ ク も 検 出 さ れ る 。 た だ し 、 カ ー ネ ル の デ ッ ド ロ ッ ク 検 出 ア ル ゴ リ ズ ム に は 制 限 が あ る 点 に 注 意 す る こ と 。 「 バ グ 」 を 参 照 。 ろ コ ー ド ロ ッ ク は F_UNLCK で 明 示 的 に 削 除 さ れ る だ け で な く 、 そ の プ ロ セ ス が 終 了 し た 際 に は 自 動 的 に 解 放 さ れ る 。 レ コ ー ド の ロ ッ ク は fork(2) で 作 成 さ れ た 子 プ ロ セ ス に は 継 承 さ れ な い が 、 execve(2) の 前 後 で は 保 存 さ れ る 。

stdio(3) で は バ ッ フ ァ ー リ ン グ が 行 わ れ る の で 、 stdio 関 連 の 関 数 で は レ コ ー ド の ロ ッ ク の 使 用 は 回 避 さ れ る ; 代 わ り に read(2)write(2) を 使 用 す る こ と 。 上 記 で 説 明 し た レ コ ー ド ロ ッ ク は プ ロ セ ス と 関 連 付 け ら れ る (以 下 で 説 明 す る オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク と 異 な る 点 で あ る )。 そ の た め 、 残 念 な が ら 以 下 の よ う な こ と が 起 こ る 。

* プ ロ セ ス が ロ ッ ク が 適 用 さ れ て い る フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー の 「 い ず れ か 」 を ク ロ ー ズ し た 場 合 、 そ の フ ァ イ ル に 対 す る そ の プ ロ セ ス の す べ て の ロ ッ ク が 解 放 さ れ る 。 こ の 動 作 は ま ず い 。 あ る プ ロ セ ス が

/etc/passwd/etc/mtab と い っ た フ ァ イ ル に ロ ッ ク を 適 用 し て い る と き に 、 あ る ラ イ ブ ラ リ 関 数 が 何 か の 理 由 で 同 じ フ ァ イ ル を open, read, close す る と 、 そ の フ ァ イ ル へ の ロ ッ ク が 失 わ れ る こ と に な る 。

*

1 つ の プ ロ セ ス 内 の ス レ ッ ド は ロ ッ ク を 共 有 す る 。 言 い 換 え る と 、 マ ル チ ス レ ッ ド の プ ロ グ ラ ム で 、 レ コ ー ド ロ ッ ク を 使 っ て 、 複 数 の ス レ ッ ド が 同 時 に 1 つ の フ ァ イ ル の 同 じ 領 域 に ア ク セ ス し な い よ う に す る こ と は で き な い と い う こ と だ 。

オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク を 使 う と こ れ ら の 問 題 が 解 決 で き る 。 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク (非 POSIX) オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は バ イ ト 範 囲 に 対 す る ア ド バ イ ザ リ ー ロ ッ ク で 、 ほ と ん ど の 点 で 上 述 の 昔 か ら あ る レ コ ー ド ロ ッ ク と 等 価 で あ る 。 こ の ロ ッ ク 種 別 は Linux 固 有 で あ り 、 Linux 3.15 以 降 で 利 用 で き る 。 オ ー プ ン フ ァ イ ル 記 述 の 説 明 は open(2) を 参 照 。

2 つ の ロ ッ ク 種 別 の 主 な 違 い は 、 昔 か ら あ る レ コ ー ド ロ ッ ク は プ ロ セ ス に 関 連 付 け ら れ る の に 対 し て 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は ロ ッ ク が 獲 得 さ れ る オ ー プ ン フ ァ イ ル 記 述 に 関 連 付 け ら れ る 点 で あ る 。 こ の 動 作 は flock(2) で 獲 得 さ れ る ロ ッ ク に よ く 似 て い る 。 結 果 と し て (昔 か ら あ る ア ド バ イ ザ リ ー レ コ ー ド ロ ッ ク と 違 い )、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は fork(2) (や CLONE_FILES 付 き の clone(2)) の 前 後 で 継 承 さ れ 、 フ ァ イ ル の ク ロ ー ズ 時 に 解 放 さ れ る の で は な く 、 オ ー プ ン フ ァ イ ル 記 述 の 最 後 の ク ロ ー ズ 時 に の み 自 動 的 に 解 放 さ れ る 。 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は 常 に 昔 か ら あ る レ コ ー ド ロ ッ ク と 競 合 す る 。 た と え 、 ロ ッ ク が 同 じ プ ロ セ ス に よ っ て 同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 行 わ れ た と し て も で あ る 。 同 じ オ ー プ ン フ ァ イ ル 記 述 経 由 (同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー 経 由 や fork(2), dup(2), fcntl(2) F_DUPFD な ど で 作 成 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 経 由 ) で 適 用 さ れ た オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は 常 に 互 換 性 が あ る 。 つ ま り 、 す で に ロ ッ ク さ れ て い る 領 域 に 対 し て 新 し い ロ ッ ク が 適 用 さ れ た 場 合 、 既 存 の ロ ッ ク は 新 し い ロ ッ ク 種 別 に 変 換 さ れ る 。 (上 記 で 説 明 し た 通 り 、 こ の よ う な 変 換 の 結 果 、 既 存 の ロ ッ ク の 分 割 、 縮 小 、 結 合 が 行 わ れ る こ と が あ る 。 ) 一 方 、 異 な る オ ー プ ン フ ァ イ ル 記 述 経 由 で 獲 得 さ れ る と 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は 互 い に 競 合 す る 。 し た が っ て 、 マ ル チ ス レ ッ ド プ ロ グ ラ ム の ス レ ッ ド は 、 各 ス レ ッ ド が そ れ ぞ れ 自 分 で open(2) を 実 行 し 、 得 ら れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 経 由 で ロ ッ ク を 適 用 す る こ と で 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク を 使 っ て 一 つ の フ ァ イ ル 領 域 え の ア ク セ ス を 同 期 さ せ る こ と が で き る 。 昔 か ら あ る レ コ ー ド ロ ッ ク の 場 合 と 同 様 、 fcntl() の 第 3 引 き 数 lockflock 構 造 体 へ の ポ イ ン タ ー で あ る 。 昔 か ら あ る レ コ ー ド ロ ッ ク と 違 い 、 下 記 で 説 明 す る コ マ ン ド を 使 う 際 に は 、 こ の 構 造 体 の フ ィ ー ル ド l_pid に 0 を 設 定 し な け れ ば な ら な い 。 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク で 使 用 で き る コ マ ン ド は 、 昔 か ら あ る ロ ッ ク の コ マ ン ド と 同 じ で あ る 。
F_OFD_SETLK
(struct flock *)

(l_typeF_RDLCKF_WRLCK の 場 合 は ) オ ー プ ン フ ァ イ ル 記 述 の ロ ッ ク の 獲 得 を 、 (F_UNLCK の 場 合 は ) オ ー プ ン フ ァ イ ル 記 述 の ロ ッ ク の 解 放 を 、 flock 構 造 体 の フ ィ ー ル ド l_whence, l_start, l_len で 指 定 さ れ た 範 囲 の バ イ ト に 対 し て 行 う 。 指 定 さ れ た ロ ッ ク が 他 の プ ロ セ ス が 設 定 し て い る ロ ッ ク と 衝 突 す る 場 合 は 、 −1 を 返 し 、 errnoEAGAIN を 設 定 す る 。

F_OFD_SETLKW (struct flock *)

F_OFD_SETLK と 同 様 だ が 、 こ ち ら で は そ の フ ァ イ ル に 対 し て 衝 突 す る ロ ッ ク が 適 用 さ れ て い た 場 合 に 、 そ の ロ ッ ク が 解 放 さ れ る の を 待 つ 点 が 異 な る 。 待 っ て い る 間 に シ グ ナ ル を 受 け た 場 合 は 、 シ ス テ ム コ ー ル は 中 断 さ れ 、 (シ グ ナ ル ハ ン ド ラ ー が 戻 っ た 直 後 に ) 返 り 値 −1 を 返 す (ま た errnoEINTR が 設 定 さ れ る ; signal(7) 参 照 )。

F_OFD_GETLK (struct flock *) こ の コ ー ル の 呼 び 出 し 時 に は 、 lock に は そ の フ ァ イ ル に 適 用 し よ う と す る ロ ッ ク に 関 す る 情 報 が 入 っ て い る 。 ロ ッ ク を 適 用 で き る 場 合 に は 、 fcntl() は 実 際 に は ロ ッ ク を 行 わ ず 、 構 造 体 lockl_type フ ィ ー ル ド で F_UNLCK を 返 し 、 他 の フ ィ ー ル ド は 変 更 し な い 。 違 う 種 別 の ロ ッ ク が (一 つ も し く は 複 数 ) 適 用 さ れ て い て ロ ッ ク を 適 用 で き な い よ う な 場 合 に は 、 原 因 と な っ た ロ ッ ク の 一 つ に つ い て の 詳 細 が lock で 返 さ れ る 。 詳 細 は 上 記 の F_GETLK を 参 照 。 現 在 の 実 装 で は 、 オ ー プ ン フ ァ イ ル 記 述 ロ ク で は デ ッ ド ロ ッ ク の 検 出 は 行 わ れ な い 。 (こ れ が プ ロ セ ス と 関 連 付 け ら れ る レ コ ー ド ロ ッ ク と は 異 な る 点 で あ る 。 プ ロ セ ス と 関 連 付 け ら れ る レ コ ー ド ロ ッ ク で は カ ー ネ ル は デ ッ ド ロ ッ ク の 検 出 を 行 う 。 ) 強 制 ロ ッ ク (mandatory locking) 警 告 : Linux の 強 制 ロ ッ ク の 実 装 は 信 頼 性 に 欠 け る も の で あ る 。 下 記 の 「 バ グ 」 の 節 を 参 照 の こ と 。 デ フ ォ ル ト で は 、 昔 か ら あ る (プ ロ セ ス に 関 連 付 け ら れ る ) レ コ ー ド ロ ッ ク も 、 オ ー プ ン フ ァ イ ル 記 述 の ろ コ ー ド ロ ッ ク も 、 ア ド バ イ ザ リ ー ロ ッ ク で あ る 。 ア ド バ イ ザ リ ー ロ ッ ク に 強 制 力 は な く 、 協 調 し て 動 作 す る プ ロ セ ス 間 で の み 有 効 で あ る 。 両 方 の タ イ プ の ロ ッ ク も 強 制 ロ ッ ク に す る こ と も で き る 。 強 制 ロ ッ ク は 全 て の プ ロ セ ス に 対 し て 効 果 が あ る 。 あ る プ ロ セ ス が 互 換 性 の な い 強 制 ロ ッ ク が 適 用 さ れ た フ ァ イ ル 領 域 に 対 し て (read(2) や write(2) に よ り ) 互 換 性 の な い ア ク セ ス を 実 行 し よ う と し た 場 合 、 ア ク セ ス の 結 果 は そ の フ ァ イ ル の オ ー プ ン フ ァ イ ル 記 述 で O_NONBLOCK フ ラ グ が 有 効 に な っ て い る か に よ り 決 ま る 。 O_NONBLOCK フ ラ グ が 有 効 に な っ て い な い と き は 、 ロ ッ ク が 削 除 さ れ る か 、 ロ ッ ク が ア ク セ ス と 互 換 性 の あ る モ ー ド に 変 換 さ れ る ま で 、 シ ス テ ム コ ー ル は 停 止 (block) さ れ る 。 O_NONBLOCK フ ラ グ が 有 効 に な っ て い る と き は 、 シ ス テ ム コ ー ル は エ ラ ー EAGAIN で 失 敗 す る 。 強 制 ロ ッ ク を 使 用 す る た め に は 、 ロ ッ ク 対 象 の フ ァ イ ル が 含 ま れ る フ ァ イ ル シ ス テ ム と 、 ロ ッ ク 対 象 の フ ァ イ ル 自 身 の 両 方 に つ い て 、 強 制 ロ ッ ク が 有 効 に な っ て い な け れ ば な ら な い 。 フ ァ イ ル シ ス テ ム に つ い て 強 制 ロ ッ ク を 有 効 に す る に は 、 mount(8) に "−o mand" オ プ シ ョ ン を 渡 す か 、 mount(2)MS_MANDLOCK フ ラ グ を 指 定 す る 。 フ ァ イ ル に つ い て 強 制 ロ ッ ク を 有 効 に す る に は 、 そ の フ ァ イ ル の グ ル ー プ 実 行 許 可 (group execute permission) を 無 効 と し 、 か つ set−group−ID 許 可 ビ ッ ト を 有 効 に す る (chmod(1) と chmod(2) を 参 照 )。 強 制 ロ ッ ク は POSIX で は 規 定 さ れ て い な い 。 他 の い く つ か の シ ス テ ム で も 強 制 ロ ッ ク は サ ポ ー ト さ れ て い る が 、 強 制 ロ ッ ク を ど の よ う に し て 有 効 に す る か の 詳 細 は シ ス テ ム よ り 異 な る 。 シ グ ナ ル の 管 理
F_GETOWN
, F_SETOWN, F_GETOWN_EX, F_SETOWN_EX, F_GETSIG, F_SETSIG は 、 I/O が 利 用 可 能 に な っ た こ と を 示 す シ グ ナ ル を 管 理 す る た め に 使 用 さ れ る 。
F_GETOWN
(void) フ ァ イ ル デ ィ ス ク リ プ タ ー fd の イ ベ ン ト に 対 す る シ グ ナ ル SIGIO お よ び SIGURG を 受 け て い る プ ロ セ ス の プ ロ セ ス ID か プ ロ セ ス グ ル ー プ を (関 数 の 結 果 と し て ) 返 す 。 プ ロ セ ス ID は 正 の 値 と し て 返 さ れ る 。 プ ロ セ ス グ ル ー プ ID は 負 の 値 と し て 返 さ れ る (下 記 の バ グ の 章 を 参 照 )。 arg は 無 視 さ れ る 。
F_SETOWN
(int) フ ァ イ ル デ ィ ス ク リ プ タ ー fd の イ ベ ン ト 発 生 を 知 ら せ る シ グ ナ ル SIGIOSIGURG を 受 け る プ ロ セ ス の プ ロ セ ス ID ま た は プ ロ セ ス グ ル ー プ ID を arg で 指 定 さ れ た ID に 設 定 す る 。 プ ロ セ ス ID は 正 の 値 と し て 指 定 し 、 プ ロ セ ス グ ル ー プ ID は 負 の 値 と し て 指 定 す る 。 ほ と ん ど の 場 合 、 呼 び 出 し 元 プ ロ セ ス は 所 有 者 と し て 自 分 自 身 を 指 定 す る (つ ま り arggetpid(2) を 指 定 す る )。

fcntl() の F_SETFL コ マ ン ド を 使 用 し て フ ァ イ ル デ ィ ス ク リ プ タ ー に O_ASYNC 状 態 フ ラ グ を 設 定 し た 場 合 に は 、 そ の フ ァ イ ル デ ィ ス ク リ プ タ ー へ の 入 出 力 が 可 能 に な る 度 に SIGIO シ グ ナ ル が 送 ら れ る 。 F_SETSIGSIGIO 以 外 の 別 の シ グ ナ ル の 配 送 を 受 け ら れ る よ う に す る の に も 使 う こ と が で き る 。 許 可 (permission) の チ ェ ッ ク で 失 敗 し た 場 合 に は 、 シ グ ナ ル は 黙 っ て 捨 て ら れ る 。

F_SETOWN に よ り 指 定 さ れ た 所 有 者 の プ ロ セ ス (ま た は プ ロ セ ス グ ル ー プ ) に シ グ ナ ル を 送 る 際 に は 、 kill(2) に 書 か れ て い る の と 同 じ 許 可 の チ ェ ッ ク が 行 わ れ る 。 こ の と き 、 シ グ ナ ル を 送 信 す る プ ロ セ ス は F_SETOWN を 使 っ た プ ロ セ ス で あ る (但 し 、 下 記 の 「 バ グ 」 の 章 を 参 照 の こ と )。 フ ァ イ ル デ ィ ス ク リ プ タ ー が ソ ケ ッ ト を 参 照 し て い る 場 合 は 、 F_SETOWN を 使 用 し て 、 ソ ケ ッ ト に 帯 域 外 (out−of−band) デ ー タ が 届 い た 時 に SIGURG シ グ ナ ル を 配 送 す る 相 手 を 選 択 す る こ と も で き る (SIGURG が 送 ら れ た 場 合 に は select(2) が ソ ケ ッ ト が 「 特 別 な 状 態 」 に あ る と 報 告 す る こ と だ ろ う )。 バ ー ジ ョ ン 2.6.11 以 前 の 2.6.x カ ー ネ ル で は 、 以 下 に 示 す 動 作 で あ っ た 。 ス レ ッ ド グ ル ー プ を サ ポ ー ト し て い る ス レ ッ ド ラ イ ブ ラ リ (例 え ば NPTL) を 使 っ て 動 作 し て い る マ ル チ ス レ ッ ド プ ロ セ ス で F_SETSIG に 0 以 外 の 値 を 指 定 し た 場 合 、 F_SETOWN に 正 の 値 を 渡 す と 、 そ の 意 味 が 違 っ て く る : プ ロ セ ス 全 体 を 示 す プ ロ セ ス ID で は な く 、 プ ロ セ ス 内 の 特 定 の ス レ ッ ド を 示 す ス レ ッ ド ID と 解 釈 さ れ る 。 し た が っ て 、 F_SETSIG を 使 う 場 合 に は 、 き ち ん と 結 果 を 受 け 取 る に は 、 F_SETOWN に 渡 す 値 を getpid(2) で は な く gettid(2) の 返 り 値 に す る 必 要 が あ る だ ろ う 。 (現 状 の Linux ス レ ッ ド 実 装 で は 、 メ イ ン ス レ ッ ド の ス レ ッ ド ID は そ の ス レ ッ ド の プ ロ セ ス ID と 同 じ で あ る 。 つ ま り 、 シ グ ナ ル ス レ ッ ド の プ ロ グ ラ ム で は こ の 場 合 gettid(2)getpid(2) は 全 く 同 じ よ う に 使 う こ と が で き る 。 ) た だ し 、 注 意 す べ き 点 と し て 、 こ の 段 落 で 述 べ た こ と は 、 ソ ケ ッ ト の 帯 域 外 デ ー タ が 届 い た と き に 生 成 さ れ る SIGURG シ グ ナ ル に は あ て は ま ら な い 。 こ の シ グ ナ ル は 常 に プ ロ セ ス か プ ロ セ ス グ ル ー プ に 送 ら れ 、 送 信 先 は F_SETOWN に 渡 さ れ た 値 に し た が っ て 決 め ら れ る 。 上 記 の 動 作 は 、 Linux 2.6.12 で 図 ら ず も 削 除 さ れ 、 元 に 戻 さ れ な い 予 定 で あ る 。 Linux 2.6.32 以 降 で 、 特 定 の ス レ ッ ド 宛 に シ グ ナ ル SIGIOSIGURG を 送 る に は F_SETOWN_EX を 使 う こ と 。

F_GETOWN_EX (struct f_owner_ex *) (Linux 2.6.32 以 降 ) 直 前 の F_SETOWN_EX 操 作 で 定 義 さ れ た 現 在 の フ ァ イ ル デ ィ ス ク リ プ タ ー の 所 有 者 設 定 を 返 す 。 情 報 は arg が 指 す 構 造 体 に 格 納 さ れ て 返 さ れ る 。 構 造 体 は 以 下 の 通 り で あ る 。

struct f_owner_ex {
int type;
pid_t pid; };

type フ ィ ー ル ド は 、 F_OWNER_TID , F_OWNER_PID , F_OWNER_PGRP の い ず れ か 一 つ の 値 と な る 。 pid フ ィ ー ル ド は 、 ス レ ッ ド ID、 プ ロ セ ス ID、 プ ロ セ ス グ ル ー プ ID を 表 す 正 の 整 数 で あ る 。 詳 細 は F_SETOWN_EX を 参 照 。

F_SETOWN_EX (struct f_owner_ex *) (Linux 2.6.32 以 降 ) こ の 操 作 は F_SETOWN と 同 様 の 処 理 を 行 う 。 こ の 操 作 を 使 う と 、 I/O が 利 用 可 能 に な っ た こ と を 示 す シ グ ナ ル を 、 特 定 の ス レ ッ ド 、 プ ロ セ ス 、 プ ロ セ ス グ ル ー プ に 送 る こ と が で き る よ う に な る 。 呼 び 出 し 元 は 、 arg 経 由 で シ グ ナ ル の 配 送 先 を 指 定 す る 。 argf_owner_ex 構 造 体 へ の ポ イ ン タ ー で あ る 。 type フ ィ ー ル ド は 以 下 の い ず れ か の 値 を 取 り 、 こ の 値 に よ り pid が ど の よ う に 解 釈 さ れ る か が 規 定 さ れ る 。

F_OWNER_TID ス レ ッ ド ID が pid で 指 定 さ れ た 値 の ス レ ッ ド に そ の シ グ ナ ル を 送 る (ス レ ッ ド ID は clone(2)gettid(2) の 呼 び 出 し で 返 さ れ る 値 で あ る )。
F_OWNER_PID

ID が pid で 指 定 さ れ た 値 の プ ロ セ ス に そ の シ グ ナ ル を 送 る 。

F_OWNER_PGRP

ID が pid で 指 定 さ れ た 値 の プ ロ セ ス グ ル ー プ に そ の シ グ ナ ル を 送 る 。 (F_SETOWN と 異 な り 、 プ ロ セ ス グ ル ー プ ID に は 正 の 値 を 指 定 す る 点 に 注 意 す る こ と 。 )

F_GETSIG (void) 入 力 や 出 力 が 可 能 に な っ た 場 合 に 送 る シ グ ナ ル を (関 数 の 結 果 と し て ) 返 す 。 値 ゼ ロ は SIGIO を 送 る こ と を 意 味 す る 。 (SIGIO を 含 む ) 他 の 値 は い ず れ も 、 SIGIO の 代 わ り に 送 る シ グ ナ ル 番 号 を 表 す 。 後 者 の 場 合 、 シ グ ナ ル ハ ン ド ラ ー を SA_SIGINFO フ ラ グ 付 き で 設 定 す れ ば 、 ハ ン ド ラ ー で 追 加 の 情 報 を 得 る こ と が で き る 。 arg は 無 視 さ れ る 。
F_SETSIG
(int) 入 力 や 出 力 が 可 能 に な っ た 場 合 に 送 る シ グ ナ ル を arg に 指 定 さ れ た 値 に 設 定 す る 。 値 ゼ ロ は SIGIO を 送 る こ と を 意 味 す る 。 (SIGIO を 含 む ) 他 の 値 は い ず れ も 、 SIGIO の 代 わ り に 送 る シ グ ナ ル 番 号 を 表 す 。 後 者 の 場 合 、 シ グ ナ ル ハ ン ド ラ ー を SA_SIGINFO フ ラ グ 付 き で 設 定 す れ ば 、 ハ ン ド ラ ー で 追 加 の 情 報 を 得 る こ と が で き る 。

F_SETSIG に ゼ ロ 以 外 の 値 を 設 定 し 、 シ グ ナ ル ハ ン ド ラ ー に SA_SIGINFO フ ラ グ を 設 定 す る と 、 (sigaction(2) を 参 照 ) I/O イ ベ ン ト に 関 す る 追 加 の 情 報 が siginfo_t 構 造 体 で シ グ ナ ル ハ ン ド ラ ー へ 渡 さ れ る 。 si_code フ ィ ー ル ド が 示 す シ グ ナ ル の 原 因 が SI_SIGIO で あ る 場 合 、 si_fd フ ィ ー ル ド に は イ ベ ン ト に 対 応 す る フ ァ イ ル デ ィ ス ク リ プ タ ー が 入 っ て い る 。 そ れ 以 外 の 場 合 は 、 ど の フ ァ イ ル デ ィ ス ク リ プ タ ー が 利 用 可 能 か を 示 す 情 報 は な い の で 、 ど の フ ァ イ ル デ ィ ス ク リ プ タ ー で I/O が 可 能 か を 判 断 す る た め に は 通 常 の 機 構 (select(2), poll(2), O_NONBLOCK を 設 定 し た read(2) な ど ) を 使 用 し な け れ ば な ら な い 。 リ ア ル タ イ ム シ グ ナ ル (値 が SIGRTMIN 以 上 ) を 選 択 し て い る 場 合 は 、 同 じ シ グ ナ ル 番 号 を 持 つ 複 数 の I/O イ ベ ン ト が キ ュ ー に 入 る こ と が あ る (キ ュ ー に 入 れ る か ど う か は 利 用 可 能 な メ モ リ ー に 依 存 し て い る )。 上 記 と 同 様 、 SA_SIGINFO が 設 定 さ れ て い る 場 合 、 シ グ ナ ル ハ ン ド ラ ー の た め の 追 加 の 情 報 が 得 ら れ る 。 以 下 の 点 に 注 意 す る こ と 。 Linux で は 一 つ の プ ロ セ ス に 対 し て キ ュ ー に 入 れ ら れ る リ ア ル タ イ ム シ グ ナ ル の 数 に 上 限 が 設 け ら れ て お り (getrlimit(2) と signal(7) を 参 照 )、 こ の 上 限 に 達 す る と カ ー ネ ル は SIGIO シ グ ナ ル を 配 送 す る 。 こ の SIGIO シ グ ナ ル は 、 指 定 さ れ た ス レ ッ ド で は な く プ ロ セ ス 全 体 に 送 ら れ る 。 こ れ ら の 機 構 を 使 用 す る こ と で 、 ほ と ん ど の 場 合 で select(2)poll(2) を 使 用 せ ず に 完 全 な 非 同 期 I/O を 実 装 す る こ と が で き る 。

O_ASYNC の 使 用 方 法 は BSD と Linux に 特 有 で あ る 。 POSIX.1 で 規 定 さ れ て い る F_GETOWNF_SETOWN の 使 用 方 法 は 、 ソ ケ ッ ト に 対 す る SIGURG シ グ ナ ル と の 組 み 合 わ せ だ け で あ る (POSIX は SIGIO シ グ ナ ル は 規 定 し て い な い )。 F_GETOWN_EX, F_SETOWN_EX, F_GETSIG, F_SETSIG は Linux 固 有 で あ る 。 POSIX に は 、 同 様 の こ と を 行 う た め に 、 非 同 期 I/O と aio_sigevent 構 造 体 が あ る 。 Linux で は 、 GNU C ラ イ ブ ラ リ (Glibc) の 一 部 と し て こ れ ら も 利 用 可 能 で あ る 。 リ ー ス (leases)
(Linix 2.4 以 降 で 利 用 可 能 ) F_SETLEASE は 、 fd が 参 照 す る オ ー プ ン フ ァ イ ル 記 述 に 対 し て 新 し い リ ー ス を 設 定 す る の に 使 用 さ れ る 。 F_GETLEASE は 、 fd が 参 照 す る オ ー プ ン フ ァ イ ル 記 述 に 対 し て 設 定 さ れ て い る 現 在 の リ ー ス を 取 得 す る の に 使 用 さ れ る 。 フ ァ イ ル の リ ー ス に よ り 、 あ る プ ロ セ ス ("lease breaker") が そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 参 照 し て い る フ ァ イ ル に 対 し て open(2)truncate(2) を 行 お う と し た 際 に 、 リ ー ス を 保 持 し て い る プ ロ セ ス ("lease holder") へ (シ グ ナ ル の 配 送 に よ る ) 通 知 が 行 わ れ る と い う 機 構 が 提 供 さ れ る 。
F_SETLEASE
(int)

arg の 内 容 に 基 い て フ ァ イ ル の リ ー ス の 設 定 、 削 除 を 行 う 。 整 数 arg に は 以 下 の 値 が 指 定 で き る :
F_RDLCK
読 み 出 し リ ー ス を 取 得 す る 。 こ れ に よ り 、 そ の フ ァ イ ル が 書 き 込 み 用 に オ ー プ ン さ れ た り 、 フ ァ イ ル が 切 り 詰 め ら れ た 場 合 に 、 呼 び 出 し 元 の プ ロ セ ス に 通 知 が 行 わ れ る よ う に な る 。 読 み 出 し リ ー ス を 設 定 で き る の は 、 読 み 出 し 専 用 で オ ー プ ン さ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て の み で あ る 。
F_WRLCK
書 き 込 み リ ー ス を 取 得 す る 。 こ れ に よ り 、 (読 み 出 し 用 か 書 き 込 み 用 に か か わ ら ず ) そ の フ ァ イ ル が オ ー プ ン さ れ た り 、 フ ァ イ ル が 切 り 詰 め ら れ た 場 合 に 、 呼 び 出 し 元 の プ ロ セ ス に 通 知 が 行 わ れ る よ う に な る 。 書 き 込 み リ ー ス は 、 そ の フ ァ イ ル に 対 す る オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー が 他 に な い 場 合 に の み 設 定 で き る 。
F_UNLCK
そ の フ ァ イ ル か ら リ ー ス を 削 除 す る 。 リ ー ス は オ ー プ ン フ ァ イ ル 記 述 に 対 し て 関 連 付 け ら れ る (open(2) 参 照 )。 つ ま り 、 (fork(2) や dup(2) な ど に よ り 作 成 さ れ た ) フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 は 同 じ リ ー ス を 参 照 し 、 複 製 も 含 め た ど の フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 っ て も こ の リ ー ス を 変 更 し た り 解 放 し た り で き る 。 ま た 、 こ れ ら の フ ァ イ ル デ ィ ス ク リ プ タ ー の い ず れ か に 対 し て F_UNLCK 操 作 が 明 示 的 に 実 行 さ れ た 場 合 や 、 す べ て の フ ァ イ ル デ ィ ス ク リ プ タ ー が 閉 じ ら れ た 場 合 に も 、 リ ー ス は 解 放 さ れ る 。 リ ー ス の 取 得 は 通 常 の フ ァ イ ル (regular file) に 対 し て の み 可 能 で あ る 。 非 特 権 プ ロ セ ス が リ ー ス を 取 得 で き る の は 、 UID (所 有 者 ) が プ ロ セ ス の フ ァ イ ル シ ス テ ム UID と 一 致 す る フ ァ イ ル に 対 し て だ け で あ る 。 CAP_LEASE ケ ー パ ビ リ テ ィ を 持 つ プ ロ セ ス は 任 意 の フ ァ イ ル に 対 し て リ ー ス を 取 得 で き る 。

F_GETLEASE (void) フ ァ イ ル デ ィ ス ク リ プ タ ー fd に 対 し て 設 定 さ れ て い る リ ー ス の 種 別 を 取 得 す る 。 F_RDLCK, F_WRLCK, F_UNLCK の い ず れ か が 返 さ れ る 。 F_RDLCK, F_WRLCK は そ れ ぞ れ 、 読 み 出 し リ ー ス 、 書 き 込 み リ ー ス が 設 定 さ れ て い る こ と を 示 し 、 F_UNLCK は リ ー ス が 何 も 設 定 さ れ て い な い こ と を 示 す 。 arg は 無 視 さ れ る 。 あ る プ ロ セ ス ("lease breaker") が F_SETLEASE で 設 定 さ れ た リ ー ス と 矛 盾 す る よ う な open(2)truncate(2) を 実 行 し た 場 合 、 そ の シ ス テ ム コ ー ル は カ ー ネ ル に よ っ て 停 止 さ れ 、 カ ー ネ ル は lease holder に シ グ ナ ル (デ フ ォ ル ト で は SIGIO) を 送 っ て 通 知 を 行 う 。 lease holder は こ の シ グ ナ ル を 受 信 し た と き に は き ち ん と 対 応 す べ き で あ る 。 具 体 的 に は 、 別 の プ ロ セ ス が そ の フ ァ イ ル に ア ク セ ス す る た め の 準 備 と し て 必 要 な 後 片 付 け (例 え ば 、 キ ャ ッ シ ュ さ れ た バ ッ フ ァ ー の フ ラ ッ シ ュ ) を す べ て 行 っ て か ら 、 そ の フ ァ イ ル の リ ー ス の 削 除 ま た は 格 下 げ を 行 う 。 リ ー ス を 削 除 を す る に は 、 argF_UNLCK を 指 定 し て F_SETLEASE を 実 行 す る 。 lease holder が フ ァ イ ル に 書 き 込 み リ ー ス を 保 持 し て い て 、 lease breaker が 読 み 出 し 用 に そ の フ ァ イ ル を オ ー プ ン し て い る 場 合 、 lease holder が 保 持 し て い る リ ー ス を 読 み 出 し リ ー ス に 格 下 げ す れ ば 十 分 で あ る 。 こ れ を す る に は 、 argF_RDLCK を 指 定 し て F_SETLEASE を 実 行 す る 。

If the lease holder fails to downgrade or remove the lease within the number of seconds specified in /proc/sys/fs/lease−break−time, then the kernel forcibly removes or downgrades the lease holder’s lease. い っ た ん lease break が 開 始 さ れ る と 、 lease holder が 自 発 的 に そ の リ ー ス の 格 下 げ か 削 除 を 行 う か 、 lease break timer の 満 了 後 に カ ー ネ ル が 強 制 的 に リ ー ス の 格 下 げ か 削 除 を 行 う ま で 、 F_GETLEASE は 対 象 と な る リ ー ス の 型 を 返 す (リ ー ス の 型 は F_RDLCKF_UNLCK の ど ち ら で あ り 、 lease breaker と 互 換 性 の あ る 型 と な る )。 一 度 リ ー ス の 削 除 か 格 下 げ が 自 発 的 も し く は 強 制 的 に 行 わ れ る と 、 lease breaker が ま だ シ ス テ ム コ ー ル を 再 開 し て い な い 場 合 に は 、 カ ー ネ ル が lease breaker の シ ス テ ム コ ー ル の 続 行 を 許 可 す る 。

lease breaker が 実 行 し た open(2)truncate(2) が 停 止 中 に シ グ ナ ル ハ ン ド ラ ー に よ り 中 断 さ れ た 場 合 、 そ の シ ス テ ム コ ー ル は EINTR エ ラ ー で 失 敗 す る が 、 上 で 述 べ た 他 の 処 理 は そ の ま ま 行 わ れ る 。 open(2)truncate(2) が 停 止 中 に lease breaker が シ グ ナ ル に よ り kill さ れ た 場 合 、 上 で 述 べ た 他 の 処 理 は そ の ま ま 行 わ れ る 。 lease breaker が open(2) を 呼 ぶ 際 に O_NONBLOCK フ ラ グ を 指 定 し た 場 合 、 そ の シ ス テ ム コ ー ル は EWOULDBLOCK エ ラ ー で 直 ち に 失 敗 す る が 、 上 で 述 べ た 他 の 処 理 は そ の ま ま 行 わ れ る 。

lease holder へ の 通 知 に 使 わ れ る デ フ ォ ル ト の シ グ ナ ル は SIGIO だ が 、 fcntl() の F_SETSIG コ マ ン ド で 変 更 す る こ と が で き る 。 F_SETSIG コ マ ン ド が 実 行 さ れ (SIGIO を 指 定 さ れ た 場 合 も 含 む )、 SA_SIGINFO フ ラ グ 付 き で シ グ ナ ル ハ ン ド ラ ー が 設 定 さ れ て い る 場 合 に は 、 ハ ン ド ラ ー の 第 二 引 き 数 と し て siginfo_t 構 造 体 が 渡 さ れ 、 こ の 引 き 数 の si_fd フ ィ ー ル ド に は 別 の プ ロ セ ス が ア ク セ ス し た リ ー ス 設 定 済 み フ ァ イ ル の デ ィ ス ク リ プ タ ー が 入 っ て い る (こ の 機 能 は 複 数 の フ ァ イ ル に 対 し て リ ー ス を 設 定 す る 場 合 に 有 用 で あ る )。 フ ァ イ ル や デ ィ レ ク ト リ の 変 更 の 通 知 (dnotify)
F_NOTIFY
(int)

(Linux 2.4 以 降 ) fd で 参 照 さ れ る デ ィ レ ク ト リ か 、 そ の 中 に あ る フ ァ イ ル に 変 更 が あ っ た 場 合 に 通 知 を 行 う 。 ど の イ ベ ン ト を 通 知 す る か は arg で 指 定 す る 。 arg は ビ ッ ト マ ス ク で 、 以 下 の ビ ッ ト の 0個 以 上 の 論 理 和 を と っ た も の を 指 定 す る 。

DN_ACCESS フ ァ イ ル へ の ア ク セ ス が あ っ た

(read(2), pread(2),

readv(2) や 同 様 の シ ス テ ム コ ー ル )

DN_MODIFY フ ァ イ ル の 内 容 が 変 更 さ れ た

(write(2), pwrite(2),

writev(2), truncate(2), ftruncate(2) や 同 様 の シ ス テ ム コ ー ル )

DN_CREATE フ ァ イ ル が 作 成 さ れ た

(open(2), creat(2), mknod(2),

mkdir(2), " "link(2), symlink(2), こ の デ ィ レ ク ト リ へ の rename(2))

DN_DELETE フ ァ イ ル が 削 除

(unlink) さ れ た (unlink(2), 別 の デ ィ

レ ク ト リ へ の rename(2), rmdir(2))

DN_RENAME デ ィ レ ク ト リ 内 で の フ ァ イ ル 名 の 変 更 が あ っ た

(rename(2))

DN_ATTRIB フ ァ イ ル 属 性 が 変 更 さ れ た

(chown(2), chmod(2),

utime(2), utimensat(2) や 同 様 の シ ス テ ム コ ー ル )

(上 記 の 定 義 を 利 用 す る に は 、 ど の ヘ ッ ダ ー フ ァ イ ル を イ ン ク ル ー ド す る よ り 前 に 、 _GNU_SOURCE 機 能 検 査 マ ク ロ を 定 義 し な け れ ば な ら な い 。 ) デ ィ レ ク ト リ の 変 更 通 知 は 通 常 「 一 回 限 り (one−shot)」 で あ り 、 ア プ リ ケ ー シ ョ ン 側 で そ の 後 さ ら に 通 知 を 受 信 し た い 場 合 は 再 登 録 し な け れ ば な ら な い 。 argDN_MULTISHOT が 含 ま れ て い た 場 合 に は 、 変 更 通 知 は 明 示 的 に 解 除 さ れ る ま で 有 効 状 態 が 継 続 す る 。

F_NOTIFY 要 求 は 積 算 さ れ て い く 。 つ ま り 、 arg で 指 定 さ れ た イ ベ ン ト が す で に モ ニ タ さ れ て い る イ ベ ン ト 集 合 に 加 算 さ れ る 形 に な る 。 す べ て の イ ベ ン ト の 通 知 を 無 効 に す る に は 、 arg に 0 を 指 定 し て F_NOTIFY を 呼 び 出 す 必 要 が あ る 。 通 知 は シ グ ナ ル の 配 送 で 行 わ れ る 。 デ フ ォ ル ト の シ グ ナ ル は SIGIO だ が 、 fcntl() の F_SETSIG コ マ ン ド で 変 更 す る こ と が で き る 。 (SIGIO は キ ュ ー イ ン グ さ れ な い 標 準 の シ グ ナ ル の 一 つ で あ る 点 に 注 意 。 リ ア ル タ イ ム シ グ ナ ル を 使 う よ う に 変 更 す る と 、 複 数 の 通 知 が そ の プ ロ セ ス 宛 の キ ュ ー に 入 る こ と が あ る こ と を 意 味 す る 。 ) 後 者 の 場 合 に は 、 (SA_SIGINFO フ ラ グ 付 き で シ グ ナ ル ハ ン ド ラ ー が 設 定 さ れ て い る 場 合 に は ) ハ ン ド ラ ー の 第 二 引 き 数 と し て siginfo_t 構 造 体 が 渡 さ れ 、 こ の 構 造 体 の si_fd フ ィ ー ル ド に は 通 知 の 行 わ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー が 入 っ て い る (こ の 機 能 は 複 数 の デ ィ レ ク ト リ に 対 し て 通 知 を 設 定 す る 場 合 に 有 用 で あ る )。 特 に DN_MULTISHOT を 使 う 場 合 は 、 通 知 に は リ ア ル タ イ ム シ グ ナ ル を 使 う べ き で あ る 。 そ れ は 、 リ ア ル タ イ ム シ グ ナ ル を 使 う こ と で 、 複 数 の 通 知 を キ ュ ー に 入 れ る こ と が で き る か ら で あ る 。 注 意 : 新 し く ア プ リ ケ ー シ ョ ン を 書 く 際 に は 、 (カ ー ネ ル 2.6.13 以 降 で 利 用 可 能 と な っ た ) inotify イ ン タ ー フ ェ ー ス を 使 用 す べ き で あ る 。 inotify は フ ァ イ ル シ ス テ ム イ ベ ン ト の 通 知 を 取 得 す る た め の ず っ と 優 れ た イ ン タ ー フ ェ ー ス で あ る 。 inotify(7) を 参 照 。 パ イ プ の 容 量 の 変 更

F_SETPIPE_SZ (int; Linux 2.6.35 以 降 )

fd が 参 照 す る パ イ プ の 容 量 を 少 な く と も arg バ イ ト に 変 更 す る 。 非 特 権 プ ロ セ ス は 、 パ イ プ の 容 量 と し て 、 シ ス テ ム の ペ ー ジ サ イ ズ と /proc/sys/fs/pipe−max−size で 定 義 さ れ る 上 限 値 (proc(5) 参 照 ) の 間 の 任 意 の 値 を 設 定 で き る 。 パ イ プ の 容 量 を ペ ー ジ サ イ ズ よ り も 小 さ な 値 に 設 定 し よ う と し た 場 合 は 、 暗 黙 の う ち に ペ ー ジ サ イ ズ に 切 り 上 げ ら れ る 。 非 特 権 プ ロ セ ス が パ イ プ の 容 量 を /proc/sys/fs/pipe−max−size で 定 義 さ れ た 上 限 よ り 大 き な 値 に 設 定 し よ う と し た 場 合 は 、 エ ラ ー EPERM が 発 生 す る 。 特 権 プ ロ セ ス (CAP_SYS_RESOURCE ケ ー パ ビ リ テ ィ を 持 つ プ ロ セ ス ) は こ の 上 限 を 上 書 き で き る 。 パ イ プ に バ ッ フ ァ ー を 割 り 当 て る 場 合 、 実 装 側 の 都 合 に 応 じ て 、 カ ー ネ ル は arg よ り も 大 き な 容 量 を 割 り 当 て て も よ い 。 実 際 に 設 定 さ れ た 大 き さ が 関 数 の 返 り 値 と し て 返 さ れ る 。 パ イ プ の 容 量 を 現 在 デ ー タ を 格 納 す る の に 使 用 さ れ て い る バ ッ フ ァ ー の サ イ ズ よ り も 小 さ く し よ う と し た 場 合 は 、 エ ラ ー EBUSY が 発 生 す る 。

F_GETPIPE_SZ (void; Linux 2.6.35 以 降 )

fd が 参 照 す る パ イ プ の 容 量 を (関 数 の 結 果 と し て ) 返 す 。

File Sealing
file seal は 指 定 さ れ た フ ァ イ ル で 許 可 さ れ る 操 作 の 集 合 を 制 限 す る 。 フ ァ イ ル に 設 定 さ れ る seal 毎 に 対 応 す る 操 作 の 集 合 が 規 定 さ れ て お り 、 そ れ 以 降 の そ の フ ァ イ ル に 対 す る 対 応 す る 操 作 は EPERM で 失 敗 す る 。 こ の よ う な フ ァ イ ル は sealed (seal が 適 用 さ れ て い る ) と 呼 ば れ る 。 デ フ ォ ル ト の seal の 集 合 は 、 適 用 さ れ る フ ァ イ ル や フ ァ イ ル シ ス テ ム に 依 存 す る 。 file seal の 概 要 、 そ の 目 的 、 サ ン プ ル コ ー ド に つ い て は memfd_create(2) を 参 照 。 現 在 の と こ ろ tmpfs フ ァ イ ル シ ス テ ム だ け が sealing を サ ポ ー ト し て い る 。 他 の フ ァ イ ル シ ス テ ム で は 、 seal に 関 連 す る fcntl(2) の 操 作 は す べ て EINVAL を 返 す 。

seal は inode の 属 性 で あ る 。 し た が っ て 、 同 じ inode を 参 照 す る す べ て の オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 同 じ seal の 集 合 を 共 有 す る 。 さ ら に 、 seal は 削 除 す る こ と は で き ず 、 追 加 の み 可 能 で あ る 。
F_ADD_SEALS
(int; Linux 3.17 以 降 ) ビ ッ ト マ ス ク 引 き 数 arg で 指 定 さ れ た seal を 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd が 参 照 す る inode の seal の 集 合 に 追 加 す る 。 一 度 追 加 し た seal を 削 除 す る こ と は で き な い 。 こ の 呼 び 出 し が 成 功 す る と 、 seal は た だ ち に カ ー ネ ル に よ り 適 用 さ れ る 。 現 在 の seal の 集 合 に F_SEAL_SEAL (下 記 参 照 ) が 含 ま れ て い る 場 合 、 こ の 呼 び 出 し は EPERM で 拒 否 さ れ る 。 す で に 設 定 さ れ て い る seal を 追 加 し た 場 合 、 F_SEAL_SEAL が ま だ 設 定 さ れ て い な い 場 合 は no−op (何 も し な い ) と な る 。 seal を 設 定 す る に は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd が 書 き 込 み 可 能 で な け れ ば な ら な い 。
F_GET_SEALS
(void; Linux 3.17 以 降 )

(関 数 の 結 果 と し て ) fd が 参 照 す る inode の seal の 現 在 の 集 合 を 返 す 。 seal が 何 も 設 定 さ れ て い な い 場 合 、 0 が 返 さ れ る 。 フ ァ イ ル が sealing を サ ポ ー ト し て い な い 場 合 、 −1 が 返 さ れ 、 errnoEINVAL が 設 定 さ れ る 。 以 下 の seal が 利 用 で き る 。

F_SEAL_SEAL こ の seal が 設 定 さ れ る と 、 こ れ 以 降 の F_ADD_SEALS を 指 定 し た fcntl(2) の 呼 び 出 し は す べ て EPERM で 失 敗 す る 。 し た が っ て 、 こ の seal を 設 定 す る と seal の 集 合 自 身 の 変 更 を 防 止 で き る 。 フ ァ イ ル の 最 初 の seal の 集 合 に F_SEAL_SEAL が 含 ま れ て い た 場 合 、 結 果 的 に seal の 集 合 が 定 数 に な り ロ ッ ク さ れ る こ と に な る 。
F_SEAL_SHRINK
こ の seal が 設 定 さ れ る と 、 設 定 さ れ た フ ァ イ ル の サ イ ズ を 小 さ く で き な く な る 。 こ の seal は open(2)O_TRUNC フ ラ グ に 影 響 す る 。 truncate(2)ftruncate(2) に つ い て も 同 様 で あ る 。 対 象 の フ ァ イ ル の サ イ ズ を 小 さ く し よ う と し た 場 合 、 こ れ ら の 呼 び 出 し は EPERM で 失 敗 す る 。 フ ァ イ ル サ イ ズ を 増 や す こ と は こ の 場 合 で も 可 能 で あ る 。
F_SEAL_GROW
こ の seal が 設 定 さ れ る と 、 設 定 さ れ た フ ァ イ ル の サ イ ズ を 増 や せ な く な る 。 こ の seal は フ ァ イ ル の 末 尾 を 超 え て の write(2)truncate(2), ftruncate(2), fallocate(2) に 影 響 す る 。 対 象 の フ ァ イ ル の サ イ ズ を 大 き く し よ う と し た 場 合 、 こ れ ら の 呼 び 出 し は EPERM で 失 敗 す る 。 フ ァ イ ル サ イ ズ が 変 わ ら な い 場 合 、 小 さ く な る 場 合 は 、 こ れ ら の 呼 び 出 し は そ の ま ま 動 作 す る 。
F_SEAL_WRITE
こ の seal が 設 定 さ れ て い る と 、 フ ァ イ ル の 内 容 を 変 更 で き な い 。 フ ァ イ ル の サ イ ズ を 縮 小 し た り 伸 張 し た り す る こ と は 可 能 で 許 可 さ れ て い る 。 し た が っ て 、 こ の seal は 通 常 は 他 の seal の い ず れ か と 組 み 合 わ せ て 使 用 さ れ る 。 こ の seal は write(2)fallocate(2) (FALLOC_FL_PUNCH_HOLE フ ラ グ と の 組 み 合 わ せ の 場 合 の み ) に 影 響 す る 。 こ の seal が 設 定 さ れ る と 、 こ れ ら の 呼 び 出 し は EPERM で 失 敗 す る 。 ま た 、 mmap(2) に よ る 新 し い 書 き 込 み 可 能 な 共 有 メ モ リ ー マ ッ ピ ン グ の 作 成 も EPERM で 失 敗 す る 。

fcntl(2)F_ADD_SEALSF_SEAL_WRITE を 設 定 し よ う と し た 場 合 、 書 き 込 み 可 能 な 共 有 マ ッ ピ ン グ が 存 在 す る と EBUSY で 失 敗 す る 。 こ の よ う な マ ッ ピ ン グ は 、 こ の seal を 追 加 す る 前 に ア ン マ ッ プ し な け れ ば な ら な い 。 ま た 、 フ ァ イ ル に 対 し て 処 理 待 ち の 非 同 期 I/O 操 作 (io_submit(2) が あ る 場 合 、 処 理 さ れ て い な い 書 き 込 み は 破 棄 さ れ る 。

返 り 値

成 功 し た 場 合 の 返 り 値 は 操 作 の 種 類 に よ り 違 う :

F_DUPFD 新 し い デ ィ ス ク リ プ タ ー を 返 す 。

F_GETFD フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ の 値

F_GETFL フ ァ イ ル 状 態 フ ラ グ の 値

F_GETLEASE フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て 保 持 さ れ て い る リ ー ス の 種 別 を 返 す 。

F_GETOWN デ ィ ス ク リ プ タ ー の 所 有 者 を 返 す 。

F_GETSIG 読 み 込 み や 書 き 出 し が 可 能 に な っ た 時 に 送 ら れ る シ グ ナ ル の 値 、 も し く は 伝 統 的 な

SIGIO 動 作 の 場 合 に は ゼ ロ を 返 す 。
F_GETPIPE_SZ
, F_SETPIPE_SZ パ イ プ の 容 量 。
F_GET_SEALS

fd が 参 照 す る inode に 設 定 さ れ て い る seal を 示 す ビ ッ ト マ ス ク 。 他 の 全 て の コ マ ン ド
0 を 返 す 。 エ ラ ー の 時 は −1 が 返 さ れ 、 errno に 適 切 な 値 が 設 定 さ れ る 。

エ ラ ー

EACCESEAGAIN 他 の プ ロ セ ス が 保 持 し て い る ロ ッ ク に よ っ て 操 作 が 禁 止 さ れ て い る 。

EAGAIN そ の フ ァ イ ル は 他 の プ ロ セ ス に よ っ て メ モ リ ー マ ッ プ さ れ て い る た め 、 操 作 が 禁 止 さ れ て い る 。

EBADF

fd が オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。

EBADF

cmdF_SETLK ま た は F_SETLKW だ っ た が 、 対 象 の フ ァ イ ル デ ィ ス ク リ プ タ ー の オ ー プ ン モ ー ド が 必 要 と な る ロ ッ ク の 型 に マ ッ チ し て い な い 。

EBUSY

cmdF_SETPIPE_SZ で 、 arg で 指 定 さ れ た パ イ プ の 新 し い 容 量 が パ イ プ が 、 現 在 パ イ プ に あ る デ ー タ を 格 納 す る の に 使 用 さ れ て い る バ ッ フ ァ ー 容 量 よ り も 小 さ い 。

EBUSY

cmdF_ADD_SEALS で 、 argF_SEAL_WRITE が 含 ま れ て お り 、 fd が 参 照 す る フ ァ イ ル に 対 す る 書 き 込 み 可 能 な 共 有 マ ッ ピ ン グ が 存 在 す る 。

EDEADLK 指 定 さ れ た F_SETLKW コ マ ン ド を 実 行 し た 場 合 に は デ ッ ド ロ ッ ク に な る こ と が 検 出 さ れ た 。

EFAULT

lock が 利 用 可 能 な ア ド レ ス 空 間 の 外 部 に あ る 。

EINTR

cmdF_SETLKWF_OFD_SETLKW で 、 操 作 が シ グ ナ ル に よ り 割 り 込 ま れ た 。 signal(7) 参 照 。

EINTR

cmdF_GETLK, F_SETLK, F_OFD_GETLK, F_OFD_SETLK で 、 操 作 が シ グ ナ ル に よ り 割 り 込 ま れ た (signal(7) 参 照 )。 F_GETLKF_SETLK の 場 合 、 ロ ッ ク を 確 認 し た り 取 得 し た り す る 前 に シ グ ナ ル に よ っ て 割 り 込 ま れ た 。 こ れ は た い て い リ モ ー ト の フ ァ イ ル を ロ ッ ク す る 場 合 (例 え ば NFS 上 で ロ ッ ク す る 場 合 ) に 起 こ る 。 し か し ロ ー カ ル で も 起 こ る 場 合 が あ る 。

EINVAL

カ ー ネ ル が 認 識 し な い 値 が cmd で 指 定 さ れ た 。
EINVAL

cmdF_ADD_SEALS で 、 arg に 認 識 で き な い seal を 示 す ビ ッ ト が 含 ま れ て い る 。

EINVAL

cmdF_ADD_SEALSF_GET_SEALS で 、 fd が 参 照 し て い る inode が 格 納 さ れ て い る フ ァ イ ル シ ス テ ム が sealing を サ ポ ー ト し て い な い 。

EINVAL

cmdF_DUPFD で 、 arg が 負 か 、 も し く は 許 さ れ る 最 大 値 よ り も 大 き い (getrlimit(2) の RLIMIT_NOFILE の 議 論 を 参 照 )。

EINVAL

cmdF_SETSIG で 、 arg が 許 可 さ れ た シ グ ナ ル 番 号 で は な い 。

EINVAL

cmdF_OFD_SETLK, F_OFD_SETLKW, F_OFD_GETLK の い ず れ か で 、 l_pid に 0 が 指 定 さ れ な か っ た 。

EMFILE

cmdF_DUPFDで 、 プ ロ セ ス が す で に 最 大 数 ま で フ ァ イ ル デ ィ ス ク リ プ タ ー を オ ー プ ン し て い る 。

ENOLCK

オ ー プ ン さ れ て い る ロ ッ ク の 数 が 多 過 ぎ て 、 ロ ッ ク テ ー ブ ル が い っ ぱ い で あ る 。 ま た は remote locking protocol (例 え ば NFS 上 の ロ ッ ク ) が 失 敗 し た 。

ENOTDIR

F_NOTIFYcmd に 指 定 さ れ た が 、 fd が デ ィ レ ク ト リ を 参 照 し て い な い 。

EPERM 追 加 専 用 属 性 が 設 定 さ れ た フ ァ イ ル の

O_APPEND フ ラ グ を ク リ ア し よ う

と 試 み た 。

EPERM

cmdF_ADD_SEALS だ が 、 fd が 書 き 込 み 用 に オ ー プ ン さ れ て い な い か 、 フ ァ イ ル の 現 在 の seal の 集 合 に す で に F_SEAL_SEAL が 含 ま れ て い る 。

準 拠

SVr4, 4.3BSD, POSIX.1−2001. POSIX.1−2001 で 規 定 さ れ て い る 操 作 は 、 F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK, F_SETLKW だ け で あ る 。

F_GETOWNF_SETOWN は POSIX.1−2001 で 規 定 さ れ て い る 。 (こ れ ら 定 義 す る に は 、 _BSD_SOURCE を 定 義 す る か 、 _XOPEN_SOURCE を 500 以 上 の 値 で 定 義 す る か 、 _POSIX_C_SOURCE を 200809L 以 上 の 値 で 定 義 す る か 、 の い ず れ が 必 要 で あ る 。 )

F_DUPFD_CLOEXEC は POSIX.1−2008 で 規 定 さ れ て い る 。 (こ れ ら 定 義 す る に は 、 _POSIX_C_SOURCE を 200809L 以 上 の 値 で 定 義 す る か 、 _XOPEN_SOURCE を 700 以 上 の 値 で 定 義 す る こ と 。 )

F_GETOWN_EX, F_SETOWN_EX, F_SETPIPE_SZ, F_GETPIPE_SZ, F_GETSIG, F_SETSIG, F_NOTIFY, F_GETLEASE, F_SETLEASE は Linux 固 有 で あ る (こ れ ら の 定 義 を 有 効 に す る に は _GNU_SOURCE マ ク ロ を 定 義 す る こ と )。

F_OFD_SETLK, F_OFD_SETLKW, F_OFD_GETLK は Linux 固 有 だ が (こ れ ら の 定 義 を 得 る に は _GNU_SOURCE を 定 義 し な け れ ば な ら な い )、 POSIX.1 の 次 の バ ー ジ ョ ン に 含 め よ う と い う 活 動 が 進 め ら れ て い る 。

F_ADD_SEALSF_GET_SEALS は Linux 固 有 で あ る 。

注 意

エ ラ ー の 際 の 返 り 値 が dup2(2)F_DUPFD で は 異 な っ て い る 。 フ ァ イ ル ロ ッ ク 元 々 の Linux の fcntl() シ ス テ ム コ ー ル は (flock 構 造 体 で ) 大 き な フ ァ イ ル オ フ セ ッ ト を 扱 え る よ う に 設 計 さ れ て い な か っ た 。 そ の 結 果 、 Linux 2.4 で fcntl64() シ ス テ ム コ ー ル が 追 加 さ れ た 。 こ の 新 し い シ ス テ ム コ ー ル は 、 フ ァ イ ル の ロ ッ ク に flock64 と い う 別 の 構 造 体 を 利 用 し 、 こ れ に 対 応 す る コ マ ン ド と し て F_GETLK64, F_SETLK64, F_SETLKW64 を 使 用 す る 。 し か し 、 glibc を 使 う ア プ リ ケ ー シ ョ ン で は こ れ ら の 詳 細 を 無 視 す る こ と が で き る 。 glibc の fcntl の ラ ッ パ ー 関 数 は 新 し い シ ス テ ム コ ー ル が 利 用 で き る 場 合 は そ れ を 利 用 す る よ う に な っ て い る か ら で あ る 。 エ ラ ー の 際 の 返 り 値 が dup2(2)F_DUPFD で は 異 な っ て い る 。 レ コ ー ド ロ ッ ク カ ー ネ ル 2.0 以 降 で は 、 flock(2)fcntl() が 設 定 す る ロ ッ ク 種 別 の 間 に 相 互 作 用 は な い 。 シ ス テ ム に よ っ て は 、 struct flock に 上 記 以 外 の フ ィ ー ル ド が あ る も の も あ る (例 え ば l_sysid)。 は っ き り と 言 え る こ と は 、 ロ ッ ク を 保 持 し て い る プ ロ セ ス が 別 の マ シ ン に 存 在 す る 場 合 に は 、 l_pid だ け は あ ま り 役 に た た な い だ ろ う と い う こ と で あ る 。 元 々 の Linux の fcntl() シ ス テ ム コ ー ル は (flock 構 造 体 で ) 大 き な フ ァ イ ル オ フ セ ッ ト を 扱 え る よ う に 設 計 さ れ て い な か っ た 。 そ の 結 果 、 Linux 2.4 で fcntl64() シ ス テ ム コ ー ル が 追 加 さ れ た 。 こ の 新 し い シ ス テ ム コ ー ル は 、 フ ァ イ ル の ロ ッ ク に flock64 と い う 別 の 構 造 体 を 利 用 し 、 こ れ に 対 応 す る コ マ ン ド と し て F_GETLK64, F_SETLK64, F_SETLKW64 を 使 用 す る 。 し か し 、 glibc を 使 う ア プ リ ケ ー シ ョ ン で は こ れ ら の 詳 細 を 無 視 す る こ と が で き る 。 glibc の fcntl の ラ ッ パ ー 関 数 は 新 し い シ ス テ ム コ ー ル が 利 用 で き る 場 合 は そ れ を 利 用 す る よ う に な っ て い る か ら で あ る 。 レ コ ー ド ロ ッ ク と NFS

Linux 3.12 よ り 前 で は 、 NFSv4 ク ラ イ ア ン ト が 一 定 時 間 サ ー バ ー と 通 信 が な か っ た 場 合 (90 秒 間 通 信 が な い 場 合 と 定 義 さ れ て い る )、 ク ラ イ ア ン ト が 気 付 か ず に ロ ッ ク を 失 い 再 獲 得 す る 場 合 が あ る 。 (通 信 が な く な っ た み な す 時 間 は NFSv4 leastime と 呼 ば れ る 。 Linux NFS サ ー バ ー で は 、 こ の 値 は /proc/fs/nfsd/nfsv4leasetime を 見 て 決 定 さ れ る 。 こ の フ ァ イ ル の 値 の 単 位 は 秒 で あ り 、 こ の フ ァ イ ル の デ フ ォ ル ト 値 は 90 で あ る 。 ) こ の 状 況 で は 潜 在 的 に デ ー タ 破 壊 が 起 こ る 危 険 性 が あ る 。 通 信 が な か っ た 間 に 他 の プ ロ セ ス が ロ ッ ク を 獲 得 し フ ァ イ ル 入 出 力 を 行 う 場 合 が あ る か ら で あ る 。

Linux 3.12 以 降 、 NFSv4 ク ラ イ ア ン ト が サ ー バ ー と 通 信 が な か っ た 場 合 、 ロ ッ ク を 持 っ て い る と 「 思 っ て い る 」 プ ロ セ ス が そ の フ ァ イ ル に 入 出 力 を 行 う と 失 敗 す る 。 そ の プ ロ セ ス が そ の フ ァ イ ル を い っ た ん ク ロ ー ズ し 再 オ ー プ ン す る ま で は 入 出 力 は 失 敗 す る 。 カ ー ネ ル パ ラ メ ー タ ー nfs.recover_lost_locks を 1 に 設 定 す る と 、 Linux 3.12 よ り 前 の 動 作 に す る こ と が で き る 。 こ の 場 合 、 サ ー バ ー と の 通 信 が 再 確 立 さ れ た 場 合 、 ク ラ イ ア ン ト が は 失 わ れ た ロ ッ ク を 回 復 し よ う と す る 。 デ ー タ 破 壊 が 起 こ る 危 険 性 が あ る た め 、 こ の パ ラ メ ー タ ー は デ フ ォ ル ト で は 0 (無 効 ) に な っ て い る 。

バ グ

F_SETFL
F_SETFL
を 使 っ て 、 フ ラ グ O_DSYNCO_SYNC の 状 態 を 変 更 す る こ と は で き な い 。 こ れ ら の フ ラ グ の 状 態 を 変 更 し よ う と し た 場 合 に は 、 黙 っ て 無 視 さ れ る 。

F_GETOWN い く つ か の ア ー キ テ ク チ ャ ー (特 に i386) に お け る Linux シ ス テ ム コ ー ル の 慣 習 の た め 以 下 の 制 限 が 存 在 す る 。 F_GETOWN が 返 す (負 の ) プ ロ セ ス グ ル ー プ ID が −1 か ら −4095 の 範 囲 に 入 っ た 場 合 、 glibc は こ の 返 り 値 を シ ス テ ム コ ー ル で エ ラ ー が 起 こ っ た と 間 違 っ て 解 釈 し て し ま う 。 つ ま り 、 fcntl() の 返 り 値 は −1 と な り 、 errno に は (正 の ) プ ロ セ ス グ ル ー プ ID が 設 定 さ れ る こ と に な る 。 Linux 固 有 の F_GETOWN_EX で は こ の 問 題 を 回 避 で き る 。 glibc バ ー ジ ョ ン 2.11 以 降 で は 、 glibc で は F_GETOWN_EX を 使 っ て F_GETOWN を 実 装 す る こ と で 、 カ ー ネ ル の F_GETOWN の 問 題 を 見 え な い よ う に し て い る 。

F_SETOWN
Linux 2.4 以 前 で は 、 非 特 権 プ ロ セ ス が F_SETOWN を 使 っ て 、 ソ ケ ッ ト の フ ァ イ ル デ ィ ス ク リ プ タ ー の 所 有 者 に 呼 び 出 し 元 以 外 の プ ロ セ ス (や プ ロ セ ス グ ル ー プ ) を 指 定 す る と 発 生 す る バ グ が あ る 。 こ の 場 合 、 呼 び 出 し 元 が 所 有 者 と し て 指 定 し た プ ロ セ ス (や プ ロ セ ス グ ル ー プ ) に シ グ ナ ル を 送 る 許 可 を 持 っ て い た と し て も 、 fcntl() が −1 を 返 し errnoEPERM を 設 定 す る こ と が あ る 。 こ の エ ラ ー が 返 っ た に も か か わ ら ず 、 フ ァ イ ル デ ィ ス ク リ プ タ ー の 所 有 者 は 設 定 さ れ 、 シ グ ナ ル は そ の 所 有 者 に 送 ら れ る 。 デ ッ ド ロ ッ ク の 検 出
F_SETLKW
要 求 を 処 理 す る 際 に カ ー ネ ル が 使 用 す る デ ッ ド ロ ッ ク 検 出 ア ル ゴ リ ズ ム は 、 false negative に な る 場 合 (デ ッ ド ロ ッ ク を 検 出 で き ず 、 デ ッ ド ロ ッ ク に な っ た プ ロ セ ス は 無 限 に 停 止 す る ) も false positive に な る 場 合 (デ ッ ド ロ ッ ク が な い 場 合 で も EDEADLK エ ラ ー と な る ) も あ る 。 例 え ば 、 カ ー ネ ル は 依 存 関 係 の 検 索 を 行 う ロ ッ ク の 深 さ を 10 ス テ ッ プ に 限 定 し て い る が 、 こ の た め こ れ よ り も 長 い 循 環 す る デ ッ ド ロ ッ ク は 検 出 さ れ な い 。 ま た 、 clone(2)CLONE_FILES フ ラ グ を 使 っ て 作 成 さ れ た 2 つ 以 上 の プ ロ セ ス が (カ ー ネ ル に と っ て ) 衝 突 す る よ う に 見 え る ロ ッ ク を 適 用 し た 場 合 、 カ ー ネ ル は デ ッ ド ロ ッ ク を 誤 っ て 検 出 す る 。 強 制 ロ ッ ク (mandatory locking)
Linux の 強 制 ロ ッ ク の 実 装 は 、 競 合 条 件 下 で 強 制 ロ ッ ク が 不 完 全 に な る よ う な 場 合 が あ る 。 ロ ッ ク と 重 な っ て 実 行 さ れ た write(2) の 呼 び 出 し は 強 制 ロ ッ ク が 獲 得 さ れ た 後 に も デ ー タ を 変 更 す る こ と が で き る 。 ロ ッ ク と 重 な っ て 実 行 さ れ た read(2) の 呼 び 出 し は 強 制 ロ ッ ク が 獲 得 さ れ た 後 に な っ て 行 わ れ た デ ー タ の 変 更 を 検 出 す る こ と が で き る 。 同 様 の 競 合 条 件 が 強 制 ロ ッ ク と mmap(2) の 間 に も 存 在 す る 。 そ れ ゆ え 、 強 制 ロ ッ ク に 頼 る の は お 薦 め で き な い 。

関 連 項 目

dup2(2), flock(2), open(2), socket(2), lockf(3), capabilities(7), feature_test_macros(7)

Linux カ ー ネ ル ソ ー ス の Documentation/filesystems/ デ ィ レ ク ト リ 内 の locks.txt, mandatory−locking.txt, dnotify.txt (以 前 の カ ー ネ ル で は 、 こ れ ら の フ ァ イ ル は Documentation/ デ ィ レ ク ト リ 直 下 に あ り 、 mandatory−locking.txtmandatory.txt と い う 名 前 で あ っ た )

こ の 文 書 に つ い て

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