【发布时间】:2014-07-02 14:57:37
【问题描述】:
perl 中的fcntl 可以锁定NFS,默认模式是阻塞模式。如何使其成为非阻塞模式? 我尝试了以下代码,但它不起作用
sub lock_file {
my ($lock_file, $block) = @_;
return unless defined $lock_file;
my $LOCKFH;
if (file_exist($lock_file)) {
sysopen($LOCKFH, "$lock_file", O_RDWR) || return undef;
} else {
sysopen($LOCKFH, "$lock_file", O_RDWR|O_CREAT|O_EXCL) || return undef;
}
my $lock_ret = 0;
my $pack;
if ($block) {
my $flags;
fcntl($LOCKFH, F_GETFL, $flags);
$flags &= !O_NONBLOCK;
my $fail_block = fcntl($LOCKFH, F_SETFL, $flags);
print "failed to set the lock to block mode.$!\n" if !$fail_block;
}
$pack = pack('ssqql', F_WRLCK, SEEK_SET, 0, 0, 0);
$lock_ret = fcntl($LOCKFH, F_SETLK, $pack);
if (!$lock_ret) {
close $LOCKFH;
return undef;
}
return $LOCKFH;
}
【问题讨论】:
-
if (file_exist($lock_file)) { sysopen($LOCKFH, "$lock_file", O_RDWR) || return undef; } else { sysopen($LOCKFH, "$lock_file", O_RDWR|O_CREAT|O_EXCL) || return undef; }写sysopen($LOCKFH, "$lock_file", O_RDWR|O_CREAT) || return undef;的方式不是很长而且不可靠吗?