.\" $NetBSD: lockf.3,v 1.2 1998/02/05 18:47:28 perry Exp $ .\" .\" Copyright (c) 1997 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" This code is derived from software contributed to The NetBSD Foundation .\" by Klaus Klein and S.P. Zeidler. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the NetBSD .\" Foundation, Inc. and its contributors. .\" 4. Neither the name of The NetBSD Foundation nor the names of its .\" contributors may be used to endorse or promote products derived .\" from this software without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS .\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED .\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS .\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS .\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN .\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" .\" %FreeBSD: src/lib/libc/gen/lockf.3,v 1.5.2.4 2001/12/14 18:33:51 ru Exp % .\" .\" $FreeBSD$ .Dd December 19, 1997 .Dt LOCKF 3 .Os .Sh 名称 .Nm lockf .Nd ファイル上のレコードのロック .Sh ライブラリ .Lb libc .Sh 書式 .In unistd.h .Ft int .Fn lockf "int filedes" "int function" "off_t size" .Sh 解説 関数 .Fn lockf は、ファイルのセクションを助言モードロックでロック できます。ロックされているファイルのセクションを他のプロセスからロック しようとして、 .Fn lockf 呼び出しを実行すると、当該セクションのロックが 解除されるまでエラー表示値かまたはブロックが返ってきます。ロックはプロセス が終了するとすべて除去されます。 .Pp 引数 .Fa filedes は、対象ファイルの記述子です。ファイル記述子は、 書き込みのみ (O_WRONLY)、または読み込み / 書き込み両方 (O_RDWR) のどちらかで操作できる必要があります。引数 .Fa function は所要動作を定義する制御値です。 .Fa Function で指定できる値は次のとおりです。 .Bl -tag -width FULCOKXX -compact -offset indent .It Sy Function .Sy 解説 .It Dv F_ULOCK ロックされているセクションのロック解除 .It Dv F_LOCK セクションの排他的使用のロック .It Dv F_TLOCK セクションの排他的使用のテストとロック .It Dv F_TEST セクションの他プロセスによるロック状況をテスト .El .Pp .Dv F_ULOCK は、ファイルのセクションからロックを解除します。 .Dv F_LOCK および .Dv F_TLOCK は、どちらも、セクションが使用可能状態ならばロックします。 .Dv F_TEST は、他プロセスが指定のセクション上にあるかどうかを検査します。 .Pp 引数 .Fa size は、ロックまたはロック解除対象のバイト数を示しています。 ロックまたはロック解除対象のセクションは、ファイル上の現在のオフセットを 開始地点とし、前方向であれば正符号の長さで、後ろ方向であれば負の長さで 表します。(現在のオフセット値を除く後続する範囲のバイト数) しかし、 ファイルの先頭より前を開始点または対象範囲とすることはできません。 .Fa size が 0 の場合、セクションは現在の地点からファイル上で取りうる最大範囲の地点まで ロックされます (すなわち、現在の地点から現時点のまたは今後拡張するファイル の終了部分までです)。 .Pp .Dv F_LOCK または .Dv F_TLOCK でロックされたセクションは、同一プロセスで 先行してロックされたセクションの全体または一部を含むかあるいは 含まれることがあります。この場合、またはロックされたセクションが 隣接するとき、これらのセクションは一つのロックされたセクションに 統合されます。要求によりロックの数がシステムで定めた限界を超えた場合、 要求はエラーになります。 .Pp .Dv F_LOCK および .Dv F_TLOCK による要求は、セクションが利用不可の 場合それぞれの取る動作について差異があります。 .Dv F_LOCK は、セクションが 利用可能になるまで呼び出しプロセスを抑制します。 .Dv F_TLOCK では、他プロセスが 既にロックしている場合、関数はエラーになります。 .Pp ファイルのロックは、ファイルの記述子のロックプロセスが終了して初めて 解除されます。 .Pp .Dv F_ULOCK 要求は、プロセスで制御される複数のロックされた セクション (全体または一部) を解放します。ロックされたセクションは、現在の ファイル上の地点から .Fa size で示す長さのバイト数分、またはサイズ指定が 0 の場合 ファイルの終了位置まで、ロックが解除されます。ロックされたセクション がすべて解放されないとき (すなわち、ロック解除される区域の最初の部分または 終りの部分がロックされたセクションにあるとき)、セクションの残りの部分は プロセスにより引き続きロックされます。ロックされたセクションの中心部分を 解放することにより、ロックされた残りの部分は、先頭区域と終りの区域の 2 つの セクションに分離されます。要求により、システム内のロックの数が、システムで 定めた制限値を越える場合、その要求の処理は不成功になります。 .Pp .Dv F_ULOCK 要求は、サイズ指定が 0 でなく、要求されたセクションの最終バイトの 位置が、off_t 型のオブジェクトに対する最大値を越えない場合、 またはプロセス内にサイズ 0 のロックがあり、要求対象セクションの最終バイトを 含んでいる場合、サイズ 0 の要求対象セクションの開始位置からロック解除する 要求として扱われます。そうでない場合、 .Dv F_ULOCK 要求は、要求対象のセクションだけをロック解除しようとします。 .Pp ロックされている区域を制御しているプロセスが、他プロセスでロック されている区域をロックしようとしてスリープ状態になると、デッドロックが 起こる可能性があります。この仕組みにより、ロックされた区域が ロック解除されるまでのスリープがデッドロックを起こし、 .Er EDEADLK エラーで異常終了することを検出できます。 .Pp .Fn lockf , .Xr fcntl 2 および .Xr flock 2 によるロックは同時併行で問題なく使用できます。 セクションでの防護処理は適当なシグナルで解釈されます。 .Pp .Sh 戻り値 .Rv -std lockf 失敗時には、既存のロックは変更されません。 .Pp .Sh エラー .Fn lockf は、次の状態のとき不成功となります。 .Bl -tag -width Er .It Bq Er EAGAIN 引数 .Fa function は、 .Dv F_TLOCK または .Dv F_TEST であり、 セクションはすでに他のプロセスによりロックされています。 .It Bq Er EBADF 引数 .Fa filedes は妥当でない対象ファイル記述子です。 引数 .Fa function .Dv F_TLOCK または .Dv F_TEST であり、引数 .Fa filedes は書き込み可能ファイルとして妥当なファイル記述子ではありません。 .Pp .It Bq Er EDEADLK 引数 .Fa function は .Dv F_LOCK であり、デッドロックが検出されました。 .Pp .It Bq Er EINTR 引数 .Fa function は .Dv F_LOCK であり、 .Fn lockf がシグナル発生により中断されました。 .Pp .It Bq Er EINVAL 引数 .Fa function が .Dv F_ULOCK , .Dv F_LOCK , .Dv F_TLOCK , or .Dv F_TEST のどれにも該当しません。 .Pp 引数 .Fa filedes がロックをサポートしないファイルを示しています。 .Pp .It Bq Er ENOLCK 引数 .Fa function は .Dv F_ULOCK , .Dv F_LOCK , または .Dv F_TLOCK であり、 ロックまたはロック解除の要求により、 ロック区域の数がシステムで定めた 制限値を越えます。 .El .Sh 関連項目 .Xr fcntl 2 , .Xr flock 2 .Pp .Sh 規格 .Fn lockf 関数は .St -xpg4.2 に適合しています。