Forum Webscript.Ru
Программирование => Perl => Тема начата: C++ от 25 Августа 2002, 22:28:13
-
Когда файл блокируется на запись одним процессом могут ли другие читать из него?
Когда файл заблокирован на чтение, может ли в него писать другой процесс?
Заранее сенкс.
-
нет
-
xnx, ты не прав, точнее, не совсем.
Во-первых, успешность блока файлов зависит от ОС, потому что в некоторых используется что-то на подобе условной блокировки. Это похоже на светофор, когда одни учасники д.д. соблюдают правила(т.е. показывают что они хотят поставить блок, прочитать, а после, снять его), а другие нет - просто берут и жмут на красный(читают или пишут). Так что желательно протестировать свою ОС перед "употреблением".
-
Блокируеться вызовы (flock), а не процессы.
Если процесс "не хочет узновать" есть ли блокировка на файл, то ему по б-ну блокировки установленные другими процессами. Блокировка сильно зависит от файловой системы.
-
в таком варианте есть угроза что кто то влезет в момет между выполнением блоков и изменит файл?
насколько я знаю, 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);
-
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\';
-
Phoinix
я несовсем понимаю эти сокращения, можно обьяснить?
$line2 = $line1 || undef;
print NEWLIST $line2 if $line2;
-
Yaroslav
Чем тебя не устроил тот вариант, что я тебе дал по аське?
Phoinix
В третьей строчке ты явно хотел открыть на перезапись?
Если да, то какой смысл его лочить после того как очистишь?
-
Yaroslav
если определена $line1 - присвоить ее значение $line2, иначе - undef
если определена $line2 - печатаем ее значение в NEWLIST