« PSPでPS1! | メイン | 商標権 »

September 28, 2006

flockの使い方

mixiのPerlコミュでも話題になっていたのですが(ちょっと前だけど)、flockで排他制御をかける際の正しい方法はみたいなことが書かれていて、そういえば僕もPerlCookBookに書いてあることを信じて、こういう使い方をしていたのですが

追記の場合:
 open(OUT, ">>data.txt") or die;
 flock(OUT, LOCK_EX);
 my $line = "hello world!\n";
 print OUT $line;
 close(OUT);

どうもこれだけでは、不十分らしい。
open(OUT, ">>data.txt")で追記モードで開いた際に他のプロセスが書き込みをしていると、末尾がずれるそうでseek(OUT,2);を指定してprintする前に末尾にポインタを移動させる必要があるようです。
なので、正しくはこう、

 open(OUT, ">>data.txt") or die;
 flock(OUT, 2);
 seek(OUT, 0, 2);
 my $line = "hello world!\n";
 print OUT $line;
 close(OUT);

Bestなやり方はやっぱりLockFileと書き込むファイルは別々にすべきなのでしょうが。

参考にさせてもらったページ
Perlの排他制御
CGI(Perl)ファイル処理 その4:「ファイルロック:flock 後編」
flock考

Author nitoka : September 28, 2006 10:25 AM

TrackBack

TrackBack URL:
http://www.nitoka.net/blog/mt-tb.cgi/211

Comment

Please, comment




save