Man page - fcntl(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

FCNTL

名 前
書 式
説 明
フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製
フ ァ イ ル デ ィ ス ク リ プ タ ー フ ラ グ
フ ァ イ ル 状 態 フ ラ グ
ア ド バ イ ザ リ ー レ コ ー ド ロ ッ ク
オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク (非 POSIX)
強 制 ロ ッ ク (mandatory locking)
Lost locks
シ グ ナ ル の 管 理
リ ー ス (leases)
フ ァ イ ル や デ ィ レ ク ト リ の 変 更 の 通 知 (dnotify)
パ イ プ の 容 量 の 変 更
File Sealing
File read/write hints
返 り 値
エ ラ ー
準 拠
注 意
フ ァ イ ル ロ ッ ク
レ コ ー ド ロ ッ ク
レ コ ー ド ロ ッ ク と NFS
バ グ
F_SETFL
F_GETOWN
F_SETOWN
デ ッ ド ロ ッ ク の 検 出
強 制 ロ ッ ク (mandatory locking)
関 連 項 目
こ の 文 書 に つ い て

名 前

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 )

Duplicate the file descriptor fd using the lowest-numbered available file descriptor greater than or equal to arg . This is different from dup2 (2), which uses exactly the file descriptor specified.

成 功 す る と 、 新 し い フ ァ イ ル デ ィ ス ク リ プ タ ー が 返 さ れ る 。

詳 細 は dup (2) を 参 照 の こ と 。

F_DUPFD_CLOEXEC ( int ; Linux 2.6.24 以 降 )

F_DUPFD と 同 様 だ が 、 そ れ に 加 え て 複 製 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 し て close-on-exec フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ を 指 定 す る こ と で 、 プ ロ グ ラ ム は FD_CLOEXEC フ ラ グ を セ ッ ト す る た め に fcntl () の F_SETFD 操 作 を 追 加 で 行 う 必 要 が な く な る 。 こ の フ ラ グ が な ぜ 有 用 か に つ い て は 、 open (2) の O_CLOEXEC の 説 明 を 参 照 の こ と 。

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

The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC , the close-on-exec flag. If the FD_CLOEXEC bit is set, the file descriptor will automatically be closed during a successful execve (2). (If the execve (2) fails, the file descriptor is left open.) If the FD_CLOEXEC bit is not set, the file descriptor will remain open across an execve (2).
F_GETFD
( void )

Return (as the function result) the file descriptor flags; arg is ignored.

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 )

Return (as the function result) the file access mode and the file status flags; arg is ignored.

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_whence SEEK_SET の 場 合 は フ ァ イ ル の 先 頭 か ら の オ フ セ ッ ト 、 l_whence SEEK_CUR の 場 合 は 現 在 の フ ァ イ ル オ フ セ ッ ト か ら の オ フ セ ッ ト 、 l_whence SEEK_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_type F_RDLCK F_WRLCK の 場 合 は ) ロ ッ ク の 獲 得 を 、 ( F_UNLCK の 場 合 は ) ロ ッ ク の 解 放 を 、 flock 構 造 体 の フ ィ ー ル ド l_whence , l_start , l_len で 指 定 さ れ た 範 囲 の バ イ ト に 対 し て 行 う 。 指 定 さ れ た ロ ッ ク が 他 の プ ロ セ ス が 設 定 し て い る ロ ッ ク と 衝 突 す る 場 合 は 、 -1 を 返 し 、 errno EACCES EAGAIN を 設 定 す る 。 (こ の 場 合 に 返 さ れ る エ ラ ー は 実 装 に よ り 異 な る 。 そ の た め 、 POSIX で は 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 こ れ ら の 両 方 の エ ラ ー を チ ェ ッ ク す る こ と が 必 要 と し て い る 。 )

F_SETLKW ( struct flock * )

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

F_GETLK ( struct flock * )

こ の コ ー ル の 呼 び 出 し 時 に は 、 lock に は そ の フ ァ イ ル に 適 用 し よ う と す る ロ ッ ク に 関 す る 情 報 が 入 っ て い る 。 ロ ッ ク を 適 用 で き る 場 合 に は 、 fcntl () は 実 際 に は ロ ッ ク を 行 わ ず 、 構 造 体 lock l_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)

Open file description locks are advisory byte-range locks whose operation is in most respects identical to the traditional record locks described above. This lock type is Linux-specific, and available since Linux 3.15. (There is a proposal with the Austin Group to include this lock type in the next revision of POSIX.1.) For an explanation of open file descriptions, see open (2).

2 つ の ロ ッ ク 種 別 の 主 な 違 い は 、 昔 か ら あ る レ コ ー ド ロ ッ ク は プ ロ セ ス に 関 連 付 け ら れ る の に 対 し て 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は ロ ッ ク が 獲 得 さ れ る オ ー プ ン フ ァ イ ル 記 述 に 関 連 付 け ら れ る 点 で あ る 。 こ の 動 作 は flock (2) で 獲 得 さ れ る ロ ッ ク に よ く 似 て い る 。 結 果 と し て (昔 か ら あ る ア ド バ イ ザ リ ー レ コ ー ド ロ ッ ク と 違 い )、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は fork (2) (や CLONE_FILES 付 き の clone (2)) の 前 後 で 継 承 さ れ 、 フ ァ イ ル の ク ロ ー ズ 時 に 解 放 さ れ る の で は な く 、 オ ー プ ン フ ァ イ ル 記 述 の 最 後 の ク ロ ー ズ 時 に の み 自 動 的 に 解 放 さ れ る 。

Conflicting lock combinations (i.e., a read lock and a write lock or two write locks) where one lock is an open file description lock and the other is a traditional record lock conflict even when they are acquired by the same process on the same file descriptor.

同 じ オ ー プ ン フ ァ イ ル 記 述 経 由 (同 じ フ ァ イ ル デ ィ ス ク リ プ タ ー 経 由 や fork (2), dup (2), fcntl () F_DUPFD な ど で 作 成 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 経 由 ) で 適 用 さ れ た オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は 常 に 互 換 性 が あ る 。 つ ま り 、 す で に ロ ッ ク さ れ て い る 領 域 に 対 し て 新 し い ロ ッ ク が 適 用 さ れ た 場 合 、 既 存 の ロ ッ ク は 新 し い ロ ッ ク 種 別 に 変 換 さ れ る 。 (上 記 で 説 明 し た 通 り 、 こ の よ う な 変 換 の 結 果 、 既 存 の ロ ッ ク の 分 割 、 縮 小 、 結 合 が 行 わ れ る こ と が あ る 。 )

一 方 、 異 な る オ ー プ ン フ ァ イ ル 記 述 経 由 で 獲 得 さ れ る と 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク は 互 い に 競 合 す る 。 し た が っ て 、 マ ル チ ス レ ッ ド プ ロ グ ラ ム の ス レ ッ ド は 、 各 ス レ ッ ド が そ れ ぞ れ 自 分 で open (2) を 実 行 し 、 得 ら れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 経 由 で ロ ッ ク を 適 用 す る こ と で 、 オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク を 使 っ て 一 つ の フ ァ イ ル 領 域 え の ア ク セ ス を 同 期 さ せ る こ と が で き る 。

昔 か ら あ る レ コ ー ド ロ ッ ク の 場 合 と 同 様 、 fcntl () の 第 3 引 数 lock flock 構 造 体 へ の ポ イ ン タ ー で あ る 。 昔 か ら あ る レ コ ー ド ロ ッ ク と 違 い 、 下 記 で 説 明 す る コ マ ン ド を 使 う 際 に は 、 こ の 構 造 体 の フ ィ ー ル ド l_pid に 0 を 設 定 し な け れ ば な ら な い 。

オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク で 使 用 で き る コ マ ン ド は 、 昔 か ら あ る ロ ッ ク の コ マ ン ド と 同 じ で あ る 。
F_OFD_SETLK
( struct flock * )

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

F_OFD_SETLKW ( struct flock * )

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

F_OFD_GETLK ( struct flock * )

こ の コ ー ル の 呼 び 出 し 時 に は 、 lock に は そ の フ ァ イ ル に 適 用 し よ う と す る ロ ッ ク に 関 す る 情 報 が 入 っ て い る 。 ロ ッ ク を 適 用 で き る 場 合 に は 、 fcntl () は 実 際 に は ロ ッ ク を 行 わ ず 、 構 造 体 lock l_type フ ィ ー ル ド で F_UNLCK を 返 し 、 他 の フ ィ ー ル ド は 変 更 し な い 。 違 う 種 別 の ロ ッ ク が (一 つ も し く は 複 数 ) 適 用 さ れ て い て ロ ッ ク を 適 用 で き な い よ う な 場 合 に は 、 原 因 と な っ た ロ ッ ク の 一 つ に つ い て の 詳 細 が lock で 返 さ れ る 。 詳 細 は 上 記 の F_GETLK を 参 照 。

現 在 の 実 装 で は 、 オ ー プ ン フ ァ イ ル 記 述 ロ ク で は デ ッ ド ロ ッ ク の 検 出 は 行 わ れ な い 。 (こ れ が プ ロ セ ス と 関 連 付 け ら れ る レ コ ー ド ロ ッ ク と は 異 な る 点 で あ る 。 プ ロ セ ス と 関 連 付 け ら れ る レ コ ー ド ロ ッ ク で は カ ー ネ ル は デ ッ ド ロ ッ ク の 検 出 を 行 う 。 )

強 制 ロ ッ ク (mandatory locking)

Warning : the Linux implementation of mandatory locking is unreliable. See BUGS below. Because of these bugs, and the fact that the feature is believed to be little used, since Linux 4.5, mandatory locking has been made an optional feature, governed by a configuration option ( CONFIG_MANDATORY_FILE_LOCKING ). This is an initial step toward removing this feature completely.

デ フ ォ ル ト で は 、 昔 か ら あ る (プ ロ セ ス に 関 連 付 け ら れ る ) レ コ ー ド ロ ッ ク も 、 オ ー プ ン フ ァ イ ル 記 述 の レ コ ー ド ロ ッ ク も 、 ア ド バ イ ザ リ ー ロ ッ ク で あ る 。 ア ド バ イ ザ リ ー ロ ッ ク に 強 制 力 は な く 、 協 調 し て 動 作 す る プ ロ セ ス 間 で の み 有 効 で あ る 。

両 方 の タ イ プ の ロ ッ ク も 強 制 ロ ッ ク に す る こ と も で き る 。 強 制 ロ ッ ク は 全 て の プ ロ セ ス に 対 し て 効 果 が あ る 。 あ る プ ロ セ ス が 互 換 性 の な い 強 制 ロ ッ ク が 適 用 さ れ た フ ァ イ ル 領 域 に 対 し て ( 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 で は 規 定 さ れ て い な い 。 他 の い く つ か の シ ス テ ム で も 強 制 ロ ッ ク は サ ポ ー ト さ れ て い る が 、 強 制 ロ ッ ク を ど の よ う に し て 有 効 に す る か の 詳 細 は シ ス テ ム よ り 異 な る 。

Lost locks

When an advisory lock is obtained on a networked filesystem such as NFS it is possible that the lock might get lost. This may happen due to administrative action on the server, or due to a network partition (i.e., loss of network connectivity with the server) which lasts long enough for the server to assume that the client is no longer functioning.

When the filesystem determines that a lock has been lost, future read (2) or write (2) requests may fail with the error EIO . This error will persist until the lock is removed or the file descriptor is closed. Since Linux 3.12, this happens at least for NFSv4 (including all minor versions).

Some versions of UNIX send a signal ( SIGLOST ) in this circumstance. Linux does not define this signal, and does not provide any asynchronous notification of lost locks.

シ グ ナ ル の 管 理

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 は 正 の 値 と し て 返 さ れ る 。 プ ロ セ ス グ ル ー プ ID は 負 の 値 と し て 返 さ れ る (下 記 の バ グ の 章 を 参 照 )。 arg は 無 視 さ れ る 。

F_SETOWN ( int )

Set the process ID or process group ID that will receive SIGIO and SIGURG signals for events on the file descriptor fd . The target process or process group ID is specified in arg . A process ID is specified as a positive value; a process group ID is specified as a negative value. Most commonly, the calling process specifies itself as the owner (that is, arg is specified as getpid (2)).

As well as setting the file descriptor owner, one must also enable generation of signals on the file descriptor. This is done by using the fcntl () F_SETFL command to set the O_ASYNC file status flag on the file descriptor. Subsequently, a SIGIO signal is sent whenever input or output becomes possible on the file descriptor. The fcntl () F_SETSIG command can be used to obtain delivery of a signal other than SIGIO .

Sending a signal to the owner process (group) specified by F_SETOWN is subject to the same permissions checks as are described for kill (2), where the sending process is the one that employs F_SETOWN (but see BUGS below). If this permission check fails, then the signal is silently discarded. Note : The F_SETOWN operation records the caller’s credentials at the time of the fcntl () call, and it is these saved credentials that are used for the permission checks.

フ ァ イ ル デ ィ ス ク リ プ タ ー が ソ ケ ッ ト を 参 照 し て い る 場 合 は 、 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 以 降 で 、 特 定 の ス レ ッ ド 宛 に シ グ ナ ル SIGIO SIGURG を 送 る に は 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 経 由 で シ グ ナ ル の 配 送 先 を 指 定 す る 。 arg f_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) な ど ) を 使 用 し な け れ ば な ら な い 。

Note that the file descriptor provided in si_fd is the one that was specified during the F_SETSIG operation. This can lead to an unusual corner case. If the file descriptor is duplicated ( dup (2) or similar), and the original file descriptor is closed, then I/O events will continue to be generated, but the si_fd field will contain the number of the now closed file descriptor.

リ ア ル タ イ ム シ グ ナ ル (値 が 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_GETOWN F_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 は こ の シ グ ナ ル を 受 信 し た と き に は き ち ん と 対 応 す べ き で あ る 。 具 体 的 に は 、 別 の プ ロ セ ス が そ の フ ァ イ ル に ア ク セ ス す る た め の 準 備 と し て 必 要 な 後 片 付 け (例 え ば 、 キ ャ ッ シ ュ さ れ た バ ッ フ ァ ー の フ ラ ッ シ ュ ) を す べ て 行 っ て か ら 、 そ の フ ァ イ ル の リ ー ス の 削 除 ま た は 格 下 げ を 行 う 。 リ ー ス を 削 除 を す る に は 、 arg F_UNLCK を 指 定 し て F_SETLEASE を 実 行 す る 。 lease holder が フ ァ イ ル に 書 き 込 み リ ー ス を 保 持 し て い て 、 lease breaker が 読 み 出 し 用 に そ の フ ァ イ ル を オ ー プ ン し て い る 場 合 、 lease holder が 保 持 し て い る リ ー ス を 読 み 出 し リ ー ス に 格 下 げ す れ ば 十 分 で あ る 。 こ れ を す る に は 、 arg F_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_RDLCK F_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)」 で あ り 、 ア プ リ ケ ー シ ョ ン 側 で そ の 後 さ ら に 通 知 を 受 信 し た い 場 合 は 再 登 録 し な け れ ば な ら な い 。 arg DN_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 ケ ー パ ビ リ テ ィ を 持 つ プ ロ セ ス ) は こ の 上 限 を 上 書 き で き る 。

When allocating the buffer for the pipe, the kernel may use a capacity larger than arg , if that is convenient for the implementation. (In the current implementation, the allocation is the next higher power-of-two page-size multiple of the requested size.) The actual capacity (in bytes) that is set is returned as the function result.

パ イ プ の 容 量 を 現 在 デ ー タ を 格 納 す る の に 使 用 さ れ て い る バ ッ フ ァ ー の サ イ ズ よ り も 小 さ く し よ う と し た 場 合 は 、 エ ラ ー EBUSY が 発 生 す る 。

Note that because of the way the pages of the pipe buffer are employed when data is written to the pipe, the number of bytes that can be written may be less than the nominal size, depending on the size of the writes.

F_GETPIPE_SZ ( void ; Linux 2.6.35 以 降 )

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

File Sealing

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

Currently, file seals can be applied only to a file descriptor returned by memfd_create (2) (if the MFD_ALLOW_SEALING was employed). On other filesystems, all fcntl () operations that operate on seals will return 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 が 返 さ れ 、 errno EINVAL が 設 定 さ れ る 。

以 下 の seal が 利 用 で き る 。
F_SEAL_SEAL

こ の seal が 設 定 さ れ る と 、 こ れ 以 降 の F_ADD_SEALS を 指 定 し た fcntl () の 呼 び 出 し は す べ て 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 で 失 敗 す る 。

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

F_SEAL_FUTURE_WRITE (Linux 5.1 以 降 )

The effect of this seal is similar to F_SEAL_WRITE , but the contents of the file can still be modified via shared writable mappings that were created prior to the seal being set. Any attempt to create a new writable mapping on the file via mmap (2) will fail with EPERM . Likewise, an attempt to write to the file via write (2) will fail with EPERM .

Using this seal, one process can create a memory buffer that it can continue to modify while sharing that buffer on a "read-only" basis with other processes.

File read/write hints

Write lifetime hints can be used to inform the kernel about the relative expected lifetime of writes on a given inode or via a particular open file description. (See open (2) for an explanation of open file descriptions.) In this context, the term "write lifetime" means the expected time the data will live on media, before being overwritten or erased.

An application may use the different hint values specified below to separate writes into different write classes, so that multiple users or applications running on a single storage back-end can aggregate their I/O patterns in a consistent manner. However, there are no functional semantics implied by these flags, and different I/O classes can use the write lifetime hints in arbitrary ways, so long as the hints are used consistently.

The following operations can be applied to the file descriptor, fd :
F_GET_RW_HINT
( uint64_t * ; Linux 4.13 以 降 )

Returns the value of the read/write hint associated with the underlying inode referred to by fd .

F_SET_RW_HINT ( uint64_t * ; Linux 4.13 以 降 )

Sets the read/write hint value associated with the underlying inode referred to by fd . This hint persists until either it is explicitly modified or the underlying filesystem is unmounted.

F_GET_FILE_RW_HINT ( uint64_t * ; Linux 4.13 以 降 )

Returns the value of the read/write hint associated with the open file description referred to by fd .

F_SET_FILE_RW_HINT ( uint64_t * ; Linux 4.13 以 降 )

Sets the read/write hint value associated with the open file description referred to by fd .

If an open file description has not been assigned a read/write hint, then it shall use the value assigned to the inode, if any.

The following read/write hints are valid since Linux 4.13:
RWH_WRITE_LIFE_NOT_SET

No specific hint has been set. This is the default value.

RWH_WRITE_LIFE_NONE

No specific write lifetime is associated with this file or inode.

RWH_WRITE_LIFE_SHORT

Data written to this inode or via this open file description is expected to have a short lifetime.

RWH_WRITE_LIFE_MEDIUM

Data written to this inode or via this open file description is expected to have a lifetime longer than data written with RWH_WRITE_LIFE_SHORT .

RWH_WRITE_LIFE_LONG

Data written to this inode or via this open file description is expected to have a lifetime longer than data written with RWH_WRITE_LIFE_MEDIUM .

RWH_WRITE_LIFE_EXTREME

Data written to this inode or via this open file description is expected to have a lifetime longer than data written with RWH_WRITE_LIFE_LONG .

All the write-specific hints are relative to each other, and no individual absolute meaning should be attributed to them.

返 り 値

成 功 し た 場 合 の 返 り 値 は 操 作 の 種 類 に よ り 違 う :
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 に 適 切 な 値 が 設 定 さ れ る 。

エ ラ ー

EACCES EAGAIN

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

EAGAIN

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

EBADF

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

EBADF

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

EBUSY

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

EBUSY

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

EDEADLK

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

EFAULT

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

EINTR

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

EINTR

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

EINVAL

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

EINVAL

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

EINVAL

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

EINVAL

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

EINVAL

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

EINVAL

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

EMFILE

cmd F_DUPFD で 、 オ ー プ ン さ れ て い る フ ァ イ ル デ ィ ス ク リ プ タ ー の 数 が プ ロ セ ス 単 位 の 上 限 に 達 し て い た 。

ENOLCK

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

ENOTDIR

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

EPERM

cmd is F_SETPIPE_SZ and the soft or hard user pipe limit has been reached; see pipe (7).

EPERM

追 加 専 用 属 性 が 設 定 さ れ た フ ァ イ ル の O_APPEND フ ラ グ を ク リ ア し よ う と 試 み た 。

EPERM

cmd F_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_GETOWN F_SETOWN は POSIX.1-2001 で 規 定 さ れ て い る 。 (こ れ ら 定 義 す る に は 、 _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_SEALS F_GET_SEALS は Linux 固 有 で あ る 。

注 意

エ ラ ー の 際 の 返 り 値 が dup2 (2) と F_DUPFD で は 異 な っ て い る 。

フ ァ イ ル ロ ッ ク

元 々 の Linux の fcntl () シ ス テ ム コ ー ル は ( flock 構 造 体 で ) 大 き な フ ァ イ ル オ フ セ ッ ト を 扱 え る よ う に 設 計 さ れ て い な か っ た 。 そ の 結 果 、 Linux 2.4 で fcntl64 () シ ス テ ム コ ー ル が 追 加 さ れ た 。 こ の 新 し い シ ス テ ム コ ー ル は 、 フ ァ イ ル の ロ ッ ク に flock64 と い う 別 の 構 造 体 を 利 用 し 、 こ れ に 対 応 す る コ マ ン ド と し て F_GETLK64 , F_SETLK64 , F_SETLKW64 を 使 用 す る 。 し か し 、 glibc を 使 う ア プ リ ケ ー シ ョ ン で は こ れ ら の 詳 細 を 無 視 す る こ と が で き る 。 glibc の fcntl の ラ ッ パ ー 関 数 は 新 し い シ ス テ ム コ ー ル が 利 用 で き る 場 合 は そ れ を 利 用 す る よ う に な っ て い る か ら で あ る 。

レ コ ー ド ロ ッ ク

カ ー ネ ル 2.0 以 降 で は 、 flock (2) と fcntl () が 設 定 す る ロ ッ ク 種 別 の 間 に 相 互 作 用 は な い 。

Several systems have more fields in struct flock such as, for example, l_sysid (to identify the machine where the lock is held). Clearly, l_pid alone is not going to be very useful if the process holding the lock may live on a different machine; on Linux, while present on some architectures (such as MIPS32), this field is not used.

元 々 の 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_DSYNC O_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 を 返 し errno EPERM を 設 定 す る こ と が あ る 。 こ の エ ラ ー が 返 っ た に も か か わ ら ず 、 フ ァ イ ル デ ィ ス ク リ プ タ ー の 所 有 者 は 設 定 さ れ 、 シ グ ナ ル は そ の 所 有 者 に 送 ら れ る 。

デ ッ ド ロ ッ ク の 検 出

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), lslocks (8)

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

こ の 文 書 に つ い て

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