今度はFILEOUT_MSG の説明を。
sub FILEOUT_MSG { $temp = "$Day_Count_Max<>$Query_Tbl{'mode'}<>0<>$Time_Stamp<>$Query_Tbl{'msg'}\n"; open( LOGFILE, ">>./msg.txt"); flock( LOGFILE, 2 ); print LOGFILE $temp; close( LOGFILE ); }
一行目で、メモリ上の情報をデータ行として整形してtempという変数に格納しています。
それからmsg.txtを追加書きモードでオープン、そのあとファイルを読み書き禁止でロックします。
temp の内容をprint でファイルに書き出し、最後にファイルをクローズ。クローズと同時に、ロックは解除されます。
ここで、メッセージを書き込んでいるプレイヤーのIDが「0」で固定になっている部分にご注意ください。今はまだログイン関連の処理を実装していないので、誰が書き込んだかを記録に残せないために仮にこのようにしてあります。ログインを実装したら、書き直す必要がありますね。
あと、このFILEOUT_MSG の実装だと、メッセージファイルの読み込みとは別のロックで書き出しをしていることになります。前にも書きましたが、ファイルの読み書きのロックが別々でも本当に問題無いのかは、真剣に議論する必要があります。最終的には、まず読み書きモードでファイルを開き、読み書き禁止ロックをかけ、読み込みと書き込みの処理をアトミックに実装すべきという結論になるかも知れません。
まあ、それはおいおいまた考えます。