現在、ガンダムカルト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(拡張子無しテキストファイル)
大変申し訳ありませんがご教授宜しくお願い致します。
No.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";
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- その他(ソフトウェア) シーケンスプログラムで。 1 2022/06/23 21:44
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(悩み相談・人生相談) フレブルの子犬について おうちにきて、3日目のフレブルの子犬ちゃんです。 うちに来てから、わたしと一 1 2022/08/16 21:47
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- 分譲マンション 分譲マンションの管理組合・理事長です。この難しい件はどうすれば良いでしょうか? 9 2022/07/20 01:23
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- 分譲マンション 賃貸マンション4階に住んでいて 台所の排水溝にドレッシングのキャップを 落としてしまいした。 管理会 2 2022/10/29 21:44
- 妊活 2人目妊娠希望34歳です。 元々生理不順で排卵してませんと病院で言われました。 血液検査では他に悪い 1 2023/03/26 08:49
- 分譲マンション 賃貸マンションの4階に住んでいます。 誤って台所の排水溝にドレッシングのキャップを 落としました。 3 2022/10/29 22:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
排他処理について教えてください。
-
CGIだけで動作するフリーの日記...
-
EXCELファイルに誰がアクセスし...
-
ApacheでのCGIについての質問
-
《エクセルVBA》「他の人が該当...
-
カタカナを英語やフランス語に...
-
.htaccessを2つ以上設置した場合
-
SFTPなどは使わないホームペー...
-
Ajax React Jqueryの位置づけと...
-
Perlプログラム上でアラートを表示
-
CGI掲示板のバーミッションにつ...
-
NAMAZUでの文字化け
-
#!/usr/local/bin/perlとしたい
-
自前のアップローダの作り方
-
ニフティでメールフォームを使...
-
CGIって何ですか?簡潔に教えて...
-
FTPにて553エラー
-
KENT WEBのページカウンタのタ...
-
FC2へのCGIメールフォーム設置
-
クライアントサイドとサーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CGIでソースがそのままでてしま...
-
XサーバーでCGIを使うには??
-
cgiファイルを直接は見れなくす...
-
ファイルをアップロードするフ...
-
排他処理について教えてください。
-
CGIが実行されずにダウンロード...
-
.cgi拡張子のままCGIファイルを...
-
CGIをテキストに変換したものを...
-
htmlファイルにPHPとCGIを埋め込む
-
特定CGI「だけ」が、ローカル環...
-
C言語で作ったプログラムをC...
-
htmlに外部のcgiを読み込む
-
ファイルのダウンロードがうま...
-
CGIにCSSを
-
BBS掲示板でのhtmlとcgiの関係...
-
HTMLのソースへサーバーの掲示...
-
データベースのSEO対策?
-
CGIをコピーしたのですがうまく...
-
Apacheでcgiを動かす場合のファ...
-
ファイルアップロードの設置が...
おすすめ情報