レコードをロックする場合、ロックセグメントの開始位置と長さを 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)。ロックの解除は別のプロセスによってブロックされず、そのプロセスが設定したロックに対してだけ有効です。ロック解除は、前のロック呼び出しで指定されたファイルのセグメントに対してだけ有効です。