あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

排他制御用ディレクトリを作成してみる

排他制御を行うためには関数を使うということなんだけど、環境によって使えたり使えなかったりとあるため、並べてみた。

  • symlink
    • windows環境下では動かない
  • open
    • 2つの処理にまたがるため、処理途中で割り込みがくる可能性がある
  • flock
    • サーバによっては使えない
  • mkdir
    • 汎用的。安定。

とりあえずmkdirにすることにした。

ソースコードが長々しくなってきたため、一度ロックだけのファイルで試してみることにする。

cd /Library/WebServer/CGI-Executables
vim table4.pl

iキー。

mkdir関数は、作成するディレクトリ名とパーミッションが引数。わかりやすくlockという名前にして、権限は705に。作成に失敗したら5回まで繰り返し、それで駄目ならエラーをだして中断に。

rmdir関数は、削除するディレクトリ名が引数。エラーだしたら中断することにした。

ついでにエンコードUTF-8にして出力することにした。

print $cgiObj->header(-charset=>'UTF-8');

#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $cgiObj = new CGI;
print $cgiObj->header(-charset=>'UTF-8');

my $lockcount = 0;
while(!mkdir("lock",705)){
    $lockcount ++ ;
    if($lockcount > 5){
        print "<p>Failed to make lock directory.</p>\n";
        if(!rmdir("lock")){
            print "<p>And also failed to remove lock directory.</p>\n";
        }else{
            print "<p>However, successed to remove lock directory.</p>\n";
        }
        exit;
    }
}
print "<p>Successed to make lock directory.</p>\n";

escで抜ける。

:save table4.pl
:quit
chmod 705 table4.pl

ブラウザでアクセスしたらmkdirが動かなかった。ターミナルで動かすと普通に動く。どうやら、ターミナルとブラウザの両方で同じ挙動にみせるには、

su

でパスワードログインした上で、ディレクトリの権限をかえないとだめらしい。

chmod 707 CGI-Executables

この状態でブラウザにアクセスするとうまく動く。でも、この状態だと、OSXのログインアカウントをrootにしないと、Finderでの操作は不可能…。

ということで、今後はターミナル上でsuか、rootでのログインが必須のよう。