bionic (2) flock.2.gz

Provided by: manpages-pl-dev_0.7-1_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.