.\" .\" Copyright (c) 1996 Brian Somers .\" .\" All rights reserved. .\" .\" 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. .\" .\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 DEVELOPERS 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/libutil/uucplock.3,v 1.13.2.4 2001/12/17 10:08:32 ru Exp % .\" $FreeBSD$ .\" " .Dd March 30, 1997 .Os .Dt UUCPLOCK 3 .Sh 名称 .Nm uu_lock , .Nm uu_unlock , .Nm uu_lockerr .Nd シリアルデバイスの制御権の取得および放棄 .Sh ライブラリ .Lb libutil .Sh 書式 .In sys/types.h .In libutil.h .Ft int .Fn uu_lock "const char *ttyname" .Ft int .Fn uu_lock_txfr "const char *ttyname" "pid_t pid" .Ft int .Fn uu_unlock "const char *ttyname" .Ft const char * .Fn uu_lockerr "int uu_lockresult" .Sh 解説 .Fn uu_lock 関数は、渡された .Fa ttyname により与えられる接尾辞を持つ .Pa /var/spool/lock/LCK.. という名前のロックファイルを作成しようと試みます。 そのファイルがすでに存在する場合は、ロックするプログラムのプロセス ID が そのファイルに入っているものと見なします。 .Pp そのファイルがまだ存在していないか、またはロックファイルの中にあった プロセス ID により与えられる所有側プロセスがもはや動いていない場合は、 .Fn uu_lock 関数はファイルに自身のプロセス ID を書込んで成功を返します。 .Pp .Fn uu_lock_txfr 関数は、ロック所有権をもう一つのプロセスに移転します。 .Fn uu_lock 関数がその前に成功している必要があります。 .Pp .Fn uu_unlock 関数は、与えられた .Fa ttyname について .Fn uu_lock によって作成されたロックファイルを削除します。 .Fn uu_unlock を呼び出す前には、 .Fn uu_lock が成功していなければならないことに注意してください。 .Pp .Fn uu_lockerr 関数は、 .Fn uu_lock から返されるものと同様に、エラー .Fa uu_lockresult を表現するエラーストリングを返します。 .Sh 戻り値 .Fn uu_unlock 関数は、成功すると 0、失敗すると -1 を返します。 .Pp .Fn uu_lock 関数は、次のいずれかの値を返します: .Pp .Dv UU_LOCK_INUSE : ロックは別のプロセスによって使われています。 .Pp .Dv UU_LOCK_OK : ロックの作成に成功しました。 .Pp .Dv UU_LOCK_OPEN_ERR : .Xr open 2 はロックファイルを開くことができません。 .Pp .Dv UU_LOCK_READ_ERR : .Xr read 2 は、ロックファイルを読み取ることができません。 .Pp .Dv UU_LOCK_CREAT_ERR : .Xr creat 2 は、一時ロックファイルを 作成することができません。 .Pp .Dv UU_LOCK_WRITE_ERR : .Xr write 2 の呼び出しによって、現在のプロセス ID を ロックファイルに書込むことができません。 .Pp .Dv UU_LOCK_LINK_ERR : .Xr link 2 は、一時ロックファイルをリンクすることができません。 .Pp .Dv UU_LOCK_TRY_ERR : ロックする試みは、5 回の試行の後に失敗しました。 .Pp .Dv UU_LOCK_OK の値が .Fn uu_lockerr に渡された場合は、空のストリングが 返されます。それ以外の場合は、失敗した理由を示すストリングが返されます。 .Fn uu_lockerr は、現在の .Va errno の値を使って正確なエラーを判断します。 .Fn uu_lock を呼び出してから .Fn uu_lockerr を呼び出すまでの間に .Va errno が変化してしまわないように注意してください。 .Pp .Fn uu_lock_txfr 関数は、次のいずれかの値を返します: .Pp .Dv UU_LOCK_OK : 転送は成功しました。指定したプロセスが現在デバイスロックを 持っています。 .Pp .Dv UU_LOCK_OWNER_ERR : 現在のプロセスは、指定されたデバイスについての ロックをすでに持ってはいません。 .Pp .DV UU_LOCK_WRITE_ERR : .Xr write 2 の呼び出しによっては、新しいプロセス ID を ロックファイルに書込むことができません。 .Sh エラー .Fn uu_lock 関数が上のエラー値のいずれかを返した場合は、グローバル値 .Va errno を使ってその理由を判断することができます。詳しくは、該当する マニュアルページを参照してください。 .Pp .Fn uu_unlock 関数は、ロックファイルが削除できなかった理由を示す グローバル変数 .Va errno を設定します。詳しくは、 .Xr unlink 2 についての解説を参照してください。 .Sh 関連項目 .Xr lseek 2 , .Xr open 2 , .Xr read 2 , .Xr write 2 .Sh バグ 失効ロックを残したプログラムと同じプロセス ID が新しいプロセスに割り 当てられた場合は、失効したロックが失効を認識されない可能性があります。 .Pp 呼び出しプロセスは、 .Pa /var/spool/lock ディレクトリに対する書込み許可を 持っていなければなりません。このディレクトリの許可がロックされる シリアルデバイスの許可と同じであることを保証する仕組みは備えていません。