|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/12770b640de7d.html, оценка из 5, голосов 10
|