flock

FLOCK(2)                PodrÄcznik programisty Linuksa                FLOCK(2)



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)