以前にも質問したのですが間違って締めきってしまったので再度質問します。CGI初心者なのですがmkdirを使ってファイルロックをかけたいのですがどうすればいいのかわかりません。たぶん、下記の部分というのはなんとなくわかりました。
分かる方よろしくお願いします。
#### メッセージ番号設定 ####
sub getnumber {
open(COUNTER,"$countfile") || &error('カウントファイルが開けない');
$this_num = <COUNTER>;
close(COUNTER);
$this_num++;
open(COUNTER,">$countfile") || &error('カウントファイルに書きこめない');
print COUNTER "$this_num";
close(COUNTER);
if( length($this_num) == 1 ){ $this_num ="000000" . $this_num;}
elsif( length($this_num) == 2 ){ $this_num ="00000" . $this_num; }
elsif( length($this_num) == 3 ){ $this_num ="0000" . $this_num; }
elsif( length($this_num) == 4 ){ $this_num ="000" . $this_num; }
elsif( length($this_num) == 5 ){ $this_num ="00" . $this_num; }
elsif( length($this_num) == 6 ){ $this_num ="0" . $this_num; }
}
#### データファイルへ入力 ####
sub inputDB {
$datafile = "$predatadir/userdata01.csv";
open(DB,">>$datafile") || &error('データファイルに書きこめない');
print DB "$yourname,$email\n";
close(DB);
}
No.3
- 回答日時:
修正版でもカウンタが重複することがあります。
(データが飛ばなければ良いなら問題ないですけど)
基本的にファイルロックをかける場合、データを読み込むときから書き込むときまでロックをかけ続けます。
なので、今回の場合、カウンターファイルを読み込んでからデータファイルへ書き出すまでロックをかけ続けます。
#追記なのでCSVファイルの処理時間はそれほどかかりません。
あと、気になる点として、下の3点くらいかな?
1、下の方も仰っていますが、デットロック時の処理が無い
2、普通ロックに失敗した場合はsleepしてretryしますが、いきなりexitしていいの?
3、unlockに失敗したときの処理は?
(unlockに失敗しても不用意にrmdirしないこと!)
No.2ベストアンサー
- 回答日時:
#1です。
おそらく修正なさったプログラムで大丈夫だと思います。が、素人判断ですので、他の方からの回答をしばらくお待ちになるか、あるいは思い切って実践に移して様子をみるか、最終的にはご自分で判断なさって下さい。実践に移す場合は、念のため少なくともデータファイルだけは(できれば全てのファイルの)バックアップをとっておくとよいと思います。
以下、気づいた点を書きます。あくまでも素人の意見なので、参考程度に受け取って下さい。
・ロックはファイル出力時は必要ですが、入力時は不要かもしれません。つまり、プログラムのはじめの方、カウンタのファイルをリードするところでは、ロックはなくても良さそうです。
・「userdata01.csv」はおそらくカウンタのファイルに比べてとても大きいと思われますが、あまり大きすぎてその処理に時間がかかると、その処理のきっかけとなるアクセスをした人が、途中でブラウザの「中止」を押した場合、ロック状態のままになったり、ファイルが壊れたりする不具合があるかもしれません。(心配しすぎかも!?)
それから、余計なお節介ですが、$this_numが6桁以下の場合、頭に0をつけて7桁にするif-elsif-...のところは、次のようにすれば1行で済みます。
$this_num = sprintf("%07d", $this_num);
長くなってしまいすみません。では。
No.1
- 回答日時:
この回答への補足
ありがとうございます。
教えていただいたURLを参考にして作ってみたのですが、カウントファイルの操作時、データファイルへの出力時に、
ファイルロックの処理というとこんなかんじでいいのでしょうか?
#### メッセージ番号設定 #####
sub getnumber {
#ディレクトリの作成ができなかったらあきらめる
if(!mkdir($lockdir,0755)){
exit(1);
}
#ディレクトリの作成ができたらカウントファイルを開く処理
open(COUNTER,"$countfile") || &error('カウントファイルが開けない');
$this_num = <COUNTER>;
close(COUNTER);
#lockdirを消す
rmdir($lockdir);
$this_num++;
#ディレクトリの作成ができなかったらあきらめる
if(!mkdir($lockdir,0755)){
exit(1);
}
#ディレクトリの作成ができたらカウントファイルに書き込む処理
open(COUNTER,">$countfile") || &error('カウントファイルに書きこめない');
print COUNTER "$this_num";
close(COUNTER);
#lockdirを消す
rmdir($lockdir);
if( length($this_num) == 1 ){ $this_num ="000000" . $this_num;}
elsif( length($this_num) == 2 ){ $this_num ="00000" . $this_num; }
elsif( length($this_num) == 3 ){ $this_num ="0000" . $this_num; }
elsif( length($this_num) == 4 ){ $this_num ="000" . $this_num; }
elsif( length($this_num) == 5 ){ $this_num ="00" . $this_num; }
elsif( length($this_num) == 6 ){ $this_num ="0" . $this_num; }
}
#### データファイルへ入力 ####
sub inputDB {
$datafile = "$predatadir/userdata01.csv";
#ディレクトリの作成ができなかったらあきらめる
if(!mkdir($lockdir,0755)){
exit(1);
}
open(DB,">>$datafile") || &error('データファイルに書きこめない');
print DB "$yourname,$email\n";
close(DB);
#lockdirを消す
rmdir($lockdir);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) pythonで変数にオブジェクトを代入するにはどうしたらよいでしょうか 2 2023/08/20 20:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MATLAB(マトラボ)とcsvファ...
-
メールアドレスをテキストファ...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
number 改行が追加できない
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
memcmp バイナリデータの比較方法
-
char str[256]の256の意味は?
-
DataGridViewの特定列に入力さ...
-
Javaで日本語1文字のバイト数
-
Excel VBA メール作成について ...
-
機種依存文字をチェックしたい。
-
3バイト文字(UTF-8)をprintfで...
-
unicode←→JISコード
-
ビットからバイトへの変換
-
2byte文字の判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MATLAB(マトラボ)とcsvファ...
-
matlabで、平均値を求める方法...
-
VBScripの2次元動的配列
-
VBA エクセルで1列で表示したい。
-
いつどこゲームのようなテキス...
-
複数のCSVを一度にダウンロード
-
文字型変数を使って2進数表示す...
-
VB6.0でMSChartをタイマーを使...
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
バイナリとBCDコード
-
バイト列とバイナリ列の違いが...
おすすめ情報