Что не так с блокировкой моего файла? - PullRequest
2 голосов
/ 20 июля 2011

Когда я делаю следующее, я не вижу никаких файлов блокировки (если flock () использует это?).

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

Нужно ли устанавливать Fnctl пакет?

Что я делаю не так?

#!/usr/bin/perl

use warnings;
use strict;
use Fcntl ':flock'; # Import LOCK_* constants

my $file = 't';
my $can_lockin = 1;

open(my $fh, '>', $file) or die "Could not open '$file' - $!";
flock($fh, LOCK_EX) or die "Could not lock '$file' - $!";

print $fh $can_lockin;
sleep 100000000;

#close($fh) or die "Could not write '$file' - $!";

Ответы [ 3 ]

4 голосов
/ 20 июля 2011

flock не использует файлы блокировки; он реализован операционной системой.

Имейте в виду, что блокировки UNIX рекомендуют , т. Е. Другие программы могут по-прежнему изменять файл, если они сами не вызывают flock. Кроме того, если файл заблокирован, попытка flock блокируется (ожидает, пока файл не будет разблокирован). Если вы хотите, чтобы программа выходила вместо блока при попытке получить удерживаемую блокировку, передайте LOCK_EX | LOCK_NB в flock.

Также обратите внимание, что ваш режим открытия неверен, вместо > (обрезать файл), вы, вероятно, хотите <+ (открыть файл для чтения и записи) и вызвать truncate самостоятельно после того, как вы приобрели замок.

2 голосов
/ 20 июля 2011

Я думаю, что вы хотите что-то вроде этого:

#!/usr/bin/perl
use strict;
use Fcntl ':flock';

$|++; # no buffering

my $file = "status.txt";

open my $fh, '+<', $file or die "can't open $file in update mode: $!\n";
flock($fh, LOCK_EX) or die "couldn't get lock: $!\n";
my $status = <$fh>;
chomp $status;
$status = $status ? '0' : '1';
seek $fh, 0, 0;
print $fh "$status\n";
truncate($fh, tell($fh));

#print "blocking...\n"; sleep 10;

close $fh;

Это переключит содержимое файла status.txt между 1 и 0. Обратите внимание, что я открываю файл в "обновлении"режим ", потому что мне нужно читать и писать.Если вы не сделаете это таким образом, вы можете получить условия гонки.Если вы раскомментируете строку «сна», запустите ее в одном окне, затем запустите ее второй раз в другом окне, вы увидите, что второй прогон ожидает стада, пока первый прогон не закроет файл (снятие блокировки),

1 голос
/ 20 июля 2011

Если вы добавите какой-нибудь отладочный вывод, вы увидите, что flock () блокируется, и ваш скрипт работает почти правильно:

...
print "Pre lock\n";
flock($fh, LOCK_EX) or die "Could not lock '$file' - $!";
print "Post lock\n";
...

Это можно исправить с помощью побитовой или 'LOCK_EX с LOCK_NB.

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