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


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)
 
 

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

 Тема:    Автор:    Дата:  
 Re: Монопольный доступ к файлу в NFS   Artem Chuprina   14 Jul 2000 11:52:58 
Архивное /ru.cgi.perl/3473fcded19e.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional