Forum Webscript.Ru

Программирование => Perl => Тема начата: C++ от 25 Августа 2002, 22:28:13

Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: C++ от 25 Августа 2002, 22:28:13
Когда файл блокируется на запись одним процессом могут ли другие читать из него?
Когда файл заблокирован на чтение, может ли в него писать другой процесс?
Заранее сенкс.
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: xnx от 25 Августа 2002, 23:52:42
нет
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: Serchey от 26 Августа 2002, 01:06:28
xnx, ты не прав, точнее, не совсем.
Во-первых, успешность блока файлов зависит от ОС, потому что в некоторых используется что-то на подобе условной блокировки. Это похоже на светофор, когда одни учасники д.д. соблюдают правила(т.е. показывают что они хотят поставить блок, прочитать, а после, снять его), а другие нет - просто берут и жмут на красный(читают или пишут). Так что желательно протестировать свою ОС перед "употреблением".
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: Gorynych от 02 Сентября 2002, 16:11:05
Блокируеться вызовы (flock), а не процессы.
Если процесс "не хочет узновать" есть ли блокировка на файл, то ему по б-ну блокировки установленные другими процессами. Блокировка сильно зависит от файловой системы.
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: Yaroslav от 27 Декабря 2004, 15:15:16
в таком варианте есть угроза что кто то влезет в момет между выполнением блоков и изменит файл?
насколько я знаю, flock снимается при закрытии файла.

open (OLDLIST,"list.tmp");
flock(OLDLIST, LOCK_SH);
@oldlist=;
$i=@oldlist-1;
splice(@oldlist,$i,1);

open (NEWLIST,">list.tmp");
flock(NEWLIST, LOCK_SH);
print NEWLIST "";
print NEWLIST @oldlist;
close (NEWLIST);
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: Phoinix от 27 Декабря 2004, 20:56:48
Yaroslav

Где-то так


rename \'list.tmp\', \'old.tmp\';
open (OLDLIST, "old.tmp");
open (NEWLIST, "list.tmp");
flock NEWLIST, 2;
my ($line1, $line2);
while () {
$line2 = $line1 || undef;
$line1 = $_;
print NEWLIST $line2 if $line2;
}
close NEWLIST;
close OLDLIST;
unlink \'old.tmp\';
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: Yaroslav от 30 Декабря 2004, 01:43:04
Phoinix
я несовсем понимаю эти сокращения, можно обьяснить?
$line2 = $line1 || undef;
print NEWLIST $line2 if $line2;
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: ondr от 30 Декабря 2004, 09:52:37
Yaroslav
Чем тебя не устроил тот вариант, что я тебе дал по аське?

Phoinix
В третьей строчке ты явно хотел открыть на перезапись?
Если да, то какой смысл его лочить после того как очистишь?
Название: Про блокировку файлов? Профи не откажите в помощи...
Отправлено: AnnA от 30 Декабря 2004, 14:51:07
Yaroslav
если определена $line1 - присвоить ее значение $line2, иначе -  undef
если определена $line2 - печатаем ее значение в NEWLIST