在Perl中,如何检查文件是否被锁定?

Chr*_*son 6 perl

我究竟如何检查文件是否被锁定?我有这个功能,但无论我做什么,它都会返回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;
}
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 9

您已$theFile在读取模式下打开,LOCK_EX 并不打算以这种方式使用.

请注意,flock(3)的fcntl(2)仿真要求FILEHANDLE以读取意图打开以使用LOCK_SH,并要求使用LOCK_EX打开写入意图.


Sin*_*nür 6

首先,您应该检查是否open成功.

此外,您应该检查是否可以获得共享锁.flockLOCK_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;
}
Run Code Online (Sandbox Code Playgroud)