サブルーチン

指定されたロックファイルを作成するサブルーチン。
また、ロックファイル作成時からの経過時間を評価し、エラーないしロックファイルの削除を行う。
エラーメッセージ「現在、サーバが混み合っています」はこのサブルーチンの仕業です。

SOS2はスクリプトを実行する度にロックファイルを作成し、実行終了時にロックファイルを削除する。
この為、全く同じタイミングで2人以上のプレイヤーがスクリプトを実行することは不可能になっており、同時アクセスに対して強固なフェイルセーフとなっている。
……が、全く同じタイミングというのは奇跡に近いかもしれない*smile*

unlock とセットで使用される。

ソースコードの解説

sub lock {
	return if !$lockkey;

ロックファイルを使用しない設定($lockkey が偽)であればサブルーチンを終了させます。

	local($flag) = 10;

ローカル変数として宣言された $flag に 10 を代入している。
「現在、サーバが混み合っています」という表示までに10秒かかるのはこの設定によるもので、正確にはリトライ回数の設定。

	if	($lockkey == 1) {

条件分岐でロックファイルの設定がディレクトリ作成だった場合($lockkey == 1)の処理ブロックを開始する。

		rmdir($lockfile) if (time - (stat($lockfile))[9] > 60);

stat関数 を使用し、ロックファイルが作成から60秒以上経過したものであれば rmdir関数 で削除する。

  • stat($lockfile))[9];

――は stat関数 の返す要素の10番目、最終更新時間となります。
またPerlの計算式は左から順に評価されてゆくので、乗算や除算による優先はありません。

		while (!mkdir($lockfile,0755)) {

mkdir関数 が実行できなかった――すでにフォルダが存在していた――場合の一連の処理のループブロックの開始。

			--$flag or &error('現在、サーバが混み合っています',1);

$flag が真ならから 1 をマイナスする、偽ならエラー処理となる。

			sleep(1);

sleep関数 によって1秒間ウェイトさせる。

		}
	}
	elsif ($lockkey == 2) {
		unlink($lockfile) if (time - (stat($lockfile))[9] > 60);
		while (!symlink(".",$lockfile)) {
			--$flag or &error('現在、サーバが混み合っています',1);
			sleep(1);
		}
	}

}

条件分岐でロックファイルの設定がシンボリックリンク作成だった場合($lockkey == 2)の処理ブロックを開始する。 上記のディレクトリ作成がシンボリック作成に変わっただけで動作的には全く同じ、よって割愛。

キーワード解説

mkdir関数

  • mkdir FILENAME, MODE
    • FILENAME … 第一引数として作成するファイル名を指定。
    • MODE … 第二引数として、第一引数のパーミッションを指定。

FILENAMEでフォルダを作成する。
作成時に 1 を返し、失敗であれば 0 を返すとともに $! を設定する。

symlink関数

  • symlink OLDFILE, NEWFILE
    • OLDFILE … シンボリックリンクの元となる。
    • NEWFILE … 作成されるシンボリックリンク。

OLDFILEに対するシンボリックリンクとしてNEWFILEを作成する。
Windows等、シンボリックリンクをサポートしないシステムではフェイタルエラーとなるので注意。

sleep関数

  • mkdir EXPR
    • EXPR … ウェイトさせる秒数。省略可能。

EXPRで指定された秒数だけプロセスをウェイトする。
引数を省略すると王子様がキス(SIGALARM -> alarm関数)をするまで永遠にウェイトしてしまう。

関連項目

コメント

コメントはありません。 Comments/リファレンスマニュアル/サブルーチン/lock?

お名前:

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-04-30 (火) 00:57:40 (48d)