排他制御用ディレクトリを作成してみる
排他制御を行うためには関数を使うということなんだけど、環境によって使えたり使えなかったりとあるため、並べてみた。
とりあえずmkdirにすることにした。
ソースコードが長々しくなってきたため、一度ロックだけのファイルで試してみることにする。
iキー。
mkdir関数は、作成するディレクトリ名とパーミッションが引数。わかりやすくlockという名前にして、権限は705に。作成に失敗したら5回まで繰り返し、それで駄目ならエラーをだして中断に。
rmdir関数は、削除するディレクトリ名が引数。エラーだしたら中断することにした。
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でのログインが必須のよう。