UUCPLOCK(3)

名称
uu_lock, uu_unlock, uu_lockerr - シリアルデバイスの制御権の取得および放棄

ライブラリ
libutil

書式
#include <sys/types.h> #include <libutil.h> int uu_lock(const char *ttyname) int uu_lock_txfr(const char *ttyname, pid_t pid) int uu_unlock(const char *ttyname) const char * uu_lockerr(int uu_lockresult)

解説
uu_lock() 関数は、渡された ttyname により与えられる接尾辞を持つ /var/spool/lock/LCK.. という名前のロックファイルを作成しようと試みます。 そのファイルがすでに存在する場合は、ロックするプログラムのプロセス ID が そのファイルに入っているものと見なします。

そのファイルがまだ存在していないか、またはロックファイルの中にあった プロセス ID により与えられる所有側プロセスがもはや動いていない場合は、 uu_lock() 関数はファイルに自身のプロセス ID を書込んで成功を返します。

uu_lock_txfr() 関数は、ロック所有権をもう一つのプロセスに移転します。 uu_lock() 関数がその前に成功している必要があります。

uu_unlock() 関数は、与えられた ttyname について uu_lock() によって作成されたロックファイルを削除します。 uu_unlock() を呼び出す前には、 uu_lock() が成功していなければならないことに注意してください。

uu_lockerr() 関数は、 uu_lock() から返されるものと同様に、エラー uu_lockresult を表現するエラーストリングを返します。

戻り値
uu_unlock() 関数は、成功すると 0 、失敗すると -1 を返します。

uu_lock() 関数は、次のいずれかの値を返します:

UU_LOCK_INUSE: ロックは別のプロセスによって使われています。

UU_LOCK_OK: ロックの作成に成功しました。

UU_LOCK_OPEN_ERR: open(2) はロックファイルを開くことができません。

UU_LOCK_READ_ERR: read(2) は、ロックファイルを読み取ることができません。

UU_LOCK_CREAT_ERR: creat(2) は、一時ロックファイルを 作成することができません。

UU_LOCK_WRITE_ERR: write(2) の呼び出しによって、現在のプロセス ID を ロックファイルに書込むことができません。

UU_LOCK_LINK_ERR: link(2) は、一時ロックファイルをリンクすることができません。

UU_LOCK_TRY_ERR: ロックする試みは、5 回の試行の後に失敗しました。

UU_LOCK_OK の値が uu_lockerr() に渡された場合は、空のストリングが 返されます。それ以外の場合は、失敗した理由を示すストリングが返されます。 uu_lockerr() は、現在の errno の値を使って正確なエラーを判断します。 uu_lock() を呼び出してから uu_lockerr() を呼び出すまでの間に errno が変化してしまわないように注意してください。

uu_lock_txfr() 関数は、次のいずれかの値を返します：

UU_LOCK_OK: 転送は成功しました。指定したプロセスが現在デバイスロックを 持っています。

UU_LOCK_OWNER_ERR: 現在のプロセスは、指定されたデバイスについての ロックをすでに持ってはいません。

write(2) の呼び出しによっては、新しいプロセス ID を ロックファイルに書込むことができません。

エラー
uu_lock() 関数が上のエラー値のいずれかを返した場合は、グローバル値 errno を使ってその理由を判断することができます。詳しくは、該当する マニュアルページを参照してください。

uu_unlock() 関数は、ロックファイルが削除できなかった理由を示す グローバル変数 errno を設定します。詳しくは、 unlink(2) についての解説を参照してください。

参照
lseek(2), open(2), read(2), write(2)

バグ
失効ロックを残したプログラムと同じプロセス ID が新しいプロセスに割り 当てられた場合は、失効したロックが失効を認識されない可能性があります。

呼び出しプロセスは、 /var/spool/lock ディレクトリに対する書込み許可を 持っていなければなりません。このディレクトリの許可がロックされる シリアルデバイスの許可と同じであることを保証する仕組みは備えていません。