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

現在、ガンダムカルトQQQ(MIDI-CG-SOFT-総合サイト)【http://ha1.seikyou.ne.jp/home/jun/】様よりフリーで配布されている「QQQ MEMBERS ver1.00」を使用してメンバー管理を行なっています。
しかし、このスクリプトには排他処理が入っていなかった為、ディスカバリーシステム【http://www.dscvsys.com/Perl.htm#filelock】様のページを参考にrenameを使った排他処理を作成しましたが、どこに排他処理をかけていいかわからず、かなり悩んでいます。

*排他処理はディスカバリーシステム様の記述をそのまんま使用しています。
尚、ファイル構成は以下の通りです。

cgi-bin
 |
 ├member.cgi
 ├jcode.pl
 └lockdir
   └lockfile(拡張子無しテキストファイル)

大変申し訳ありませんがご教授宜しくお願い致します。

A 回答 (1件)

利用されているソースも何も見ていないので詳細は分かりませんが、とりあえず、改良したいソースファイルの中から、以下の2つを調べてみてください。



(1) 排他制御したい対象ファイルは何か?
(2) そのファイルに対して書き込み処理を行っている箇所はどこか?

調べたら、書き込みを開始する前に「ロック」して、書き込みが完了したら「ロック解除」してあげれば良いと思います。
なお大抵の場合、読み込みに対しては排他制御は不要です。

この回答への補足

lahalitoさん、早速のご回答有難うございます。
lahalitoさんが教えてくれた(1)と(2)について
調べたところ、以下の様な状態でした。
どちらもサブルーチンで呼び出されており、
プログラムの処理工程は大体わかるのですが、
どこに排他制御を掛けていいかわからず試行錯誤しております。ソースが長くなり大変申し訳ありません。ご面倒かと思いますが、またご教授いただけないでしょうか?
宜しくお願いします。
(1)排他制御したい対象ファイル
#************************************************
# 初期変数設定
#************************************************
sub setup{
$cgi_file='member.cgi';#このファイル名
#$id= $ENV{'REMOTE_HOST'};
$id= $ENV{'REMOTE_ADDR'};
$log_head= 'member';#ログの頭文字
$log_foot= 'cgi';#ログの拡張子
$log_dir= 'member';
$CH_S_NUM{$log_max}=' selected';
@c_list=("A","B","C","D","E","F");
@p_list=("G","H","I","J","K","L","N","M","O","P"
);
}

(2) そのファイルに対して書き込み処理を行っている箇所はどこか?

#************************************************
# ログ書き込み
#
#ロック開始関数
#$lfi = &fileLock"lockfile") || die 'ビジー!';
#
#ロック解除関数
#&fileUnlock($lfi);
#************************************************

sub log_write{
$FORM{'phone'} =~ s/\r/<br>/g;
if($FORM{'re_art'} ne ""){
local(@files)=&dir_list($log_head,$log_foot,$log_dir);

foreach $file(@files){
open(DB,"$log_dir/$log_head$file\.$log_foot");
local(@lines) = <DB>;
close(DB);

@write_log=();

foreach(@lines){
$_=~ s/\n//g;
if($_ eq ''){last;}
local($date,$update,$art,$name,$email,$owner,$phone,$pass,$work,$cat,$id,$place,$etc) = split(/<>/,$_);
if($FORM{'re_art'} eq $art){
if($FORM{'del'} eq ""){
$phone =join("<>",$FORM{date},$ttime,$FORM{'re_art'},$FORM{'name'},$FORM{'email'},$FORM{'owner'},$FORM{'phone'},$FORM{'pass'},$FORM{'work'},$FORM{'cat'},$id,$FORM{'place'},$FORM{'etc'},"\n");
push(@write_log,$phone);
}
$flag=1;
}else{push(@write_log,"$_\n");}
}
if($flag eq 1){
open(DB,">$log_dir/$log_head$file.$log_foot");
print DB @write_log;
close(DB);

last;
}

}
if($flag ne 1){
&header('エラー');
print '<h2>おしらせ</h2><i><b>記事が見つけられませんでした。</b></i><p>';
&html;
&footer;
exit;
}
}else{
# 記録ファイルを読み出しオープンして、配列<@lines>に格納する
local($file,$num)=&active_log;
open(DB,"$log_dir/$log_head$file\.$log_foot");
local(@lines) = <DB>;
close(DB);
$phone =join("<>",$date_now,$ttime,$num,$FORM{'name'},$FORM{'email'},$FORM{'owner'},$FORM{'phone'},$FORM{'pass'},$FORM{'work'},$FORM{'cat'},$id,$FORM{'place'},$FORM{'etc'},"\n");
push(@lines,$phone);

# 記録ファイルを上書きオープンして、配列<@new>を書き出す
open(DB,">$log_dir/$log_head$file.$log_foot");
print DB @lines;
close(DB);
chmod 0666,"$log_dir/$log_head$file.$log_foot";

}
}

補足日時:2005/01/08 01:13
    • good
    • 0

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