Provided by: manpages-pl-dev_4.15.0-9_all bug

NAZWA

       flock - założenie lub zdjęcie doradczej blokady na otwartym pliku.

SKŁADNIA

       #include <sys/file.h>

       int flock(int fd, int operation);

OPIS

       Zakłada  lub  zdejmuje  doradczą blokadę na otwartym pliku, określonym przez fd.  Parametr
       operation jest jednym z poniższych:

           LOCK_SH  Założenie blokady współdzielonej. Więcej niż jeden proces może ją  utrzymywać
                    na danym pliku w danej chwili.

           LOCK_EX  Założenie  blokady  wyłącznej. Tylko jeden proces może ją utrzymywać na danym
                    pliku w danej chwili.

           LOCK_UN  Usunięcie istniejącej blokady, założonej przez bieżący proces.

       Wywołanie flock()  może się zblokować, gdy inny proces utrzymuje blokadę niezgodnego typu.
       Aby  uzyskać  wywołanie  nieblokujące,  należy  dodać  LOCK_NB  (za pomocą bitowego OR) do
       dowolnej z powyższych wartości parametru operation.

       Pojedynczy plik nie może mieć jednocześnie założonej blokady współdzielonej i wyłącznej.

       Blokady utworzone za pomocą flock()  są skojarzone z plikiem lub - dokładniej - z wpisem w
       tablicy  otwartych  plików.   Oznacza  to,  że  powielone deskryptory plików (utworzone na
       przykład za pomocą fork(2) lub dup(2))  odnoszą się do tej samej blokady i ta blokada może
       być  zmieniana  lub  zwalniana  za pomocą dowolnego ze wspomnianych deskryptorów. Ponadto,
       blokada zostaje zwolniona albo w wyniku jawnego wykonania operacji LOCK_UN na  dowolnym  z
       tych powielonych deskryptorów, albo po zamknięciu wszystkich tych deskryptorów.

       Jeśli  proces  używa  open(2) (lub podobnego) do pozyskania więcej niż jednego deskryptora
       dla samego pliku, to flock() potraktuje  te  deskryptory  niezależnie.  Jakakolwiek  próba
       zablokowania  pliku  używającego  jednego  z  tych  deskryptorów  może być odrzucona przez
       blokadę założoną na innym z tych deskryptorów przez proces wywołujący.

       Proces może trzymać tylko jeden typ blokady (współdzieloną lub wyłączną) na  danym  pliku.
       Kolejne  wywołania   flock()  na  już zablokowanym pliku skonwertują istniejącą blokadę na
       inny typ.

       Blokady utworzone przez flock() są zachowywane przez wywołania execve(2).

       Blokada współdzielona lub wyłączna może zostać założona  na  pliku  niezależnie  od  trybu
       otwarcia tego pliku.

WARTOŚĆ ZWRACANA

       On  success, zero is returned.  On error, -1 is returned, and errno is set to indicate the
       error.

BŁĘDY

       EBADF  fd nie jest deskryptorem otwartego pliku.

       EINTR  Wywołanie zostało przerwane podczas  oczekiwania  na  założenie  blokady  w  wyniku
              doręczenia i przechwycenia sygnału przez procedurę jego obsługi; patrz signal(7).

       EINVAL operation jest niepoprawne.

       ENOLCK Zabrakło pamięci dla jądra na przydzielenie rekordów dla blokad.

       EWOULDBLOCK
              Plik jest zablokowany, a był ustawiony znacznik LOCK_NB.

ZGODNE Z

       4.4BSD  (funkcja  flock()  pojawiła  się  pierwotnie  w  4.2BSD).  Pewna  wersja  flock(),
       prawdopodobnie zaimplementowana na podstawie fcntl(2), pojawia się w  większości  systemów
       UNIX.

UWAGI

       Począwszy  od jądra 2.0, flock() jest zaimplementowane jako samodzielna funkcja systemowa,
       a nie jako emulacja w bibliotece GNU C za pomocą wywołania  fcntl(2).  Daje  to  prawdziwą
       semantykę  BSD:  nie  ma interakcji pomiędzy blokadami różnych typów, tworzonymi za pomocą
       flock() oraz tworzonymi za pomocą fcntl(2),  ponadto  flock()  nie  wykrywa  zakleszczenia
       blokad.  (Należy  jednak  zauważyć, że na niektórych systemach, takich jak nowoczesne BSD,
       blokady flock() i fcntl(2) wchodzą z sobą w interakcje).

       flock() tworzy jedynie blokady doradcze; proces mający odpowiednie uprawnienia  do  pliku,
       może  swobodnie zignorować fakt użycia flock() i wykonywać operacje wejścia/wyjścia na tym
       pliku.

       Blokady flock() i fcntl(2) różną się  semantycznie,  jeśli  chodzi  o  procesy  potomne  i
       dup(2).  W systemach implementujących flock() za pomocą fcntl(2), semantyka flock() będzie
       inna niż ta opisana w tym podręczniku.

       Nie jest gwarantowane, że konwersja blokady (z dzielonej na wyłączną lub na odwrót) będzie
       atomowa: istniejąca blokada może być najpierw usunięta, a następnie może być założona nowa
       blokada. Pomiędzy tymi dwoma krokami blokadę może uzyskać inny proces oczekujący  na  nią,
       co  spowoduje,  że konwersja blokady albo będzie oczekiwała, albo się nie powiedzie, jeśli
       podano LOCK_NB. (Jest to oryginalne zachowanie z BSD, występujące również w  wielu  innych
       implementacjach).

   NFS details
       In  Linux  kernels up to 2.6.11, flock()  does not lock files over NFS (i.e., the scope of
       locks was limited to the local system).   Instead,  one  could  use  fcntl(2)   byte-range
       locking,  which  does  work  over  NFS, given a sufficiently recent version of Linux and a
       server which supports locking.

       Since Linux 2.6.12, NFS clients support flock()   locks  by  emulating  them  as  fcntl(2)
       byte-range  locks  on  the  entire  file.  This means that fcntl(2)  and flock()  locks do
       interact with one another over NFS.  It also means that in order  to  place  an  exclusive
       lock, the file must be opened for writing.

       Since  Linux  2.6.37,  the kernel supports a compatibility mode that allows flock()  locks
       (and also fcntl(2)  byte region locks) to be treated as local; see the discussion  of  the
       local_lock option in nfs(5).

   CIFS details
       In  Linux  kernels up to 5.4, flock()  is not propagated over SMB.  A file with such locks
       will not appear locked for remote clients.

       Since Linux 5.5, flock()  locks are emulated with SMB byte-range locks on the entire file.
       Similarly  to NFS, this means that fcntl(2)  and flock()  locks interact with one another.
       Another important side-effect is that the locks are not advisory  anymore:  any  IO  on  a
       locked  file will always fail with EACCES when done from a separate file descriptor.  This
       difference originates from the design  of  locks  in  the  SMB  protocol,  which  provides
       mandatory locking semantics.

       Remote  and  mandatory  locking  semantics  may  vary with SMB protocol, mount options and
       server type.  See mount.cifs(8)  for additional information.

ZOBACZ TAKŻE

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

       Documentation/filesystems/locks.txt     w     kodzie     źródłowym      jądra      Linuksa
       (Documentation/locks.txt w przypadku starszych jąder)

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  5.13  projektu Linux man-pages. Opis
       projektu, informacje dotyczące zgłaszania błędów oraz  najnowszą  wersję  oryginału  można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony  podręcznika  są:  Przemek  Borys
       <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Robert  Luberda
       <robert@debian.org>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.