Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Блокировка файла


Автор: study 22.8.2005, 13:32
Привет Всем!
Народ, хочу проконсультироваться по блокировки файла.
У меня два скрипта обращаются (чтение/запись) с файлом. Мне надо, чтобы они вместе не работали.
Делаю я так
Код

#!/usr/bin/perl
use Fcntl qw(:DEFAULT :flock);
open(DEV, "+</dev/cua0") or die "Cannot open port cua0";
unless (flock(DEV, LOCK_EX|LOCK_NB)){
        warn "cannot immediately write-lock the file ($!), blocking ... ";
        unless (flock(DEV, LOCK_EX)) {
                die "Cannot get write-lock on numfile: $!";
        }
}
print DEV "ХХХ";                         
close (DEV);


Вопрос. Будит ли этот код ожидать пока файл освободиться и сколько?

Автор: chaos 22.8.2005, 13:36
вот посмотри пример
Код

#!/usr/bin/perl -w
use strict;
use CGI qw(:all);
use Fcntl qw(:flock);
my $path_file = "/tmp/delivery.txt";
my $semaphore_file="/tmp/delivery.sem";
sub get_lock {
open (SEM, ">$semaphore_file") || die "Невозможно создать семафор: $!";
flock (SEM, LOCK_EX) || die "невозможно заблокировать файл";
}
sub release_lock {
close(SEM);
}
sub save {
get_lock();
open (M, ">>$path_file") || die "$!";
print M param('email'), " ", param('i1'), " ", param('i2'), " ", param('i3'), "\n";
close (M);
release_lock();
}
 
print header;
if (defined param('submit')) {
save();
}


Автор: study 22.8.2005, 13:56
А здесь же по-моему, только файл delivery.sem блокируеться, а непосредственно delivery.txt нет, или я не прав smile

Автор: chaos 22.8.2005, 14:05
прав, он как раз и сигнализирует о том что файл заблокированн

Автор: study 22.8.2005, 14:09
значит, если другая программа захочеть открыть файл delivery.txt ей это удастся smile

Мой пример вроде работает, только я не доконца его понимаю.

Автор: sharq 22.8.2005, 15:53
study это стандартная блокировка файла (из Perl-рецептов).
Скрипт будет ждать до тех пор, пока процесс, поставивший блок, не завершиться, т.е. пока не закончится работа с файлом, как только процесс завершился, скрипт получает доступ к файлу.

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

Если интересно можешь, посмотреть вариант блокировки файлов без использование функции flock - одноименная статья лежит в faq'e.

smile

Автор: study 23.8.2005, 08:30
Спасибо почитаю smile

Автор: rcdimon 25.8.2005, 12:06
Обычно блокировка идет через семафор. Файл- семафор. И блокируется он, а не непосредственно тот с которым работаешь. Потому что могут произойти ошибки и при блокеровке и при проверки ее. И содержимое файла может быть нарушено. А в Файле-семафоре- содержимое не играет роли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)