Provided by: manpages-pl-dev_4.13-4_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

       Po  pomyślnym  zakończeniu  zwracane  jest zero. Po błędzie zwracane jest -1 i odpowiednio ustawiane jest
       errno.

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).

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.10 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  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.

Linux                                          15 września 2017 r.                                      FLOCK(2)