Автор Тема: Про блокировку файлов? Профи не откажите в помощи...  (Прочитано 4448 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн C++

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 221
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Когда файл блокируется на запись одним процессом могут ли другие читать из него?
Когда файл заблокирован на чтение, может ли в него писать другой процесс?
Заранее сенкс.

Оффлайн xnx

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 192
  • +0/-0
  • 0
    • Просмотр профиля
нет

Оффлайн Serchey

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 216
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.rivne.ukrtelecom.ua
xnx, ты не прав, точнее, не совсем.
Во-первых, успешность блока файлов зависит от ОС, потому что в некоторых используется что-то на подобе условной блокировки. Это похоже на светофор, когда одни учасники д.д. соблюдают правила(т.е. показывают что они хотят поставить блок, прочитать, а после, снять его), а другие нет - просто берут и жмут на красный(читают или пишут). Так что желательно протестировать свою ОС перед "употреблением".

Оффлайн Gorynych

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 1
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Блокируеться вызовы (flock), а не процессы.
Если процесс "не хочет узновать" есть ли блокировка на файл, то ему по б-ну блокировки установленные другими процессами. Блокировка сильно зависит от файловой системы.

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
в таком варианте есть угроза что кто то влезет в момет между выполнением блоков и изменит файл?
насколько я знаю, 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

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Yaroslav

Где-то так


rename 
\'list.tmp\', \'old.tmp\';
open (OLDLIST, "old.tmp");
open (NEWLIST, "list.tmp");
flock NEWLIST, 2;
my ($line1, $line2);
while (<OLDLIST>) {
$line2 = $line1 || undef;
$line1 = $_;
print NEWLIST $line2 if $line2;
}
close NEWLIST;
close OLDLIST;
unlink \'old.tmp\';

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
Phoinix
я несовсем понимаю эти сокращения, можно обьяснить?
$line2 = $line1 || undef;
print NEWLIST $line2 if $line2;
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Yaroslav
Чем тебя не устроил тот вариант, что я тебе дал по аське?

Phoinix
В третьей строчке ты явно хотел открыть на перезапись?
Если да, то какой смысл его лочить после того как очистишь?
0 OK, 0:1

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Yaroslav
если определена $line1 - присвоить ее значение $line2, иначе -  undef
если определена $line2 - печатаем ее значение в NEWLIST
пока-пока. :)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28