実験的に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);
}
--------------
No.1ベストアンサー
- 回答日時:
flockを使います。
詳しくは「Perl flock」で検索してみてください。回答いただきありがとうございます。
良いキーワードありがとうございます。
ただ、当方の環境ではロックまでは出来たのですが、ロックしているか否かのチェックがうまく動作しなかった為、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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonのプログラミングについ...
-
1桁の日付に0を付ける
-
前日の日付取得するには?
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
セレクトメニューで2つの項目...
-
<SELECT>タグの折り返し
-
文字の横にプルダウンを表示さ...
-
実行時エラー 3020の対策
-
16進の10進変換について
-
awkの正規表現での最左最短マッ...
-
数値英単語変換
-
シェルスクリプトで、空白(ス...
-
selectタグ内の特定のoptionの...
-
sendmailで複数の宛先にメール...
-
処理終了後、他のページへジャ...
-
Pythonでコンソールをクリアす...
-
構造体の各データの表示につい...
-
STLのlistで重複するものだけを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlでsprintf("%02d",$month)...
-
1桁の日付に0を付ける
-
日齢計算プログラム
-
Perlの日付の比較に関して
-
当日の日付をプルダウンメニュ...
-
Cookieの有効期限について
-
CSVファイルに出力
-
日付の差分の求め方(日、分)
-
うるう年の出し方
-
Schemeのプログラミング うる...
-
Perlで60進数を作りたい
-
PHPのstrtotimeのようなものあ...
-
2つの日付・時間の差分を求め...
-
a shower.
-
日付範囲をの連番と月末を取得
-
体重が3kg増える/減る の英語...
-
C言語でのPICプログラミング
-
前日の日付取得するには?
-
ソースの詳細を教えてください。
-
PerlからMysqlに接続してデータ...
おすすめ情報