Невозможно заставить стадо Perl работать - PullRequest
4 голосов
/ 11 марта 2011

Я не могу сделать Perl's flock работа. Я блокирую файл, проверяю возвращаемое значение, чтобы убедиться, что он действительно заблокирован, и я все еще могу открыть и записать его, как будто ничего не случилось.

Вот как я могу заблокировать файл

#!/usr/bin/perl -w

use strict;

use Fcntl ':flock';

$| = 1;

my $f = $ARGV[0];

open( my $fh, '>>', $f ) or die "Could not open '$f' - $!";
print "locking '$f'...";
flock($fh, LOCK_EX) or die "Could not lock '$f' - $!";
print "locked\n";

sleep 10;
print "waking up and unlocking\n";
close( $fh );

Пока этот скрипт спит, я могу поиграть с тем же текстовым файлом из другого процесса

#!/usr/bin/perl -w

use strict;

my $f = $ARGV[0];

open( my $fh, '>>', $f ) or die "Could not open '$f' - $!";
print $fh "This line was appended to a locked file!\n";
close( $fh );

Почему я могу открыть файл и написать в него, не сказав, что он заблокирован?

Ответы [ 3 ]

11 голосов
/ 11 марта 2011

flock() - это рекомендательный замок. Вы должны иметь все свои процессы, используя flock()

Также поймите, что при вызове flock() он будет блокироваться, пока не получит блокировку. Если вам нужен сбой, вы также должны использовать флаг LOCK_NB.

open(my $lf, ">>fileIWantToLockOn");
my $gotLock = flock($lf, LOCK_EX | LOCK_NB);

unless ($gotLock)
{
    print "Couldn't get lock. Exiting";
    exit 0;
}

РЕДАКТИРОВАТЬ: Также обратите внимание, что flock() не будет работать на NFS

8 голосов
/ 11 марта 2011

Я не думаю, что flock делает то, что, как вы думаете, делает. Блокировка файла не мешает кому-либо что-либо делать с файлом , кроме , пытающимся получить блокировку для того же файла.

С man 2 flock в моей системе:

flock (2) устанавливает только консультативные блокировки; при наличии соответствующих разрешений для файла процесс может свободно игнорировать использование flock (2) и выполнять операции ввода-вывода для файла.

4 голосов
/ 11 марта 2011

flock работает с консультативными замками.Среди прочего, это означает, что только другие процессы, которые пытаются flock тот же файл, поймут, что он заблокирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...