URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 845
[ Назад ]

Исходное сообщение
"Perl - как грамотно залочить файлы при записи в них?"

Отправлено alex 946 , 03-Ноя-02 08:16 
Прочёл http://www.samag.com/documents/s=4075/sam1013019385270/sam02...

там рекомендуется

    use Fcntl ':flock';  # import LOCK_* constants

    open COUNTER, "<counter.dat"
     or die "Can't read-open: $!";

    flock COUNTER, LOCK_EX;  #

А в другом скрипте (рабочем) я нашёл

    if(open(GET, "<$gf_path")) {
        flock(GET, '2');
        @gf_contents = <GET>;
        close(GET);

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


Содержание

Сообщения в этом обсуждении
"RE: Perl - как грамотно залочить файлы при записи в них?"
Отправлено uldus , 03-Ноя-02 13:23 
Когда читаешь из файла:
open(F,"<test");
flock(F,1);
....
close(F);

Когда пишешь в файл:
open(F,">test");
flock(F, 2);
....
close(F);

Лучше, когда переписывашь файл, создавать временный файл, т.е. пирмерно так:
if (-f "test.tmp"){
   die "File locked !";
}
open(F,">test.tmp");
flock(F,1);
....
close(F);
rename("test.tmp", "test"); # Атомарное переименование.

Это простейший пример, нужно еще следить за тем, чтобы test.tmp не остался после аварийного падения скрипта и не заблокировал всю дальнейшую работу. Т.е. условие для максимального времени жизни лока в 30 секунд будет примерно такое:

if (-f "test.tmp" ){
   if ((time() - stat("test.tmp"))[9] <= 30){
      die "File locked !";
   } else {
      unlink("test.tmp"); # Время жизни лока истекло.
   }
}