flock(2) System Calls Manual flock(2) NAZWA flock - zaklada lub zdejmuje doradcza blokade na otwartym pliku. BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int flock(int fd, int operation); OPIS Zaklada lub zdejmuje doradcza blokade na otwartym pliku, okreslonym przez fd. Parametr operation jest jednym z ponizszych: LOCK_SH Zaklada blokade wspoldzielona. W danej chwili, na danym pliku, moze ja utrzymywac wiecej niz jeden proces. LOCK_EX Zaklada blokade wylaczna. Tylko jeden proces moze ja utrzymywac na danym pliku w danej chwili. LOCK_UN Usuwa istniejaca blokade, zalozona przez biezacy proces. Wywolanie flock() moze sie zblokowac, gdy inny proces utrzymuje blokade niezgodnego typu. Aby uzyskac wywolanie nieblokujace, nalezy dodac LOCK_NB (za pomoca bitowego OR) do dowolnej z powyzszych wartosci parametru operation. Pojedynczy plik nie moze miec jednoczesnie zalozonej blokady wspoldzielonej i wylacznej. Blokady utworzone za pomoca flock() sa skojarzone z plikiem lub - dokladniej - z wpisem w tablicy otwartych plikow. Oznacza to, ze powielone deskryptory plikow (utworzone na przyklad za pomoca fork(2) lub dup(2)) odnosza sie do tej samej blokady i ta blokada moze byc zmieniana lub zwalniana za pomoca dowolnego ze wspomnianych deskryptorow. Ponadto, blokada zostaje zwolniona albo w wyniku jawnego wykonania operacji LOCK_UN na dowolnym z tych powielonych deskryptorow, albo po zamknieciu wszystkich tych deskryptorow. Jesli proces uzywa open(2) (lub podobnego) do pozyskania wiecej niz jednego deskryptora dla samego pliku, to flock() potraktuje te deskryptory niezaleznie. Jakakolwiek proba zablokowania pliku uzywajacego jednego z tych deskryptorow moze byc odrzucona przez blokade zalozona na innym z tych deskryptorow przez proces wywolujacy. Proces moze trzymac tylko jeden typ blokady (wspoldzielona lub wylaczna) na danym pliku. Kolejne wywolania flock() na juz zablokowanym pliku skonwertuja istniejaca blokade na inny typ. Blokady utworzone przez flock() sa zachowywane przez wywolania execve(2). Blokada wspoldzielona lub wylaczna moze zostac zalozona na pliku niezaleznie od trybu otwarcia tego pliku. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY EBADF fd nie jest deskryptorem otwartego pliku. EINTR Wywolanie zostalo przerwane, podczas oczekiwania na zalozenie blokady, w wyniku doreczenia i przechwycenia sygnalu przez procedure jego obslugi; patrz signal(7). EINVAL operation jest niepoprawne. ENOLCK Zabraklo pamieci dla jadra na przydzielenie rekordow dla blokad. EWOULDBLOCK Plik jest zablokowany, a byl ustawiony znacznik LOCK_NB. WERSJE Poczawszy od Linuksa 2.0, flock() jest zaimplementowane jako samodzielna funkcja systemowa, a nie jako emulacja w bibliotece GNU C za pomoca wywolania fcntl(2). Daje to prawdziwa semantyke BSD: nie ma interakcji pomiedzy blokadami roznych typow, tworzonymi za pomoca flock() oraz tworzonymi za pomoca fcntl(2), ponadto flock() nie wykrywa zakleszczenia blokad. (Nalezy jednak zauwazyc, ze na niektorych systemach, takich jak nowoczesne BSD, blokady flock() i fcntl(2) wchodza z soba w interakcje). Detale CIFS Do Linuksa 5.4, flock() nie dzialalo poprzez SMB. Plik z tego typu blokadami nie wygladal na zablokowany dla klientow zdalnych. Od Linuksa 5.5, blokady flock() sa emulowane za pomoca blokad zakresu bajtow SMB na calym pliku. Podobnie jak w NFS oznacza to, ze blokady fcntl(2) i flock() wchodza ze soba w interakcje. Kolejnym waznym skutkiem ubocznym jest to, ze blokady nie sa wowczas doradcze, kazde wejscie/wyjscie na zablokowanym pliku zawsze zawiedzie z bledem EACCES, gdy zostanie dokonane z oddzielnego deskryptora pliku. Ta roznica wynika z projektu blokad w protokole SMB, ktory udostepnia semantyke obowiazkowego blokowania. Semantyka zdalnego i obowiazkowego blokowania moze roznic sie w zaleznosci od protokolu SMB, opcji montowania i typu serwera. Wiecej informacji zawiera podrecznik mount.cifs(8). STANDARDY BSD. HISTORIA 4.4BSD (funkcja flock() pojawila sie pierwotnie w 4.2BSD). Pewna wersja flock(), prawdopodobnie zaimplementowana na podstawie fcntl(2), pojawia sie w wiekszosci systemow UNIX. Detale NFS Do Linuksa 2.6.11, flock() nie blokowalo plikow poprzez NFS (tj. zakres blokad byl ograniczony do systemu lokalnego). W zamian mozna bylo uzyc blokowania zakresu bajtow fcntl(2), ktore dzialalo poprzez NFS, przy zalozeniu, ze wystepowala odpowiednio nowa wersja Linuksa oraz serwer obslugujacy blokowanie. Od Linuksa 2.6.12, klienty NFS obsluguja blokady flock() emulujac je jako blokady zakresu bajtow fcntl(2) na calym pliku. Oznacza to, ze blokady fcntl(2) i flock() wchodza ze soba w interakcje poprzez NFS. Oznacza to rowniez, ze aby umiescic wylaczna blokade, plik musi byc otwarty do zapisu. Od Linuksa 2.6.37, jadro obsluguje rowniez tryb kompatybilnosci, pozwalajacy traktowac blokady flock() (oraz blokady regionu bajtow fcntl(2)) jak lokalne: wiecej informacji w opisie opcji local_lock w podreczniku nfs(5). UWAGI flock() tworzy jedynie blokady doradcze; proces majacy odpowiednie uprawnienia do pliku, moze swobodnie zignorowac fakt uzycia flock() i wykonywac operacje wejscia/wyjscia na tym pliku. Blokady flock() i fcntl(2) rozna sie semantycznie, jesli chodzi o procesy potomne i dup(2). W systemach implementujacych flock() za pomoca fcntl(2), semantyka flock() bedzie inna niz ta opisana w tym podreczniku. Nie jest gwarantowane, ze konwersja blokady (z dzielonej na wylaczna lub na odwrot) bedzie atomowa: istniejaca blokada moze byc najpierw usunieta, a nastepnie moze byc zalozona nowa blokada. Pomiedzy tymi dwoma krokami blokade moze uzyskac inny proces oczekujacy na nia, co spowoduje, ze konwersja blokady albo bedzie oczekiwala, albo sie nie powiedzie, jesli podano LOCK_NB. (Jest to oryginalne zachowanie z BSD, wystepujace rowniez w wielu innych implementacjach). ZOBACZ TAKZE flock(1), close(2), dup(2), execve(2), fcntl(2), fork(2), open(2), lockf(3), lslocks(8) Documentation/filesystems/locks.txt w kodzie zrodlowym jadra Linuksa (Documentation/locks.txt w przypadku starszych jader) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. flock(2)