Manpages

名 前

flock − オ ー プ ン さ れ た フ ァ イ ル に 対 す る ア ド バ イ ザ リ ロ ッ ク の 適 用 、 解 除 を 行 う

書 式

#include <sys/file.h>

int flock(int fd, int operation);

説 明

オ ー プ ン さ れ た フ ァ イ ル に ア ド バ イ ザ リ ロ ッ ク (advisory lock) の 適 用 や 解 除 を 行 う 。 フ ァ イ ル は fd で 指 定 す る 。 引 き 数 operation に は 以 下 の い ず れ か 一 つ を 指 定 す る :

LOCK_SH 共 有 ロ ッ ク を 適 用 す る 。 指 定 し た フ ァ イ ル に 対 し て 、 一 つ 以 上 の プ ロ セ ス が 同 時 に 共 有 ロ ッ ク を 保 持 す る こ と が で き る 。

LOCK_EX 排 他 ロ ッ ク を 適 用 す る 。 指 定 し た フ ァ イ ル に 対 し て 、 た だ 一 つ の プ ロ セ ス だ け が 同 時 に 排 他 ロ ッ ク を 保 持 す る こ と が で き る 。

LOCK_UN こ の プ ロ セ ス が 保 持 し て い る 既 存 の ロ ッ ク を 解 除 す る 。

flock() を 呼 び 出 し た と き に 、 指 定 し た ロ ッ ク 種 別 と 異 な る ロ ッ ク が 別 プ ロ セ ス に よ っ て 保 持 さ れ て い る と 、 flock() は 停 止 (block) さ れ る こ と が あ る 。 非 停 止 (nonblocking) タ イ プ の 要 求 を 行 う た め に は 、 上 記 の 操 作 (operation) に LOCK_NB を 論 理 和 の 形 で 指 定 す る 。 一 つ の フ ァ イ ル に 共 有 ロ ッ ク と 排 他 ロ ッ ク を 同 時 に 設 定 す る こ と は で き な い 。

flock() に よ っ て 作 ら れ る ロ ッ ク は 、 オ ー プ ン フ ァ イ ル 記 述 (open file description) (open(2) 参 照 ) と 関 連 付 け ら れ る 。 し た が っ て 、 フ ァ イ ル デ ィ ス ク リ プ タ ー の 複 製 (fork(2) や dup(2) な ど に よ り 作 成 さ れ る ) は 同 じ ロ ッ ク を 参 照 し 、 こ れ ら の フ ァ イ ル デ ィ ス ク リ プ タ ー の ど れ を 使 っ て も こ の ロ ッ ク を 変 更 し た り 解 放 し た り で き る 。 ま た 、 ロ ッ ク の 解 放 は 、 上 記 の 複 数 の フ ァ イ ル デ ィ ス ク リ プ タ ー の い ず れ か に 対 し て 明 示 的 に LOCK_UN 操 作 を 指 示 し た 場 合 か 、 こ れ ら の フ ァ イ ル デ ィ ス ク リ プ タ ー が す べ て 閉 じ ら れ た 場 合 に 行 わ れ る 。 あ る プ ロ セ ス が open(2) (も し く は 同 様 の 方 法 ) を 使 っ て 同 じ フ ァ イ ル に 対 し て 複 数 の デ ィ ス ク リ プ タ ー を 取 得 し た 場 合 、 flock() は こ れ ら 複 数 の デ ィ ス ク リ プ タ ー を 各 々 独 立 の も の と し て 扱 う 。 こ れ ら の フ ァ イ ル デ ィ ス ク リ プ タ ー の 一 つ を 使 っ て フ ァ イ ル を ロ ッ ク し よ う と し た 際 、 そ の ロ ッ ク 要 求 は 、 呼 び 出 し 元 の プ ロ セ ス が そ の フ ァ イ ル の 別 の デ ィ ス ク リ プ タ ー 経 由 で す で に 設 定 し て い る ロ ッ ク に よ っ て 拒 否 さ れ る 場 合 が あ る 。 一 つ の プ ロ セ ス は 、 一 つ の フ ァ イ ル に 対 し て (共 有 ロ ッ ク と 排 他 ロ ッ ク の う ち ) い ず れ か 一 種 類 の ロ ッ ク し か 設 定 で き な い 。 既 に ロ ッ ク さ れ た フ ァ イ ル に 対 し て flock() を 呼 び 出 す と 、 既 存 の ロ ッ ク を 新 し い ロ ッ ク モ ー ド に 変 更 す る こ と に な る 。

flock() に よ り 作 成 さ れ た ロ ッ ク は execve(2) の 前 後 で 保 存 さ れ る 。 共 有 ロ ッ ク も 排 他 ロ ッ ク も 、 フ ァ イ ル が ど の モ ー ド で オ ー プ ン さ れ た か に 関 係 な く 適 用 す る こ と が で き る 。

返 り 値

成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

EBADF

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

EINTR

ロ ッ ク の 獲 得 を 待 っ て い る 間 に 、 ハ ン ド ラ ー に よ り 捕 捉 さ れ た シ グ ナ ル を 受 信 し 、 flock() が 中 断 さ れ た 。 signal(7) 参 照 。
EINVAL

oepration が 無 効 で あ る 。

ENOLCK

ロ ッ ク レ コ ー ド を 割 り 当 て る た め の メ モ リ ー が 不 足 し て い る 。

EWOULDBLOCK 指 定 し た フ ァ イ ル が ロ ッ ク さ れ て お り 、 LOCK_NB フ ラ グ が 指 定 さ れ て い る 。

準 拠

4.4BSD (flock() コ ー ル は 4.2BSD で 最 初 に 登 場 し た )。 fcntl(2) で 実 装 さ れ て い る も の な ど を 含 め る と 、 flock() の 機 能 は ほ と ん ど の UNIX シ ス テ ム で 実 装 さ れ て い る 。

注 意

kernel 2.0 以 降 で は 、 flock() は 、 GNU C ラ イ ブ ラ リ で の fcntl(2) を 呼 び 出 し て の エ ミ ュ レ ー シ ョ ン で は な く 、 そ れ 自 体 が シ ス テ ム コ ー ル と し て 実 装 さ れ て い る 。 こ の 実 装 で は 、 flock() と fcntl(2) で 適 用 さ れ る ロ ッ ク の 種 別 に は 相 互 作 用 が な く な り 、 flock() が デ ッ ド ロ ッ ク を 検 出 し な く な る 。 (た だ し 、 最 近 の BSD な ど い く つ か の シ ス テ ム で は 、 flock() と fcntl(2) ロ ッ ク が 互 い に 影 響 す る こ と が 「 あ る 」 と い う 点 に 注 意 す る こ と 。 ) バ ー ジ ョ ン 2.6.11 以 前 の Linux カ ー ネ ル で は 、 flock() は NFS 上 の フ ァ イ ル の ロ ッ ク を 行 わ な い (つ ま り 、 ロ ッ ク の 対 象 は ロ ー カ ル シ ス テ ム に 限 定 さ れ て い た )。 そ の 代 わ り 、 十 分 に 最 近 の バ ー ジ ョ ン の Linux と ロ ッ ク を サ ポ ー ト す る サ ー バ ー で あ れ ば 、 fcntl(2) の バ イ ト 範 囲 ロ ッ ク を 使 う こ と が で き た 。 fcntl(2) の バ イ ト 範 囲 ロ ッ ク は NFS 上 で 動 作 す る 。 Linux 2.6.12 以 降 で は 、 NFS ク ラ イ ア ン ト は 、 フ ァ イ ル 全 体 に 対 す る バ イ ト 範 囲 ロ ッ ク で エ ミ ュ レ ー ト す る こ と で 、 flock() ロ ッ ク を サ ポ ー ト し て い る 。 こ れ は 、 fcntl(2)flock() ロ ッ ク が NFS 上 で は 互 い に 影 響 し あ う こ と を 意 味 す る 。 Linux 2.6.37 以 降 で は 、 flock() ロ ッ ク (と fcntl(2) の バ イ ト 範 囲 ロ ッ ク ) を ロ ー カ ル シ ス テ ム に 対 す る も の と し て 扱 う 互 換 性 モ ー ド が 、 カ ー ネ ル で サ ポ ー ト さ れ て い る 。 nfs(5)local_lock オ プ シ ョ ン の 議 論 を 参 照 。

flock() ア ド バ イ ザ リ ロ ッ ク だ け を 適 用 す る 。 し た が っ て 、 フ ァ イ ル に 適 切 な ア ク セ ス 権 を 付 与 し て い れ ば 、 プ ロ セ ス は flock() の 使 用 に 無 視 し て 、 フ ァ イ ル へ の 入 出 力 を 行 う こ と が で き る 。

flock() と fcntl(2) は fork さ れ た プ ロ セ ス と dup(2) で 違 っ た 動 作 を す る 。 flock() を fcntl(2) を 使 っ て 実 装 し て い る シ ス テ ム で は 、 flock() の 動 作 は こ の マ ニ ュ ア ル ペ ー ジ に 記 載 さ れ て い る も の と は 違 う だ ろ う 。 ロ ッ ク の 変 換 (共 有 ロ ッ ク か ら 排 他 ロ ッ ク へ 、 も し く は そ の 反 対 ) が ア ト ミ ッ ク に 行 わ れ る こ と は 保 証 さ れ て い な い : 既 存 の ロ ッ ク が ま ず 削 除 さ れ 、 そ れ か ら 新 し い ロ ッ ク が 設 定 さ れ る 。 こ の 2つ の ス テ ッ プ の 間 に 、 他 の プ ロ セ ス か ら の 処 理 待 ち の ロ ッ ク 要 求 が 認 め ら れ る か も し れ ず 、 結 果 と し て 変 換 は 停 止 (block) し た り 、 (LOCK_NB が 指 定 さ れ た 場 合 に は ) 失 敗 し た り す る 。 (こ れ は 元 々 の BSD の 動 作 で あ り 、 多 く の 他 の 実 装 で も 起 こ る 。 )

関 連 項 目

flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3)

Linux カ ー ネ ル ソ ー ス 内 の Documentation/filesystems/locks.txt (以 前 の カ ー ネ ル で は Documentation/locks.txt)

こ の 文 書 に つ い て

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