プロが教えるわが家の防犯対策術!

実験的にWindows 7 + active perlである時刻になったら、text.txtに追記するプログラムtest.plを作りました。このプログラムを複数実行(50程度)した場合当然ですが良く衝突します。

ロックを調べるのに10秒くらいは掛かっても構わないのですが衝突無くファイルを操作するにはどのようにしたら良いでしょうか?ふと思ったのですが、証券会社など絶対に衝突が無さそうです。ロック状態を調べるだけでは大げさな気もするのですが、MySQLなどデータベースを利用すると簡単に確実な方法を用意できますかね?

test2.plなど思いつき書いてみたのですが、とりあえずは衝突してないようですが、大量に動かすと衝突する気がしてなりません。外部のソフトを使うなどでも良いのですが、簡単な方法で確実なロックというのはありますか?

-----test.pl----
for(;;){
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; $mon += 1;
if($sec % 6 == 0){
open(F,">>test.txt");
print F "$$\n";
close F;
}
select(undef, undef, undef, 0.1);
}
--------------

-----test2.pl----
for(;;){
for(;;){
if(-f "lock"){
sleep int(rand(5));
}else{
last;
}
}
open(F,">lock");
print F $$;
close (F);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; $mon += 1;
if($sec % 2 == 0){
open(F,">>test.txt");
print F "$$\n";
close F;
}
unlink("lock");
select(undef, undef, undef, 0.1);
}
--------------

A 回答 (1件)

flockを使います。

詳しくは「Perl flock」で検索してみてください。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
良いキーワードありがとうございます。
ただ、当方の環境ではロックまでは出来たのですが、ロックしているか否かのチェックがうまく動作しなかった為、mkdri関数を使う方法を採用致しました。

mkdir関数
ディレクトリ作成関数。symlinkと同じく1段階で済むし、殆どの環境で使える。汎用性を求めるならベストの方法。
$retry = 5; # リトライ回数セット
while (!mkdir($lockdir, 0755)) { # 作成。出来なければ待つ
if (--$retry <= 0) { &error("BUSY"); } # 5回ダメならあきらめる
sleep(1); # 1秒待つ
}

一連の処理

rmdir($lockdir); # 削除
引用もとhttp://homepage1.nifty.com/glass/tom_neko/web/we …

お礼日時:2015/07/04 02:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!