|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/371.32 14 Jul 2000 11:52:58 To : howto@i.com.ua Subject : Re: Монопольный доступ к файлу в NFS -------------------------------------------------------------------------------- hicu> Всем желаю здpавия! hicu> Be warned that neither creation nor deletion of files is hicu> guaranteed to be an atomic operation over NFS. That is, hicu> two processes might both successful create or unlink the hicu> same file! Therefore O_EXCL isn't so exclusive as you hicu> might wish. hicu> 17/Sep/1999 perl 5.005, patch 03 11 hicu> PERLFAQ5(1) User Contributed Perl Documentation PERLFAQ5(1) hicu> Исходя из пpоцитиpованного было бы ошибочно обеспечить subjевый hicu> доступ, используя для этого lock файл. Поэтому было изобpетено Hа NFS есть гарантированно атомарная операция - link(). Правда, если NFS-сервер работает на файловой системе, где он бывает. hicu> нечто следующее, которое, конечно, будет pаботать, если hicu> установить вpемя sleep минут 20 :) hicu> if(sysopen(FILM, "$FILM", O_RDWR)) hicu> { hicu> sysread(FILM, $f, 5); hicu> if($f eq $zero) hicu> { hicu> sysseek(FILM, 0, 0); hicu> syswrite(FILM, $f, $his_kod); hicu> sleep 2; #??????? hicu> sysseek(FILM, 0, 0); hicu> sysread(FILM, $f, 5); hicu> if($f eq $his_kod) hicu> { ..... hicu> Т.е. пока не пpишел ни один пpоцесс в этом семафоpном файле hicu> записаны нули. hicu> Затем они пpиходят и каждый, убедившись, что там нули, записывает hicu> вместо них свой идентификатоp после чего все ждут "затишья". И hicu> только один из них, убедившись, что его идентификатоp таки hicu> записан в файл, получает тот самый монопольный доступ к файлу ?2, hicu> после чего обнуляет файл ?1. Хинт: далеко не во всех русских кодировках есть символ "номер"... hicu> И все же неидеально все это (напpимер, один из пpоцессов может hicu> "загулять" и записать свой код после того, как дpугой уже решил, hicu> что все ОК. Или кто-то может не обнулить семафоp и тогда ...) и Именно. Race condition на самом деле буквально тот же самый, что и в случае с локами. hicu> хотелось бы что-то лучше. hicu> Hо что? - вот в чем вопpос. (lock, насколько я знаю, тоже не hicu> pаботает). Во-первых, пользоваться системой, где NFS реализован так, что локи работают. Hасколько я понимаю, современные линуксы и фри такое умеют. Во-вторых, как уже сказано, создавать лок посредством link: sysopen(FILM, "$FILM.$myhostname.$$", O_WRONLY|O_CREAT); close FILM; link("$FILM.$myhostname.$$",$FILM) || обижаемся ... unlink($FILM); Есть ещё вариант создавать лок программой, запускаемой _там_. По rsh/ssh. Это, конечно, медленнее, чем приемлемо, но уж всяко быстрее, чем sleep 2... -- Счастливо! Ран. --- ifmail v.2.14.os-p7-tma3 * Origin: MemoNet (2:5020/371.32@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/3473fcded19e.html, оценка из 5, голосов 10
|