Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Konstantin Tokar                     2:5020/400     30 May 2001  12:05:33
 To : All
 Subject : Re: Расскажите, как нормально дедается блокирование файла
 -------------------------------------------------------------------------------- 
 
 > Сабж, pls. Т.е, если на сайт заходит одновременно несколько человек и
 > запускают скрипты, которые могут читать/писать в файл. Как обычно делается
 > блокировка?
 
 Вот пример из документации по DB_File. Я примерно так (с каким-то
 косметическим изменением) делал. Хотя я бы пару раз подумал - а стоит ли
 писать в один и тот же файл разным скриптам - задержки могут быть, и
 неразбериха.
 
     use DB_File;
 
     use strict;
 
     sub LOCK_SH { 1 }
     sub LOCK_EX { 2 }
     sub LOCK_NB { 4 }
     sub LOCK_UN { 8 }
 
     my($oldval, $fd, $db, %db, $value, $key);
 
     $key = shift || 'default';
     $value = shift || 'magic';
 
     $value .= " $$";
 
     $db = tie(%db, 'DB_File', '/tmp/foo.db', O_CREAT|O_RDWR, 0644) 
             || die "dbcreat /tmp/foo.db $!";
     $fd = $db->fd;
     print "$$: db fd is $fd\n";
     open(DB_FH, "+<&=$fd") || die "dup $!";
 
     unless (flock (DB_FH, LOCK_SH | LOCK_NB)) {
         print "$$: CONTENTION; can't read during write update!
                     Waiting for read lock ($!) ....";
         unless (flock (DB_FH, LOCK_SH)) { die "flock: $!" }
     } 
     print "$$: Read lock granted\n";
 
     $oldval = $db{$key};
     print "$$: Old value was $oldval\n";
     flock(DB_FH, LOCK_UN);
 
     unless (flock (DB_FH, LOCK_EX | LOCK_NB)) {
         print "$$: CONTENTION; must have exclusive lock!
                     Waiting for write lock ($!) ....";
         unless (flock (DB_FH, LOCK_EX)) { die "flock: $!" }
     } 
 
     print "$$: Write lock granted\n";
     $db{$key} = $value;
     $db->sync;  # to flush
     sleep 10;
 
     flock(DB_FH, LOCK_UN);
     undef $db;
     untie %db;
     close(DB_FH);
     print "$$: Updated db to $key=$value\n";
 -- 
 Konstantin Tokar (http://www.mpei.ac.ru/tokar)
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Расскажите, как нормально дедается блокирование файла   Alexander Averbuh   29 May 2001 21:10:00 
 Re: Расскажите, как нормально дедается блокирование файла   Konstantin Tokar   30 May 2001 12:05:33 
 Re: Расскажите, как нормально дедается блокирование файла   Artem Chuprina   30 May 2001 14:27:24 
 Re: Расскажите, как нормально дедается блокирование файла   Ilya Genkin   30 May 2001 15:35:53 
 Re: Расскажите, как нормально дедается блокирование файла   Yuriy Kaminskiy   31 May 2001 18:13:01 
Архивное /ru.cgi.perl/12770b640de7d.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional