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¶
Uwaga! To tłumaczenie może być nieaktualne!
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.
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 flock
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.