LEASEロック
Rev.1を表示中。最新版はこちら。
LEASEロックは、設定された共有/排他ロックを貸し出します。貸し出し対象のファイルに、別プロセスが参照し競合が発生した場合、貸し出しているプロセスにシグナルが送られ、45秒後(デフォルト秒)にそのロックが解除されます。以下はその検証を行うサンプルです。このシグナルでリースしているプロセスは、ロックが解除されてもいい旨の処理をする事になります。#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <signal.h> // コンパイルで宣言されていないと怒られた # define F_SETLEASE 1024 void sigio(int sig) { printf("someone access\n"); } int main(int argc, char *argv[]) { int fd; struct sigaction sa = { .sa_handler = sigio }; sigaction(SIGIO, &sa, NULL); fd = open("/tmp/test", O_RDWR); fcntl(fd, F_SETLEASE, F_WRLCK); while (1) { sleep(1); } return 0; }
実行結果
[kitamura@localhost test]$ echo "LEASE lock" > /tmp/test [kitamura@localhost test]$ ./lease & [1] 4751 [kitamura@localhost test]$ date ; cat /tmp/test ; date 2012年 10月 24日 水曜日 11:22:35 JST someone access LEASE lock 2012年 10月 24日 水曜日 11:23:20 JST [kitamura@localhost test]$ [kitamura@localhost test]$ date ; cat /tmp/test ; date 2012年 10月 24日 水曜日 11:23:33 JST LEASE lock 2012年 10月 24日 水曜日 11:23:34 JST [kitamura@localhost test]$cat /tmp/testは45秒後に/tmp/testに参照している。この時、リースしているプロセスにSIGIOが送られ、sigio()が動作している。なお次の/tmp/testの参照ではウエイトしていない。リースは解除されている事になる。