# # NTサーバを考える # sub data_save { local($tmpfile) = $datafile; $tmpfile =~ s/(\w+)\.\w+$/$1\.tmp/i; #共通のテンポラリーファイルが存在するかを調べる foreach (1 .. 10) { #無ければロックされていないので旗を立てて脱出する unless (-f $tmpfile) { $tmpflag = 1; last; } #有ればロック中なので旗を下げて1秒待つ $tmpflag = 0; sleep(1); } #旗が立っていれば、ロックを実行 if ($tmpflag) { $tmpflag = 0; #プロセステンポラリーを作成して書き込む $tmp_dummy = "$$\.tmp"; if (open(TMP,">$tmp_dummy")) { close(TMP); chmod 0666,$tmp_dummy; if (!open(TMP,">$tmp_dummy")) { &error(bad_tmpfile); } print TMP @DATA; close(TMP); #リネームのタイミングを計る foreach (1 .. 10) { #念のためにもう一度ロックを調べる unless (-f $tmpfile) { #ロックファイルが無ければ作成してロックする if (open(TMP,">$tmpfile")) { print TMP "$datafile TMP File\n"; close(TMP); #ロックしている間にリネームする rename($tmp_dummy,$datafile); #ロック用テンポラリーファイルを削除する(ロック解除) unlink $tmpfile; $tmpflag = 1; last; } } #ロック中ならリネームできないので1秒待つ sleep(1); } #もし、リネームに失敗してダミーのテンポラリーが残っていたら削除する if (-f $tmp_dummy) { unlink $tmp_dummy; } } } }