【●多重ロック サブルーチン】 と、 【●必要な 初期設定】  【Lock_and_Setting.txt】

  (ダウンロード方法  右クリック 〜 対象をファイルに保存。)


◆【Lock_and_Setting.txt】では、 sclrDataSave.pl を必要とするような記述/説明をしていません。
ただし、ファイルの読み書きの部分は 省略してありますので、
 【Lock_and_Setting.txt】の説明に従って、 ご自分の CGIスクリプトに 【多重ロックサブルーチン】 と、【必要な 初期設定】を追加して下さい。

 ◇このページと Lock_and_Setting.txt の両方を読んで下さい。 全体的な使い方や 注意事項は、このページに書いてあります。
  そして、
  in_Top.htm を参考見本として、 ファイルの読み書き処理 のブロック全体を、【ロック開始】と【ロック解除】で サンドイッチして下さい。
  この時、【ロック開始】と【ロック解除】を多重の形にして記述します(in_Top.htm を参考にして下さい)。
  【ロック開始】の記述方法と【ロック解除】の記述方法は、Lock_and_Setting.txt に詳しく説明してあります。
  (in_Top.htm を参考にできます)

 ◇in_Top.htm は あくまで参考見本であり、 このページは 全体的な使い方や 注意事項を説明した物です。
  ですから、in_Top.htm や このページから直接コピーして流用する事はしないで下さい。
   (変数名などの記述が一致しない可能性もある)
   楽をする目的でコピーした場合は、変数名などをよく確認して下さい。 Lock_and_Setting.txt の中では 矛盾が生じないように配慮しています。

 ◇処理を終了させるルーチン や エラー処理ルーチン の先頭部分には、 【ロック 全解除サブルーチン】を呼ぶ1行を追加記述した方が良いでしょう。
  通常の【ロック解除】の記述を間違い無く記述して 完全にロック解除されている場合でも、1回は 【ロック 全解除サブルーチン】を呼んでおきましょう。
 【ロック 全解除サブルーチン】の呼び方も、 Lock_and_Setting.txt に説明してあります。

 ◇【多重ロックサブルーチン】に必要な初期設定は、 Lock_and_Setting.txt に全て 含まれています。

◆あなたのCGIに組み込んだ時、
  【多重ロックサブルーチン/初期設定】 と あなたのCGI とで、 変数名の重複・サブルーチン名の重複 が無いようにして下さい。
  詳しくは、 このページの下の方に書いてあります。



【●analysis.cgi】 は、 こちら   【analysis.txt】 (ファイル名を 【analysis.txt】 にしてあります)

  (ダウンロード方法  右クリック 〜 対象をファイルに保存。)


【 注 意 】   sclrDataSave.pl を用意しないと、 analysis.cgi は動作しません。(エラーが発生します)
◆sclrDataSave.pl を用意できない人は、 【 &sclrDataSave::sData_save の書き込み処理部分 】を 一般的な書き込み方法 に変更して下さい。
 sclrDataSave.pl に関しては、 このページの下の方で 説明します。

	※ sclrDataSave.pl を必要とする箇所は、
	  【 require './sclrDataSave.pl'; 】 と記述されている箇所と
	  【 $err = &sclrDataSave::sData_save($pwd2file, $writeData, $wrMode, 0, 0); 】 という風に 記述されている箇所です。

◆このHPで紹介するスクリプトは、 基本的に Perl5 を想定しています。





【多重ロック サブルーチン】 の使い方 と、 説明



【多重ロック】の方法を含め、 基本的な 【使い方説明】 は、 【Lock_and_Setting.txt】 を閲覧して下さい。


この ページ等で、 プログラムソースコードを抜粋して説明する時、 【$SymYesNo = $SymUsable;】 という抜粋の仕方をしますが、
この 【  と  】 には、特に意味はありません。
第一の目的は強調する目的です。
第二の目的は、 【  から  】までが “ひとまとめ”である事を意識して頂く目的で使用しています。
読む時や、 文字列選択〜コピー する時は、  【  と  】 を除外して下さい。




【多重ロック サブルーチン】 を使うに際して、

【$SymYesNo = $SymUsable;】 と 【$SymYesNo = $lockkey;】 に関する 説明。



以下に、 【analysis.cgi】 の抜粋を 掲載します。 (一部分だけ。【多重ロック】せずに単純化した説明。)



# ===========  ↓ 【初期設定】と【初期値の設定】を区別して説明しているので注意。 ===========

# ◆ A ◆【初期設定】・・・ 一部

# --------------------------------------

# ロック方式   1=flock関数  2=symlink関数  それ以外の数値=mkdir関数)(サーバー次第。)
$lockkey = 1;

# 	◆↓ 上の $lockkeyで設定できる値を選んで、好きな値(ロック形式)を設定する。
# 	  ↓       すると、プログラムコードで【$SymYesNo = $SymUsable;】を設定している間だけ $SymUsableで選択した方式でロックされる。
$SymUsable = 1;
# 	◆↑ symlinkを一時的に【共用】で使うなら、$SymUsableに 2を設定する。
# 	◆◆その場合は、全CGIで $SymUsable = 2; を設定するべし(そうしないと 別種CGI同士のロックが効かない)◆◆
# 
# --------------------------------------

# 	 ===============================

# ◆ B ◆ 初期値 の設定 ・・・ 一部

# 	◆【ロック形式 初期値】の設定(通常設定)
$SymYesNo = $lockkey ;
$lockflag = 0 ;

# 	 ===============================

# ◆C【実行例1】 ・・・ 一部

	    # ◆ロック開始
	    $SymYesNo = $SymUsable; 		#  ← symlinkロックを指定できる。(◇◇◇)
	$Sym_0_LK = &lock($otherGuard, $Sym_0_lockfile);
			$SymYesNo = $lockkey;	#  ← symlink指定を解除。(◇◇◇)

# 	[ この部分に、ファイル処理を記述する ]

	    # ◆ロック解除
	    $SymYesNo = $SymUsable; 		#  ← symlinkロック解除を指定。(◇◇◇)
	&unlock($mylockOFF, $Sym_0_LK);
			$SymYesNo = $lockkey;	#  ← symlink指定を解除。(◇◇◇)


# 	 ============================================
# 	 ============================================
# 
#  ◆ D ◆【ロック処理サブルーチン】の先頭部分だけ 抜粋して掲載。

sub lock {
	my $LockKey = $SymYesNo ;

						# 	途中 省略。
		if ($LockKey == 1) {
						# 	途中 省略。
		elsif ($LockKey == 2) {
						# 	以下 省略。
}

# 	 ============================================
# 	 ============================================
# 
#  ◆ E ◆【ロック解除サブルーチン】の先頭部分だけ 抜粋して掲載。

sub unlock {
	my $LockKey = $SymYesNo ;

						# 	途中 省略。
		if ($LockKey == 1) {

						# 	途中 省略。
		elsif ($LockKey == 2) {
						# 	以下 省略。
}


# ====================================================

●外ロック・内ロック という形で 【多重ロック】を行った例は、 【 analysis.cgi 】 を閲覧して下さい。

	※analysis.cgiで行っている【多重ロック】で、  外ロック と 内ロックとで、ロック動作に差異はありません。
	  同時アクセスがあった場合に、最初のロック処理時に  万一 “隙間”を縫う形で複数プロセスが次のステップに入って来た場合に備えて、
	  もう一度 ロック処理を行っているだけです。
	  それを 象徴付ける意味で、【外ロック】・【内ロック】という用語を使っています。

# ====================================================


上の  A、B、C、D、E を見比べて下さい。

	※Bの【初期値 の設定】で、$SymYesNo に $lockkeyの値(1)が代入されています。
	  ロック開始の直前に、$SymYesNo に $SymUsableの値(1)が代入されています。

	  ロック処理/ロック解除 のサブルーチンで、この $SymYesNoの値を ロック種別のキー($LockKey)として利用しています。
	  $lockkeyの値 と $SymUsableの値 は 両方とも 1 ですから、
	  意味が無いように見えます。
	  では、
	  もし、最初の Aの【初期設定】で $SymUsable = 2; としてあったら どうでしょうか。


# ◆ロック開始・解除の 直前の【$SymYesNo = $SymUsable;】は、 一時的に 別種のロック方式を使うための設定です。
# 
# 	(ロック開始・解除の 直後の【$SymYesNo = $lockkey;】は、 その設定を 通常設定に戻す処理です。)
# 
# 	※【初期値の設定】部分の  $SymYesNo = $lockkey ; に注目。
# 	  この $SymYesNo の値を、 ロック処理/解除のサブルーチン先頭で “ロック種別のキー”として判断しています。
# 
# 
#   【初期設定】の部分で、【$lockkey = 1;  $SymUsable = 2;】 という風に  $lockkey と $SymUsable の値を“別の数値”に設定すると
#   1と2のロック種別を 使い分ける動作となります。
# 
#   ◇通常は 使い分けは不要ですから、 私は 【$lockkey = 1;  $SymUsable = 1;】 としています ($lockkey と $SymUsable を同一の値に設定)。
# 
#   私のように 別種のロック方式を使い分けない人で、ソースコードを単純化させたい人は、
#   【$SymYesNo = $SymUsable;】 と 【$SymYesNo = $lockkey;】の記述部分は必要ありません
#  							( 例 : A〜Eの使用例の C部分で、行末に ◇◇◇ を記述した行)。
#   つまり、
#   別種のロック方式を使い分けない人は、下の【実行例2】のような 単純な形で 【ロック開始 〜 ファイル処理 〜 ロック解除】 を行ってもOKです。
# 	◆C【実行例2】
	    # ◆ロック開始
	$Sym_0_LK = &lock($otherGuard, $Sym_0_lockfile);
# 	[ファイル処理]
	    # ◆ロック解除
	&unlock($mylockOFF, $Sym_0_LK);
# 
# ◆どんな使い方であれ、【同一のロックファイルで“組”となるロック開始とロック解除】で、$SymYesNoの値が等しいことが絶対条件です。

# 	  ロック開始直前に $SymYesNoの値を変更(ロック種別を変更)したならば、ロック解除直前にも $SymYesNoの値を 同様の値を設定する必要が
# 	  あります。(ロックファイルごとに。)
# 	  単純化した使い方をするならば、次のように考えて下さい。
# 	  	【ロック開始 直前の $SymYesNo = $SymUsable;】と【ロック解除 直前の $SymYesNo = $SymUsable;】を  無効化し、
# 	  	【ロック開始 直後の $SymYesNo = $lockkey;】  と【ロック解除 直後の $SymYesNo = $lockkey;】  を  無効化すれば良いのです。
# 
# ◆どんな使い方をする場合も、◆【初期値の設定】部分の  $SymYesNo = $lockkey ; を削除・変更してはいけません◆。
# 
# 	※【初期設定】の部分で、【$lockkey = 1;】かつ【$SymUsable = 1;】 とか、
# 	  			【$lockkey = 2;】かつ【$SymUsable = 2;】 という風に、$lockkey と $SymUsable を同一の値に設定しておけば、
# 	  単純化せずに、C【実行例1】の使い方でも 同じことです。
# 
# 
# ◆【 $SymYesNo = $SymUsable; 】を設定した時に ロック開始で引数指定するロックファイル  については、
#   他の別種CGIのロック開始で それと同じロックファイルを引数指定する時は、
#   同じように 【 $SymYesNo = $SymUsable; 】を設定してから  ロック開始/ロック解除を行うべし。
#   要するに、
#   同一のロックファイルに関しては、常に同一のロック方式で ロック開始/ロック解除を行うことが肝要です。
#   別種の複数CGIが 特定の同一データファイルに読み書きする場合は、
#   そのデータファイルに読み書きする時のロック開始は  同一のロックファイルを引数指定する事になるので、
#   その事を理由として、上記の事を考慮する必要があります。
# 
# 
# 
#  ◇2種類のロック方式を使い分ける形を用意した理由:
# 
# 	flockを使えないサーバーでは 他のロック方式を選択する事になりますが、
# 	symlinkは “旗の上げ下げ”が割合に速いのですが、 元々  symlinkは ロック処理のための関数ではないので、
# 	ロック処理の途中で サーバーのOSが他の作業を行う事があるようです。
# 	(つまり、ロックが破られる可能性)
# 	それで、外側のロックでは 【ロック漏れはあるが 旗の上げ下げが速い ロック方式】を選択し、
# 	内側のロックでは 【旗の上げ下げは遅いが ロック漏れが無い ロック方式】を選択できるようにしました。




★2種類のロック方式を使い分ける場合、 注意点があります。

【Lock_and_Setting.txt】の ロックファイル初期設定 の部分を見ると、
  $Sym_0_lockfile  には  cgi-bin/MunyaSymDir/SymSym_0_lock.lok を設定し、
  $mini_0_lockfile には  cgi-bin/NormalLockDir/mini_0_normal.lok を設定していますでしょ。


そう、 異なる方式の ロックファイルは、↑ 別のディレクトリに所属させて下さい。

理由は、 説明するより エクスプローラで試して頂いた方が簡単です。 ↓

	適当な作業ディレクトリで、baka.dat という名前のファイルを作成して下さい。
	その後、同じ場所で、同じ名前で baka.dat という名前のディレクトリを作成して下さい。
	作れませんでしょ。
	そう、種別が違っても 同名は 拒否されるんです。
		※理由の説明は省略します。Dos知識のある人は、ディレクトリエントリの詳細を思い出して下さい。

	サーバーのOSである UNIX では確認していませんが、多分 拒否されるでしょう。(エラー)
	Windowsの祖先である MS-DOS でも同様です。
	MS-DOS は 元々 UNIX をお手本にしていますから、同じだろうと思います。

ですから、
いったん運用を開始した後で、ロック方式を変更する場合は【要注意】です。
ま、 この点は、 他の ロック処理サブルーチンを使う場合でも 同様ですけど・・。

運用を開始した後で、ロック方式を変更する場合は、 ロックファイルの“パス・ファイル名”の指定を変更して下さい。



ロックファイル名と ペア(組み)になる【サブルーチン戻り値変数】の名前について、
初期設定で、
$Sym 〜〜 という変数名を設定し、“ペア”になるロックファイルを Sym 〜〜.lok という名前にしています。
変数名と実際のロックファイルの名前を“系列的な名前”にする事によって、
運用する時に 上記のミスを防ぐ手助けとしています。


面倒な人は、ロック方式を使い分けなければ良いのです。(笑)  その方が楽です。





ロック処理サブルーチンの 【リトライ回数/ウェイト秒数】 について。



◆この【analysis.cgi】は 皆さんがクリックして実行するものではなく、【隠しCGI】ですから、
  $Sym_0_lockfileのロック開始のあと、全部の作業が済むまで、他のプロセスに待たせます。
  
  $Sym_0_lockfileのロック解除を早めて “他のプロセスに待たせる時間”を もう少し短くしても良いのですが、
  ページ先頭で紹介した【ロック開始サブルーチン】のリトライ回数を 【analysis.cgi】では4回に設定しているので、
  「まあ 良かろう」〜と考え、シンプルにしています。

  	※analysis.cgiの【ロック開始サブルーチン】のリトライ回数は、  for ($cnt = 1; $cnt < 4; $cnt++) の部分です。
  	  他のプログラムの邪魔にならないように、ロックビジー時には 4回で中止させています。
  	  (multi_Locking_guide.htm では for ($cnt = 1; $cnt < 8; $cnt++) ですが・・。)
  	  また、
  	  他のプログラムでは、ロック開始時の“スリープ〜リトライ”のウェイト秒数を 0.5秒に設定して、
  	 【analysis.cgi】の動作よりも 他のプログラムが優先するようにしています。

ウェイト秒数を 0.5秒に設定したい場合は、
ロック処理サブルーチンの  sleep(1); となっている箇所を  select(undef, undef, undef, 0.5) ;
として下さい。
0.25秒に設定したいなら  select(undef, undef, undef, 0.25) ;
として下さい。
	(この時の 0.25 は、250ミリ秒 という意味です。)

何回も  select(undef, undef, undef, 0.5) ;  と記述するのが面倒なら、
sub miniSleep {
	select(undef, undef, undef, 0.5) ;
}
という サブルーチンを作っておいて、 sleep(1); の代わりに  &miniSleep ; という形で呼べば簡単です。

ウェイト秒数を長くしたり ウェイト回数を多くするのは サーバーの負荷を増大するらしいです。
InterQでも、ウェイト秒数をあまり長くすると サーバーが【偽装エラー】を表示するように設定されている感じです。

sleep や select の使用を禁止している【共有サーバー】もあります。
【共有サーバー】を利用している人は、ウェイト回数を少なくしましょう。


◆重要 ↓

  私の場合、 analysis.cgiとは別の パスワードマネージャのプログラムも 共通のデータファイルを読み書きするので、
  上記の、
  【データファイルとロックファイルの組み合わせ】も 【“ロック開始〜ファイル処理〜ロック解除”の手順】 も 同じにしてあります。
   (共通のデータファイルについては。)





【ご使用の CGI に組み込まれている ロック処理】 との兼ね合いについて。


(【変数名・サブルーチン名の重複】 を避ける。)


◆あなたのCGI中で、 ロック処理・解除サブルーチン の外と中で使用されている変数名は、$lockflag と $lockkey くらいです。

  (別の名前でしょうけど・・。 $lockbusy もあるでしょうが、後述。)


多くの “フリー/シェアウェアCGI” の場合、 ロック処理を 【多重ロック方式】 に置き換えるのは 難しくないでしょう。

  $lockfile については、
  ほとんどの場合、$lockfile は ロック処理・解除サブルーチン と 初期設定においてのみ記述されているハズです。
  		(そうでない場合は、下で説明する【名前空間】について 勉強して頂かないと無理です。)
  その↑場合、ロック処理・解除サブルーチンは【多重ロック方式】に置き換えるのですから、次のようにします。
  置き換える前のCGIで、初期設定部分の $lockkey や $lockflag の記述は 【多重ロック方式】用の記述に変更します。
  置き換える前のCGIで、
  ロック処理・解除サブルーチン以外の $lockkey/$lockflag/$lockbusy の記述は、【多重ロック方式】用の記述に変更します。


  それら ロック処理にだけ使われている変数名は、 Lock_and_Setting.txt の変数名に置き換えて下さい。
  あなたのCGI中に記述されている変数 ひとつひとつについて、
  文字列選択($ の部分を含めずに)して、検索すれば すぐ判明します。

  要領としては、まず、あなたのCGIを元本として どこかに保存します。
  次に、
  あなたのCGI中から ロック処理・解除サブルーチンを ごっそり【選択〜切り取り】し、切り取った部分(コード)を 別のテキストに貼り付けます。
  そのテキストにおいて、片っ端から サブルーチン名や単語を選択します。
  まず 1度 F3キー検索し、
  同じ文字列が、【あなたのCGI(切り取り後のCGI)】の中で見つかるか・・・これをチェックすれば良いのです。

  あなたのCGI中で 元々の ロック処理・解除サブルーチンを呼んでいる部分について、
  例えば、  Lock;  もしくは  &Lock; という記述で呼んでいたら、とりあえず、 &lock; という記述に変更します。
   (この作業は CGI1本あたり 30分くらいで出来るでしょう。)
  そして、あとから “田中流ロック 開始”の書式に変更します。  ロック解除を呼んでいる部分も 同様にします。

変数名/サブルーチン名/ラベル名 の 【命名】 の基礎知識
1.
サブルーチン内部で【宣言】する local変数  (【サブルーチンの中で local宣言された変数(local変数)】)
と
サブルーチン内部で【宣言】する my変数  (【サブルーチンの中で my宣言された変数(my変数)】)
は、
サブルーチンの外や 他のサブルーチンの中で 同じ名前の変数が使ってあっても、別々に認識されます。
 (スクリプトを管理する人間が混乱するので、避けた方が良い。)

local変数 の値は、そのlocal変数を宣言したサブルーチンの外部(サブルーチンを呼んだ【親】など)から参照する事はできません。
ただし、 local変数を宣言したサブルーチンの 子供サブルーチン内では可能です。

my変数 の値は、そのmy変数を宣言したサブルーチン内部からしか“参照・変更”する事はできません。


◇【サブルーチンで処理した結果】を、そのサブルーチンを呼んだ側で認識するためには、
 サブルーチンの処理結果を【戻り値】として受け取る必要があります。
 サブルーチンの処理結果を【戻り値】以外にもチェックする場合や、エラー処理でもチェックすべき場合もあり、
 何でもかんでも local変数/my変数 を使えば良い・・というものでもありません。


2.
local変数/my変数 として宣言されていない変数は、 グローバル変数であり、
これらは、
 サブルーチンの外でも、複数のサブルーチン内に記述されている場合でも、“同一の変数を示す”と解釈されます。

  ※2つ以上の“別のパッケージ”同士においては、 
   グローバル変数 や サブルーチンが 同じ名前であっても、パッケージ間では“別物”と認識されます。

  ※パッケージとは、ファイル先頭で 【package jcode;】という風に package宣言されているものを指します。
   あなたのCGIで 【require 'jcode.pl';】と記述されていた場合、
   通常は あなたのCGIは 【mainパッケージ】と認識され、requireされたjcode.pl は 【jcodeパッケージ】と認識されます。
   この場合は、
   あなたのCGIと 【jcodeパッケージ】とでは、お互いに グローバル変数/サブルーチンなどの名前が重複していても
   それらの変数/サブルーチンは 2つのパッケージ間では“別物”と認識されます。
   しかし、
   package宣言されていないファイルを requireすると、 requireした側と requireされた側は合体し、1つのパッケージ空間となります。
    (例 = cgi-lib.pl)
   この場合は、同じ名前のグローバル変数は “同一の変数を示す”と解釈されます。

  ※ロック処理サブルーチンなどは パッケージ化すると複雑化し、利用方法もかなり不便な物になります。

  ◆パッケージ空間 についての詳細は、
   【ライブラリの パッケージ化と、 サブルーチン や 変数の 名前空間】 を読んで下さい。


【サブルーチンの中で local宣言された変数(local変数)】 は、
宣言後は、そのサブルーチン内部と その子供サブルーチンの内部で、 普通に$Write_dataと記述すれば  local変数として認識されます。

【サブルーチンの中で my宣言された変数(my変数)】は、 local変数の規則↑ に準じますが、
my変数は そのサブルーチンの中だけで 有効です。

サブルーチン内部で グローバル変数の値を操作したり、値を参照できますが、
そのためには、 グローバル変数 と ローカルな変数(local変数・my変数)の名前を 別名にしておきましょう。


3.
同一スクリプト(パッケージ空間)の内部で 同じ名前のサブルーチンが 2つ以上 存在してはいけません。

同一スクリプト内でなくても、(例えば、ライブラリを requireする場合など)、同一パッケージとして合体するスクリプトでは、
同じ名前のサブルーチンが 2つ以上 存在してはいけません。


4.
大文字・小文字は区別されます( A と a は区別される)。

変数名/サブルーチン名/ラベル名 の名前は、全て 半角英数字で記述します。
基本的に、全角文字は 【表示させる文字列】や【変数に代入する文字列】としてのみ使える・・と覚えて下さい。
(例外もある。)

perlの予約語を 変数名/サブルーチン名/ラベル名 として使ってはいけません。
このミスを簡単に避ける方法として、 変数名/サブルーチン名/ラベル名の1文字目を“大文字”にすると良いでしょう。
(Perlの予約語は、 先頭が小文字。)

  ※“大文字”というのは 全角文字のことではありません。
   例えば、$Write_data とか @Write_data とか %Write_data という風に、変数を表す $ や % や @ の次の1文字を
   半角の大文字にすれば、perlの予約語 と名前が衝突することはありません。

変数名の一部が perlの予約語と一致しても構いません。
write は予約語ですが、$Write や $WRITE は 問題なく、サブルーチン名としても使えます(好ましくない)。

アンダーバーを変数名に使うのは構いませんし、見やすさの点で良いことです。
しかし、@_ という変数名は、Perlの動作上 予約された変数名です。
 (引数受け取り や 暗黙変数 として使われる)

変数を表す $ や % や @ の次の1文字は、必ず アルファベットにしましょう。
 (そうしないとperlの命名規則に抵触したり、予約された特殊変数と重複したりする可能性が高くなる)
数字を変数名に含める場合は、2文字目以降に使いましょう。
 (例えば、$t1_data なら問題ない。$1_data は駄目。普通は $data1 とか $data_1 と命名する)

名前の間に “空白”を入れると、1つの名前として認識されず、 空白は“区切り”として認識されます。

変数名には、 “ハイフン”や “マイナス” を使わず、代わりに アンダーバー ( _ ) を使いましょう。
半角ハイフンは 引き算の “マイナス” として認識されます。


◆local変数/my変数 についての詳細は、
 【ライブラリの パッケージ化と、 サブルーチン や 変数の 名前空間】 を読んで下さい。


5.
蛇足ですが、 【'】と【"】は意味が違います。

 2つの '' ではさまれた文字列は、【定数】として認識されます。

 2つの "" ではさまれた文字列は、基本的に 【定数】として認識しますが、
 一部に 変数を含めて記述した場合は その変数の部分は【変数の値】に変換されます。

  ※PascalやFORTRAN のような【定数宣言】は Perlには無く、Perlには【定数】という概念は無いのかも知れません。
   【定数】という一般的なコンピュータ用語を使った説明には無理がある事をご勘弁下さい。





ここまでの説明を理解して頂けたら、 【多重ロック サブルーチン】 を使用できます。


【sclrDataSave.pl】 は、 必ずしも必要ではありません。

通常は 【sclrDataSave.pl】 を使用しなくても、 【多重ロック サブルーチン】で 十分に 強固なロック処理が可能です。


【sclrDataSave.pl】 は、
【ファイル単位の テンポラリーロック処理】 と 【sclrDataSave.pl 内部の通常ロック】 を同時に行いながら
書き込み処理を行う パッケージです。


著作権・再配布規定の関係で、 【sclrDataSave.pl】を そのまま提供する事はできません。
【Try The HomePage】 の 【perl-lib.pl】 から抜粋・調整して 単体のパッケージファイルとする事によって、 【sclrDataSave.pl】 を作成します。
ですから、

【ライブラリの パッケージ化と、 サブルーチン や 変数の 名前空間】 を読んで 理解し、
その後で、 この ページを開き、 その中でリンク案内する about_sclrDataSave.txt に指示する手順に従って、 ご自分で抜粋・調整 して頂くことになります。
多少の Perl知識と、
【ライブラリの パッケージ化と、 サブルーチン や 変数の 名前空間】 の理解が必要です。


【多重ロック】 と 【ファイル単位の テンポラリーロック処理】 を併用したい人は、
  sclrDataSave.pl もしくは、 それに代わる物が必要となります。


   ※sclrDataSave.pl を使わず、 かつ、 【“多重ロック と ファイル単位テンポラリーロック処理” の併用】 も行わない人は、
     通常の方法で 【ファイル書き込み】 を行って下さい。
     つまり、
     【多重ロック処理】 だけを行いたい人は、 【多重ロック処理サブルーチン】 + 【通常方法の ファイル書き込み】 の組み合わせです。



◆以下 38行は、
  【“多重ロック と ファイル単位テンポラリーロック処理を併用したい”けれど、 sclrDataSave.pl作成を 断念した人】 へ。

  ◇
  まず 第一の方法として、
  CGI の書き込み処理部分 ( &sclrDataSave::sData_save の部分)を 一般的な書き込み方法 に変更して下さい。
  あるいは、 第二の方法として、
  sclrDataSave.pl ではなく 【perl-lib.pl 元本】をそのまま使い、 【perl-lib.pl 元本】に含まれる data_saveサブルーチン呼び出し書式に従う方法もあります。
  その第二の方法でも、 【perl-lib.pl元本の data_saveサブルーチン】 と 私の【多重ロックサブルーチン】を併用しても、競合の弊害はありません。
   (ここで言う 【競合】 とは 【変数名の重複】を指します。)
  また、
 【perl-lib.pl元本に含まれる 全てのサブルーチン】 と 私の【多重ロックサブルーチン】を併用した場合は、
  【perl-lib.pl元本】がパッケージ化してなく、 私の【多重ロックサブルーチン】もパッケージ化してないので、 【変数名の重複】があるか〜の心配があります。
  【perl-lib.pl元本】 は非常に配慮深く作られているので 大丈夫だろうと思いますが、 【perl-lib.pl元本】 は多数のサブルーチンを含むので、 不明です。
  また、 私の【多重ロックサブルーチン】と変数の重複が無くても、 あなたのCGI/ライブラリと 【perl-lib.pl元本】とで 変数の重複が起きる可能性もあります。
  私の【多重ロックサブルーチン】は サイズが小さく、使用している変数も限られているのですが、【perl-lib.pl元本】 は サイズが大きいので・・。。
  ◇
  【変数名の重複】の対策としては、 下のリンクの 【ライブラリの パッケージ化】 を勉強して、 【perl-lib.pl元本】 の全体をパッケージ化する方法があります。
  パッケージ化してしまえば、 【変数名の重複】 を心配する必要はありません。
  【perl-lib.pl元本】 から 必要なサブルーチンだけ抜粋する方法もありますが、 作業としては 【perl-lib.pl元本】の全体をパッケージ化する方が簡単です。
  【ライブラリを 丸々 パッケージ化する作業】 は、 初心者でも さほど難しくありません。
  【パッケージ化したライブラリ】のサブルーチンを呼ぶ場合は、 【パッケージ化していないライブラリ】のサブルーチンを呼ぶ場合と 書式が変わります。
  その点については、 下のリンクの 【ライブラリの パッケージ化】 を読めば 解説してあります。 頑張って読んで理解して下さい。
  ◇
  また、【perl-lib.pl元本】に含まれる data_saveサブルーチンは、 【配列変数】を上書きモードで書き込むだけです。(追記モードは無い。)
  perl-lib.pl元本を使って【スカラー変数】も書き込みたい人は、
  A.【perl-lib.pl元本】の中に このサブルーチン↑と同じ内容の “別名_双子サブルーチン(スカラー変数用)” を追加するか、
  B.【if 判定】で スカラー変数用の分岐処理を data_saveサブルーチンに追加するか、
  どちらかの方法が必要です。
  A.B.どちらかの方法の場合も、 perl-lib.pl元本の data_saveサブルーチンの 【 @WRITE_DATA; 】という変数名を 【 $WRITE_DATA; 】という風に変更 (2ヵ所)
  すれば、スカラー変数を書き込む形にできます。
  ◇
  上記説明に従って 【perl-lib.pl元本の data_saveサブルーチン】 を使っても、 追記モードが欲しければ、 さらに手間がかかります。
  ですから、
  【ファイル単位の テンポラリーロック処理】 だけは あきらめて、 とりあえず、
  【多重ロック処理サブルーチン】 + 【通常方法の ファイル書き込み】 の組み合わせで運用することをオススメします。
  そのあとで、 ゆっくりと時間をかけて、

  【ライブラリの パッケージ化と、 サブルーチン や 変数の 名前空間】 を勉強しましょう。
  最終的に これが 最も近道ですし、 ご自分のCGI運用にも役に立ちます。


【Try The HomePage】 の 【perl-lib.pl】 は、 有用なサブルーチンを多数 含んでいます。
  ↑ 訪問してみて下さい。 ロック処理など、 勉強になります。 サイトオーナーの Perlの力は、 私よりも ずっと上です。







【多重ロック】 と 【ファイル単位の テンポラリーロック処理】 を併用 したい人へ。


【 require './sclrDataSave.pl'; 】 と、
 
【 $err = &sclrDataSave::sData_save(〜, 〜, 〜, 〜); 】 の部分について。

および、

【ライブラリの パッケージ化】 と、 サブルーチン や 変数の 【名前空間】。





【ライブラリの パッケージ化】 と、 サブルーチン や 変数の 【名前空間】 について。