ロックはリソースに対する排他制御を行なうメカニズムです。ファイルの様々 な制御に使われるfcntlを用いると、特にファイルの排他制御にかかわるロッ クを直接制御出来ます。ロックはオンラインシステムでデータベースなどの内 容の首尾一貫性を確保するために非常に重要な概念です。次の例を見てくださ い。
#include <sys/types.h> #include <unistd.h> #include <fcntl.h> struct flock key; int fd, st; fd = open( "lock.key", O_RDWR, 0644 ); /* キーファイル*/ key.l_type = F_WRLCK; /* 排他ロック */ key.l_whence = SEEK_SET; /*ファイル先頭より*/ key.l_start = 0; /* ロック位置のオフセット*/ key.l_len = 0; /* ロックする領域の長さ、0は全体*/ st = fcntl( fd, F_SETLKW, &key ); /*ロックする*/ if( st == -1 ) { /* ロックに失敗した */ } /* ロックできるまでfcntlからは帰ってこない。 */ sleep( 10 ); /* 10秒間ロックを抱え込む */ close( fd ); /* ここでロックを開放したことになる。*/
まず最初に
% touch lock.key
でファイルを作っておきます。つぎにこのプログラムを複数走らせます。最初 に走ったプログラムはファイルをロックできますが次に走ったものはロックで きるまで待たされます。最初のプログラムが10秒経ってファイルをクローズし てはじめてfcntlから戻ってこれます。つまり最初のプログラムが次のプログ ラムの実行再開を制御したことになり、同期が取れたことになります。
この例ではlock.keyというファイルが実際に排他アクセスされるわけですが、 他のプロセスとの同期のためにファイルロックのメカニズムを利用することが できるわけです。何か共有される資源を排他利用する場合、長さが0のファイ ルを作っておいてそのファイルをロックできたプロセスがその資源を利用する 権利があると取り決めておけばよいわけです。ロックキーが空いているときは システムコールからただちに戻ってきます。キーが取れなかったプロセスは実 行待ち行列に入れられキーが空くのを順番に待ちます。このロックのメカニズ ムはNFSマウントされたファイルに対して別のホストとの間でも有効です。ネッ トワーク間の同期を取ることにも利用できます。