.\" Copyright 1993 Rickard E. Faith (faith@cs.unc.edu) and .\" and Copyright 2002 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified Fri Jan 31 16:26:07 1997 by Eric S. Raymond .\" Modified Fri Dec 11 17:57:27 1998 by Jamie Lokier .\" Modified 24 Apr 2002 by Michael Kerrisk .\" Substantial rewrites and additions .\" 2005-05-10 mtk, noted that lock conversions are not atomic. .\" .\" FIXME Maybe document LOCK_MAND, LOCK_RW, LOCK_READ, LOCK_WRITE .\" which only have effect for SAMBA. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .\" .\" Japanese Version Copyright (c) 1996 Takeshi Ueno .\" all rights reserved. .\" Translated 1996-07-03, Takeshi Ueno .\" Modified 1997-12-14, HANATAKA Shinya .\" Modified 1999-08-14, HANATAKA Shinya .\" Modified 2002-09-24, Akihiro MOTOKI .\" Modified 2005-02-26, Akihiro MOTOKI .\" Updated 2005-09-06, Akihiro MOTOKI .\" .TH FLOCK 2 2014\-09\-21 Linux "Linux Programmer's Manual" .SH 名前 flock \- オープンされたファイルに対するアドバイザリロックの適用、解除を行う .SH 書式 \fB#include \fP .sp \fBint flock(int \fP\fIfd\fP\fB, int \fP\fIoperation\fP\fB);\fP .SH 説明 オープンされたファイルにアドバイザリロック (advisory lock) の適用 や解除を行う。 ファイルは \fIfd\fP で指定する。引き数 \fIoperation\fP には以下のいずれか一つを指定する: .RS 4 .TP 9 \fBLOCK_SH\fP 共有ロックを適用する。 指定したファイルに対して、 一つ以上のプロセスが同時に共有ロックを保持することができる。 .TP \fBLOCK_EX\fP 排他ロックを適用する。 指定したファイルに対して、 ただ一つのプロセスだけが同時に排他ロックを保持することができる。 .TP \fBLOCK_UN\fP このプロセスが保持している既存のロックを解除する。 .RE .PP \fBflock\fP() を呼び出したときに、指定したロック種別と異なるロックが別プロセスによって 保持されていると、 \fBflock\fP() は停止 (block) されることがある。 非停止 (nonblocking) タイプの要求を行うためには、 上記の操作 (operation) に \fBLOCK_NB\fP を論理和の形で指定する。 一つのファイルに共有ロックと排他ロックを同時に設定することはできない。 \fBflock\fP() によって作られるロックは、 オープンファイル記述 (open file description) (\fBopen\fP(2) 参照) と関連付けられる。 したがって、ファイルディスクリプターの複製 (\fBfork\fP(2) や \fBdup\fP(2) などにより作成される) は同じロックを参照し、 これらのファイルディスクリプターのどれを使っても このロックを変更したり解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプターのいずれかに対して 明示的に \fBLOCK_UN\fP 操作を指示した場合か、これらのファイルディスクリプターがすべて 閉じられた場合に行われる。 あるプロセスが \fBopen\fP(2) (もしくは同様の方法) を使って同じファイルに対して 複数のディスクリプターを取得した場合、 \fBflock\fP() はこれら複数のディスクリプターを各々独立のものとして扱う。 これらのファイルディスクリプターの一つを使ってファイルをロックしようと した際、そのロック要求は、呼び出し元のプロセスがそのファイルの別の ディスクリプター経由ですでに設定しているロックによって拒否される場合がある。 一つのプロセスは、一つのファイルに対して (共有ロックと排他ロックのうち) いずれか一種類のロックしか設定できない。 既にロックされたファイルに対して \fBflock\fP() を呼び出すと、既存のロックを新しいロックモードに変更することになる。 \fBflock\fP() により作成されたロックは \fBexecve\fP(2) の前後で保存される。 共有ロックも排他ロックも、ファイルがどのモードでオープンされたかに 関係なく適用することができる。 .SH 返り値 成功した場合は 0 が返される。エラーの場合は \-1 が返され、 \fIerrno\fP が適切に設定される。 .SH エラー .TP \fBEBADF\fP \fIfd\fP がオープンされたファイルディスクリプターではない。 .TP \fBEINTR\fP ロックの獲得を待っている間に、ハンドラーにより捕捉されたシグナルを 受信し、 \fBflock\fP() が中断された。 \fBsignal\fP(7) 参照。 .TP \fBEINVAL\fP \fIoepration\fP が無効である。 .TP \fBENOLCK\fP ロックレコードを割り当てるためのメモリーが不足している。 .TP \fBEWOULDBLOCK\fP 指定したファイルがロックされており、 \fBLOCK_NB\fP フラグが指定されている。 .SH 準拠 4.4BSD (\fBflock\fP() コールは 4.2BSD で最初に登場した)。 \fBfcntl\fP(2) で実装されているものなどを含めると、 \fBflock\fP() の機能はほとんどの UNIX システムで実装されている。 .SH 注意 .\" E.g., according to the flock(2) man page, FreeBSD since at least 5.3 kernel 2.0 以降では、 \fBflock\fP() は、GNU C ライブラリでの \fBfcntl\fP(2) を呼び出してのエミュレーションではなく、 それ自体がシステムコールとして実装されている。 この実装では、 \fBflock\fP() と \fBfcntl\fP(2) で適用されるロックの種別には相互作用がなくなり、 \fBflock\fP() がデッドロックを検出しなくなる。 (ただし、最近の BSD などいくつかのシステムでは、 \fBflock\fP() と \fBfcntl\fP(2) ロックが互いに影響することが「ある」という点に注意すること。) .PP .\" commit 5eebde23223aeb0ad2d9e3be6590ff8bbfab0fc2 バージョン 2.6.11 以前の Linux カーネルでは、 \fBflock\fP() は NFS 上のファイルのロックを行わない (つまり、ロックの対象はローカルシステムに限定されていた)。 その代わり、十分に最近のバージョンの Linux とロックをサポートするサーバーであれば、 \fBfcntl\fP(2) のバイト範囲ロックを使うことができた。 \fBfcntl\fP(2) のバイト範囲ロックは NFS 上で動作する。 Linux 2.6.12 以降では、NFS クライアントは、 ファイル全体に対するバイト範囲ロックでエミュレートすることで、 \fBflock\fP() ロックをサポートしている。 これは、\fBfcntl\fP(2) と \fBflock\fP() ロックが NFS 上では互いに影響しあうことを意味する。 Linux 2.6.37 以降では、 \fBflock\fP() ロック (と \fBfcntl\fP(2) のバイト範囲ロック) をローカルシステムに対するものとして扱う互換性モードが、 カーネルでサポートされている。 \fBnfs\fP(5) の \fIlocal_lock\fP オプションの議論を参照。 .PP \fBflock\fP() アドバイザリロックだけを適用する。したがって、ファイルに適切なアクセス権を 付与していれば、プロセスは \fBflock\fP() の使用に無視して、ファイルへの入出力を行うことができる。 .PP \fBflock\fP() と \fBfcntl\fP(2) は fork されたプロセスと \fBdup\fP(2) で違った動作をする。 \fBflock\fP() を \fBfcntl\fP(2) を使って実装しているシステムでは、 \fBflock\fP() の動作はこのマニュアルページに記載されているものとは違うだろう。 .PP .\" Kernel 2.5.21 changed things a little: during lock conversion .\" it is now the highest priority process that will get the lock -- mtk ロックの変換 (共有ロックから排他ロックへ、もしくはその反対) がアトミックに 行われることは保証されていない: 既存のロックがまず削除され、それから新しい ロックが設定される。この 2つのステップの間に、他のプロセスからの処理待ちの ロック要求が認められるかもしれず、結果として変換は停止 (block) したり、 (\fBLOCK_NB\fP が指定された場合には) 失敗したりする。 (これは元々の BSD の動作であり、多くの他の実装でも起こる。) .SH 関連項目 \fBflock\fP(1), \fBclose\fP(2), \fBdup\fP(2), \fBexecve\fP(2), \fBfcntl\fP(2), \fBfork\fP(2), \fBopen\fP(2), \fBlockf\fP(3) Linux カーネルソース内の \fIDocumentation/filesystems/locks.txt\fP (以前のカーネルでは \fIDocumentation/locks.txt\fP) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。