作者: dune
日時: 2004/2/12(00:53)
極悪です。

自分の環境で flock が使えるかどうか確かめるため、下のような
スクリプトを書いて試してみました:

--^flocktest.pl
#!/usr/local/bin/perl
#use strict;

sub LOCK_SH{ 1 }
sub LOCK_EX{ 2 }
sub LOCK_UN{ 4 }
sub LOCK_NB{ 8 }
#my $lockmode = LOCK_EX|LOCK_NB;
my $lockmode = LOCK_EX;

print qq(Content-type: text/html; charset=EUC-JP\r\n\r\n);
print qq(<HTML><BODY><H1>flock test</H1><PRE>);
print `$^X -v`,q(</PRE><HR><PRE>);

my $file = "flocktest.txt";

open(FILE,">$file");
print FILE time," : file creation ok\n";
close FILE;

open(FILE1,">>$file");
flock(FILE1,$lockmode);
print FILE1 time," : flock ok\n";

eval{
    local $SIG{ALRM} = sub{ die time," : flock time-out!\n"};
    alarm 1;
    open(FILE2,">>$file");
    flock(FILE2,$lockmode) or die time," : flock failure!\n";
    print FILE2 time," : flock ok?\n";
    close FILE2;
    alarm 0;
};
alarm 0;

print FILE1 $@;
print FILE1 time," : unlock ok\n";
close FILE1;
print `cat $file`,q(</PRE></BODY></HTML>);
--$



Windows 2000(NT5)上で実行すると eval 内部の flock がブロッ
クされて待ち状態になります(alarm は実装されていないので、手で
強制終了)。いちおう期待通りの動きです。



次に cgi サーバ上での動作ですが、制限の多い @nifty では

flock test
This is perl, version 5.005_02 built for sun4-solaris
〜中略〜
-----------------------------------------------------------
1076510270 : file creation ok
1076510270 : flock ok?
1076510270 : flock ok
1076510270 : unlock ok



別の某プロバイダのサーバでも

flock test
This is perl, v5.6.0 built for sun4-solaris
〜中略〜
-----------------------------------------------------------
1076510365 : file creation ok
1076510365 : flock ok?
1076510365 : flock ok
1076510365 : unlock ok

といった様子で、flock が効いていません。ただし
$lockmode = LOCK_EX|LOCK_NB; とした場合は Windows 2000 でも、
どちらのサーバでも、ちゃんと

1076510464 : file creation ok
1076510464 : flock ok
1076510464 : flock failure!
1076510464 : unlock ok

となります。

# ちなみに Windows 98 では
# flock() unimplemented on this platform at ...
# と言われて実行できない。



これってどういうことでしょうか。flock を使って待ちに入ったプ
ロセスがたくさんできるのはまずいとか、待ちに入ったプロセスは
直に外部から終了させられるから LOCK_EX はムダでしょとか、そ
ういった判断で使えなくしてあるのでしょうか。
-- 
極悪, FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?