Provided by: manpages-pl-dev_20060617-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.  Parameter 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ć w
       dowolnej z powyższych wartości operation LOCK_NB  (za  pomocą  bitowego
       OR).

       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 przyład  za  pomocą  fork(2)
       lub  dup(2))  odnoszą  się  do  tej samej blokady i ta blokada może być
       zmieniana  lub  zwalnaina   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 wszytkich tych deskryptorów.

       Proces   może   utrzymywać   dla   pliku  tylko  jeden  rodzaj  blokady
       (współdzieloną  lub  wyłączną).   Późniejsze   wywołania   flock()   są
       zachowywane poprzez 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 errno.

BŁĘDY

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

       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.

       EINVAL operation jest niepoprawne.

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

ZGODNE Z

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

UWAGI

       flock(2) nie blokuje plików przez NFS. Należy zamiast tego korzystać  z
       fcntl(2):  ta  funkcja  działa  przez  NFS,  o  ile wersja Linuksa jest
       dostatecznie nowe i serwer wspiera blokowanie.

       Począwszy od jądra 2.0, flock(2) jest zaimplementowane jako samodzielna
       funkcja  systemowa,  zamiast  jej emulacji 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(2) oraz
       tworzonymi za pomocą  fcntl(2).   flock(2)  Nie  wykrywa  zakleszczenia
       blokad.

       flock(2)   tworzy   jedynie   blokady   doradcze;   proces  posiadający
       odpowiednie uprawnienia do pliku, może swobodnie zignorować fakt użycia
       flock(2) i wykonywac operacje we/wy na tym pliku.

       Blokady  flock(2) i fcntl(2) posiadają różną semantykę w odniesieniu do
       rozgałęzionych procesów oraz dup(2).

ZOBACZ TAKŻE

       open(2), close(2), dup(2), execve(2), fcntl(2), fork(2).  lockf(3)

       Istnieją    także     pliki     locks.txt     i     mandatory.txt     w
       /usr/src/linux/Documentation.