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の参照ではウエイトしていない。リースは解除されている事になる。






