ファイル全体をロックするには、オフセットを 0 に設定し、サイズを 0 に設定します。
ファイルをロックする方法はいくつかあります。どの方法を選択するかは、ロックとプログラムのほかの部分との関係、または性能や移植性によって決まります。次の例では、POSIX 標準互換の fcntl(2) インタフェースを使用します。fcntl(2) インタフェースは、次のいずれかの状況が発生するまでファイルをロックしようとします。
ファイルロックが正常に設定された
エラーが発生した
MAX_TRY 回数を超えたため、プログラムがファイルのロックを中止した
#include <fcntl.h> ... struct flock lck; ... lck.l_type = F_WRLCK; /* 書き込みロックを設定する */ lck.l_whence = 0; /* ファイルの先頭からのオフセットは l_start */ lck.l_start = (off_t)0; lck.l_len = (off_t)0; /* ファイルの最後まで */ if (fcntl(fd, F_SETLK, &lck) <0) { if (errno == EAGAIN || errno == EACCES) { (void) fprintf(stderr, "File busy try again later!\n"); return; } perror("fcntl"); exit (2); } ...
fcntl(2) を使用すると、構造体の変数を設定し、ロック要求の型と開始を設定できます。
マッピングされたファイルは flock(3UCB) ではロックできません。ただし、マルチスレッド指向の同期メカニズムを使用すると、マッピングされたファイルをロックできます。このような同期メカニズムは POSIX スタイルと Solaris スタイルのどちらでも使用できます。mutex(3THR)、condition(3THR)、semaphore(3THR)、mmap(2)、および rwlock(3THR) のマニュアルページを参照してください。