[Perl] ロック中にロックファイルを消したらどうなるか?(Linux限定)

メモ

Q:異常時にロックが解放されないので、ロックファイルを削除して、しまおうと考えています。
 削除した時、ロック待ちをしているプロセスはどういう動きをしますか?

A:だからと言って、ロックファイルを消すというのは短絡的ですねえ。
 ですが、ロック待ちをしているプロセスが居る時に、ロックファイルを消しても、ロック待ちし続けます。


検証環境:CentOS4、Perl5.8.5

#!/usr/bin/perl

use strict;
use warnings;
use IO::File;
use Fcntl;

my $F_WRLCK = pack "sslllli", F_WRLCK, 0, 0, 0, 0, 0, 0;
my $fh = IO::File->new(">o.pl.dat") or die;

print STDERR "locking....";
fcntl $fh, F_SETLKW, $F_WRLCK or die;

print STDERR "locked\n";

sleep 100;


Result

# perl o.pl &
locking....locked
# perl o.pl &
locking....
# ls -i
1425418 o.pl
1425419 o.pl.dat
# cat /proc/locks | grep 1425419
1: POSIX ADVISORY WRITE 27515 03:41:1425419 0 EOF
1: -> POSIX ADVISORY WRITE 27534 03:41:1425419 0 EOF
# rm o.pl.dat
rm: remove 通常の空ファイル `o.pl.dat'? yes
# cat /proc/locks | grep 1425419
1: POSIX ADVISORY WRITE 27515 03:41:1425419 0 EOF
1: -> POSIX ADVISORY WRITE 27534 03:41:1425419 0 EOF


まあ、ファイルとロックは別管理という事ですわな。

追記(2010/10/6)
isoya9さんの調査によると、NFS上でも同様らしい。
だからといって、削除するとしても、stat->unlinkの隙間で同じstat->unlinkが動作した場合、変な動きになってしまうのですが。。。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック