Provided by: manpages-pl-dev_0.7-2_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 jest ustawiane
       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).

       W jądrach Linuksa do wersji 2.6.11 flock() nie blokował plików po NFS-ie (zasięg blokad  był  ograniczony
       do  lokalnego  systemu plików). Zamiast tego można było blokować zakresy bajtów za pomocą fcntl(2), które
       działały po NFS-ie, jeśli wersja Linuksa była w miarę nowa, a serwer obsługiwał  blokowanie.  Od  Linuksa
       2.6.12 klient NFS wspiera blokady flock(), emulując je jako blokady zakresu bajtów na cały pliku. Oznacza
       to,  że blokady fcntl(2) i flock() wchodzą z sobą w interakcje, jeśli jest używany NFS. Od Linuksa 2.6.37
       jądro wspiera tryb kompatybilności, który pozwala traktować blokady  flock()  (i  także  blokady  zakresu
       bajtów fcntl(2)) jako blokady lokalne; patrz opis opcji local_lock w nfs(5).

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

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 4.07 projektu Linux man-pages. Opis projektu, informacje
       dotyczące  zgłaszania   błędów,   oraz   najnowszą   wersję   oryginału   można   znaleźć   pod   adresem
       http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

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

       Polskie  tłumaczenie  jest  częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie błędów na stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  4.07 oryginału.

Linux                                              2016-03-15                                           FLOCK(2)