flock

FLOCK(2)        Ð ÑководÑÑво пÑогÑаммиÑÑа Linux        FLOCK(2)



ÐÐЯ
       flock - ÑÑÑановиÑÑ Ð¸Ð»Ð¸ ÑнÑÑÑ advisory блокиÑÐ¾Ð²ÐºÑ Ð½Ð°
       оÑкÑÑÑÑй Ñайл

ÐÐÐÐÐ
       #include <sys/file.h>

       int flock(int fd, int operation);

ÐÐÐСÐÐÐÐ
       УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¸Ð»Ð¸ ÑÐ½Ð¸Ð¼Ð°ÐµÑ advisory (мÑгкÑÑ,
       ноÑÑÑÑÑ ÑекомендаÑелÑнÑй ÑаÑакÑеÑ) блокиÑовкÑ
       на оÑкÑÑÑÑй Ñайл, заданнÑй ÑайловÑм
       деÑкÑипÑоÑом fd.  ÐаÑамеÑÑ operation можеÑ
       пÑинимаÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений:


              LOCK_SH   УÑÑановиÑÑ ÑазделÑемÑÑ
                        блокиÑовкÑ. РазделÑемÑÑ
                        блокиÑÐ¾Ð²ÐºÑ Ð½Ð° заданнÑй Ñайл
                        Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÑжаÑÑ Ð±Ð¾Ð»ÐµÐµ Ñем один
                        пÑоÑеÑÑ.

              LOCK_EX   УÑÑановиÑÑ ÑкÑклÑзивнÑÑ
                        блокиÑовкÑ.  ТолÑко один пÑоÑеÑÑ
                        Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÑжаÑÑ ÑкÑклÑзивнÑÑ
                        блокиÑÐ¾Ð²ÐºÑ Ñайла.

              LOCK_UN   УдалиÑÑ ÑÑÑеÑÑвÑÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ,
                        ÑдеÑживаемÑÑ Ð´Ð°Ð½Ð½Ñм пÑоÑеÑÑом.


       ÐÑзов flock() Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñован, еÑли
       неÑовмеÑÑимÑй Ñип блокиÑовки Ñже
       ÑдеÑживаеÑÑÑ Ð´ÑÑгим пÑоÑеÑÑом. ЧÑÐ¾Ð±Ñ Ð²ÑполниÑÑ
       неблокиÑÑÑÑий запÑоÑ, вклÑÑиÑе LOCK_NB (ÑеÑез
       ORing) вмеÑÑе Ñ Ð¾Ð´Ð½Ð¾Ð¹ из вÑÑеопиÑанÑÑ Ð¾Ð¿ÐµÑаÑий.


       Ðдин Ñайл не Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно и
       обÑÑÑ Ð¸ ÑкÑклÑзивнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ.

       ÐлокиÑовки, ÑозданнÑе flock() аÑÑоÑииÑÑÑÑÑÑ Ñ
       Ñайлом или, более ÑоÑно, Ñ Ð·Ð°Ð¿Ð¸ÑÑÑ Ð² ÑаблиÑе
       оÑкÑÑÑÑÑ Ñайлов.  ÐÑо ознаÑаеÑ, ÑÑо дÑблиÑÑÑÑие
       ÑайловÑе деÑкÑипÑоÑÑ (ÑозданнÑе, напÑимеÑ,
       вÑзоÑвами fork(2) или dup(2)) ÑказÑваÑÑ Ð½Ð° ÑÑ Ð¶Ðµ
       ÑамÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¸ ÑÑа блокиÑовка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
       изменена или ÑнÑÑа пÑи иÑполÑзовании
       лÑбого из ÑÑÐ¸Ñ Ð´ÐµÑкÑипÑоÑов.  Таким обÑазом,
       блокиÑовка оÑвобождаеÑÑÑ Ð»Ð¸Ð±Ð¾ ÑеÑез Ñвное
       вÑполнение опеÑаÑии LOCK_UN на одном из
       дÑблиÑÑÑÑÐ¸Ñ Ð´ÐµÑкÑипÑоÑов, либо когда вÑе
       Ñакие деÑкÑипÑоÑÑ Ð±ÑдÑÑ Ð·Ð°ÐºÑÑÑÑ.

       ÐÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑолÑко деÑжаÑÑ Ð½Ð° Ñайле один из
       Ñипов блокиÑовки (ÑазделÑемÑÑ Ð¸Ð»Ð¸
       ÑкÑлÑзивнÑÑ).  ÐоÑледÑÑÑие вÑÐ·Ð¾Ð²Ñ flock() на Ñже
       заблокиÑованнÑй Ñайл бÑдÑÑ Ð¿ÑеобÑазовÑваÑÑ
       ÑекÑÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ðº Ð½Ð¾Ð²Ð¾Ð¼Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ
       ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки.

       ÐлокиÑовки, ÑозданнÑе flock() ÑоÑÑанÑÑÑÑÑ Ð¿Ñи
       вÑполнении execve(2).

       РазделÑÐµÐ¼Ð°Ñ Ð¸Ð»Ð¸ ÑкÑклÑÐ·Ð¸Ð²Ð½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовка
       Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлена на Ñайл вне
       завиÑимоÑÑи Ð¾Ñ Ñежима, в коÑоÑом ÑÑÐ¾Ñ Ñайл
       бÑл оÑкÑÑÑ.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       Ð ÑлÑÑае ÑÑпеÑа, возвÑаÑаеÑÑÑ Ð½Ð¾Ð»Ñ.  Ð ÑлÑÑае
       оÑибки возвÑаÑаеÑÑÑ -1 и знаÑение errno
       ÑÑÑанавливаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑим обÑазом.

ÐШÐÐÐÐ
       EWOULDBLOCK
              Файл блокиÑован и бÑл вÑбÑан Ñлаг LOCK_NB
              .

       EBADF  fd не ÑвлÑеÑÑÑ Ð´ÐµÑкÑипÑоÑом оÑкÑÑÑого
              Ñайла.

       EINTR  Ðо вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑÑÑановки
              блокиÑовки, вÑзов бÑл пÑеÑван
              Ñигналом, пÑиÑедÑим в обÑабоÑÑик.

       EINVAL ÐепÑавилÑно задано знаÑение operation .

       ENOLCK ЯдÑÑ Ð½Ðµ ÑваÑило памÑÑи Ð´Ð»Ñ ÑозданиÑ
              запиÑи блокиÑовки.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       4.4BSD (вÑзов flock(2) поÑвилÑÑ ÑпеÑва в 4.2BSD).  Ð
       болÑÑинÑÑве Unix'ов flock(2), Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
       Ñеализован в ÑеÑÐ¼Ð¸Ð½Ð°Ñ fcntl(2).

ÐÐÐÐЧÐÐÐЯ
       flock(2) не блокиÑÑÐµÑ ÑÐ°Ð¹Ð»Ñ Ð½Ð° NFS.  ÐÑполÑзÑйÑе
       вмеÑÑо ÑÑого вÑзов fcntl(2), коÑоÑÑй ÑабоÑÐ°ÐµÑ Ð½Ð°
       NFS, а Ñакже наиболее ÑвежÑÑ Ð²ÐµÑÑÐ¸Ñ Linux и
       ÑеÑвеÑ, коÑоÑÑй поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки.

       ÐаÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии ÑдÑа 2.0, flock(2) Ñеализован
       как ÑиÑÑемнÑй вÑзов Ñо Ñвоими ÑобÑÑвеннÑми
       пÑавами, а не как ÑмÑлÑÑÐ¸Ñ ÑÑого вÑзова в
       библиоÑеке GNU C ÑеÑез иÑполÑзование fcntl(2).
       Ðо ÑмÑÑÐ»Ñ BSD: не ÑÑÑеÑÑвÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾
       взаимодейÑÑÐ²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñипами блокиÑовок,
       ÑÑÑанавливаемÑми flock(2), fcntl(2), и flock(2) не
       Ð²Ð¸Ð´Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок Ñипа deadlock.

       flock(2) ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑолÑко advisory
       блокиÑовки; имеÑÑий ÑооÑвеÑÑвÑÑÑие пÑава на
       Ñайл, какой-либо пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ
       иÑполÑзование flock(2) и вÑполнÑÑÑ Ð½Ð°Ð´ Ñайлом
       опеÑаÑии ввода/вÑвода.

       flock(2) и блокиÑовки fcntl(2) имеÑÑ ÑазнÑй ÑмÑÑл
       Ð´Ð»Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑÐ¸Ñ ÑазвеÑÐ²Ð»ÐµÐ½Ð¸Ñ (fork) пÑоÑеÑÑов и
       dup(2).

СÐÐТРÐТРТÐÐÐÐ
       open(2), close(2), dup(2), execve(2), fcntl(2), fork(2), lockf(3)

       Ð /usr/src/linux/Documentation Ñакже еÑÑÑ ÑÐ°Ð¹Ð»Ñ locks.txt и
       mandatory.txt .

ÐÐÐ ÐÐÐÐ
       ÐеÑевÑл Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñкого ÐикÑÐ¾Ñ ÐиÑлобоков
       <corochoone@perm.ru> 2003



Linux                             2002-04-24                          FLOCK(2)