flock

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



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

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

       int flock(int fd, int operation);

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

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

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

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

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

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

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

       ÐÑли пÑоÑеÑÑ Ð¸ÑполÑзÑÐµÑ open(2) (или подобнÑй
       вÑзов) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ одного
       Ñайлового деÑкÑипÑоÑа на один и ÑÐ¾Ñ Ð¶Ðµ
       Ñайл, Ñо ÑÑи ÑайловÑе деÑкÑипÑоÑÑ ÑÑиÑаÑÑÑÑ flock()
       незавиÑимÑми. ÐопÑÑка заблокиÑоваÑÑ Ñайл Ñ
       помоÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из ÑÑÐ¸Ñ ÑайловÑÑ Ð´ÐµÑкÑипÑоÑов
       Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑеÑеÑена из-за блокиÑовки,
       коÑоÑÑÑ Ð²ÑзÑваÑÑий пÑоÑеÑÑ Ñже ÑÑÑановил ÑеÑез
       дÑÑгой ÑайловÑй деÑкÑипÑоÑ.

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

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

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

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

ÐШÐÐÐÐ
       EBADF  fd не ÑвлÑеÑÑÑ Ð¾ÑкÑÑÑÑм ÑайловÑм
              деÑкÑипÑоÑом.

       EINTR  ÐÑи ожидании полÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки
              вÑзов бÑл пÑеÑван Ñигналом, пÑиÑедÑим в
              обÑабоÑÑик; Ñм. signal(7).

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

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

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

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       4.4BSD (впеÑвÑе вÑзов flock() поÑвилÑÑ Ð² 4.2BSD).
       ÐÑзов flock() еÑÑÑ Ð² болÑÑинÑÑве ÑиÑÑем UNIX,
       возможно ÑеализованнÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ fcntl(2).

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

       Ð ÑдÑÐ°Ñ Linux до веÑÑии 2.6.11, flock() не блокиÑÑеÑ
       ÑÐ°Ð¹Ð»Ñ Ð¿Ð¾ NFS (Ñ. е., оÑÐ²Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки
       огÑаниÑен локалÑной ÑиÑÑемой). ÐмеÑÑо него
       можно иÑполÑзоваÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¾Ð±Ð»Ð°ÑÑи байÑ
       fcntl(2), коÑоÑÐ°Ñ ÑабоÑÐ°ÐµÑ Ð¿Ð¾ NFS, но доÑÑÑпна в
       знаÑиÑелÑно поздней веÑÑии Linux, и ÑеÑвеÑ
       Ñакже должен поддеÑживаÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ.
       ÐаÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.12, клиенÑÑ NFS поддеÑживаÑÑ
       блокиÑовки flock(), ÑмÑлиÑÑÑ Ð¸Ñ ÑеÑез
       блокиÑÐ¾Ð²ÐºÑ Ð¾Ð±Ð»Ð°ÑÑи Ð±Ð°Ð¹Ñ Ð´Ð»Ñ Ð²Ñего Ñайла. ÐÑо
       ознаÑаеÑ, ÑÑо блокиÑовки fcntl(2) и flock()
       взаимодейÑÑвÑÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом ÑеÑез NFS. ÐаÑинаÑ
       Ñ Linux 2.6.37, ÑдÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñежим
       ÑовмеÑÑимоÑÑи, коÑоÑÑй позволÑÐµÑ ÑÑиÑаÑÑ
       блокиÑовки flock() (а Ñакже блокиÑовки
       облаÑÑи Ð±Ð°Ð¹Ñ fcntl(2)) локалÑнÑми; ÑмоÑÑиÑе
       опиÑание паÑамеÑÑа local_lock в nfs(5).

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

       flock() и fcntl(2) имеÑÑ ÑазнÑÑ ÑеманÑÐ¸ÐºÑ Ð´Ð»Ñ
       поÑождÑннÑÑ Ð¿ÑоÑеÑÑов и dup(2). Ð ÑиÑÑемаÑ, где
       Ñеализован flock() Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ fcntl(2), ÑеманÑика
       flock() бÑÐ´ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð¿Ð¸Ñанной в данной
       ÑпÑавоÑной ÑÑÑаниÑе.

       ÐÑи пÑеобÑазовании блокиÑовки (обÑÑÑ Ð²
       ÑкÑклÑзивнÑÑ Ð¸Ð»Ð¸ наобоÑоÑ) не гаÑанÑиÑÑеÑÑÑ
       аÑомаÑноÑÑÑ Ð¾Ð¿ÐµÑаÑии: ÑнаÑала ÑÑÑеÑÑвÑÑÑаÑ
       блокиÑовка ÑдалÑеÑÑÑ, а заÑем
       ÑÑÑанавливаеÑÑÑ Ð½Ð¾Ð²Ð°Ñ. ÐÐµÐ¶Ð´Ñ ÑÑими двÑмÑ
       дейÑÑвиÑми дÑÑгой пÑоÑеÑÑ, ожидаÑÑий запÑоÑ
       на блокиÑовкÑ,  Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½Ð° неÑ
       ÑазÑеÑение, в ÑледÑÑвие Ñего
       пÑеобÑазование или заблокиÑÑеÑÑÑ, или
       завеÑÑиÑÑÑ Ð½ÐµÑдаÑно, еÑли бÑл Ñказан Ñлаг
       LOCK_NB. (ÐÑо оÑигиналÑное поведение BSD
       вÑÑÑеÑаеÑÑÑ Ð²Ð¾ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð´ÑÑÐ³Ð¸Ñ ÑеализаÑиÑÑ.)

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

       Documentation/filesystem/locks.txt в иÑÑодном коде ÑдÑа
       Linux (в ÑÑаÑÑÑ ÑдÑÐ°Ñ â Documentation/locks.txt)



Linux                             2016-03-15                          FLOCK(2)