レコードのロッキングは、ロッキングセグメントの開始位置と長さが 0 に設定されないこと以外は、ファイルのロッキングと同様に行います。
必要なすべてのロッキングを設定できない場合に備えて、対処方法を用意しておいてください。レコードロッキングを使用するのは、レコードへのアクセスが競合するためです。実行される動作は、プログラムによって次のように異なります。
一定時間待ってから再試行する
手順を中止してユーザに警告する
ロッキングが解除されたことを示すシグナルを受信するまでプロセスを休眠させておく
上記のいくつかを組み合わせて実行する
次の例は、fcntl(2) を使用してレコードをロッキングする方法を示します。
{ struct flock lck; ... lck.l_type = F_WRLCK; /* 書き込みロッキングを設定する */ lck.l_whence = 0; /* ファイルの先頭からのオフセットは l_start */ lck.l_start = here; lck.l_len = sizeof(struct record); /* this に書き込みロッキングを設定する */ lck.l_start = this; if (fcntl(fd, F_SETLKW, &lck) < 0) { /* this の書き込みロッキングが失敗 */ return (-1); ... } |
次の例は、lockf(3C) 関数を示します。
#include <unistd.h> ... /* this をロッキングする */ (void) lseek(fd, this, SEEK_SET); if (lockf(fd, F_LOCK, sizeof(struct record)) < 0) { /* this のロッキングが失敗。here のロッキングを解除する */ (void) lseek(fd, here, 0); (void) lockf(fd, F_ULOCK, sizeof(struct record)); return (-1); } |
各ロッキングはタイプが異なるだけで、設定されたときと同じ方法で解除されます (F_ULOCK)。ロッキングの解除は別のプロセスによってブロッキングされず、そのプロセスが設定したロッキングに対してだけ有効です。ロッキング解除は、前のロッキング呼び出しで指定されたファイルのセグメントに対してだけ有効です。