ファイルロックについて
以下のようなプログラムを作り実験しているのですが、よくわからない事態になっています。
まず、ブラウザを2つ用意して、一方のブラウザで実行した後、すぐに2つめのブラウザで実行します。
mkdirの場合、$which=1として、2つ目を実行すると、busyとでます。これは1つ目がロックしているからということは分かります。
しかし、symlinkの場合、2つ目でもbusyという文字はでず、何事もなかったように両方ともOKと表示されます。これは本当にロックできているのでしょうか。また、この場合、lock.cgiが生成されません。
また、サーバーによってはmkdirで試行すると、まだロックしていないにもかかわらず、busyとでるのもあります。これは、mkdir方式が対応していないと考えればよいのでしょうか。
------------------------
#! /usr/local/bin/perl
$lockfile = "./lock.cgi";
$which = 1;
filelock();
sleep 10;
fileunlock();
error("OK");
sub error{
print <<END;
Content-type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML><HEAD>
</head>
<body>
$_[0]
</body></html>
END
exit;
}
sub filelock {
if (-e $lockfile) {
# 3分以上古いロックは削除する
($mtime) = (stat($lockfile))[9];
if ($mtime < time - 60) { fileunlock(); }
}
local($retry) = 2;
if($which){ #mkdir関数式ロック
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) { &error("busy"); }
sleep(1);
}
}else{ # symlink関数式ロック
if ($lockkey == 1) {
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error("busy"); }
sleep(1);
}
}
}
}
sub fileunlock {
if($which){rmdir($lockfile);}else{unlink($lockfile); }
}