我究竟如何检查文件是否被锁定?我有这个功能,但无论我做什么,它都会返回1:
sub is_file_locked
{
my $theFile;
my $theRC;
($theFile) = @_;
$theRC = open(HANDLE, $theFile);
$theRC = flock(HANDLE, LOCK_EX|LOCK_NB);
close(HANDLE);
return !$theRC;
}
答案 0 :(得分:9)
您已在阅读模式下$theFile
isn't meant to be used that way打开了LOCK_EX
。
请注意,flock(3)的fcntl(2)仿真需要这样做 FILEHANDLE打开时具有读取意图以使用LOCK_SH并且需要 它是打开写入意图使用LOCK_EX。
答案 1 :(得分:6)
首先,您应该检查open
是否成功。
此外,您应该检查是否可以获得共享锁。如果文件上有共享锁,那么flock
LOCK_EX
将会(我认为)失败。
但是,文件可能会在检查和返回之间被锁定,从而产生竞争条件,因此这样的功能具有可疑价值。
#!/usr/bin/perl
use strict; use warnings;
use Fcntl qw( :flock );
print is_locked_ex($0)
? "$0 : locked exclusively\n"
: "$0 : not locked exclusively\n";
my $test_file = 'test.txt';
open my $fh, '>', $test_file
or die "Cannot open '$test_file' for writing: $!";
if ( flock $fh, LOCK_EX|LOCK_NB ) {
print is_locked_ex($test_file)
? "$test_file : locked exclusively\n"
: "$test_file : not locked exclusively\n";
}
close $fh or die "Cannot close '$test_file': $!";
sub is_locked_ex {
my ($path) = @_;
die "Not a plain file: '$path'" unless -f $path;
return 1 unless open my $fh, '<', $path;
my $ret = not flock $fh, LOCK_SH | LOCK_NB;
close $fh
or die "Cannot close '$path': $!";
return $ret;
}
答案 2 :(得分:-2)
最终解决方案:
flock($fh, LOCK_EX) or die "Cannot lock file - $!\n";
if ( is_file_locked($gTestQueuePath) ){ print "locked";} else { print "not locked";}
#1 = locked 0 = not locked
sub is_file_locked
{
my $theFile;
my $theRC;
($theFile) = @_;
$theRC = open(my $HANDLE, ">>", $theFile);
$theRC = flock($HANDLE, LOCK_EX|LOCK_NB);
close($HANDLE);
return !$theRC;
}
close $fh or die "Cannot close";