Laboratorium 12 =============== Blokowanie plikow. ------------------ Literatura: * projekt Linux czesc w podrozdziale 6 * zrodla linuxa - /usr/src/linux/Documentation/locks.txt /usr/src/linux/Documentation/mandatory.txt * man do funkcji: fcntl, flock 1. Kompilacja: wywolaj program `make' 2. Uzytkowanie: a) uruchamianie programow no_lock, p_lock, f_lock, m_lock; b) program no_lock nie stosuje zadnych blokad; posluzy do zilustrowania blokad obowiazkowych; c) program p_lock stosuje zalecane blokady posixowe, korzystajac funkcji fcntl; blokowanie zauwazamy tylko gdy uruchamiamy jednoczesnie dwa programy korzystajace z takich blokad, tzn. gdy kazda ze stron przestrzega warunkow blokowania; d) program m_lock stosuje obowiazkowe blokady tworzone za pomoca funkcji fcntl; blokowanie zauwazamy korzystajac z tego programu z dowolnym innym, w szczegolnosci z no_lock, ktory nie przestrzega zadnych zasad blokowania; e) program f_lock stosuje blokowanie zalecane typu FLOCK (a nie POSIX); blokowanie zauwazamy tylko gdy uruchamiamy jednoczesnie dwa programy korzystajace z takich blokad, tzn. gdy kazda ze stron przestrzega warunkow blokowania. 3. Pliki: err.h Plik naglowkowy do biblioteki funkcji obslugi bledow. err.c Biblioteka funkcji obslugi bledow. lock.c Program glowny, gdy korzystamy z blokowania. no-lock.c Program glowny, gdy korzystamy nie z blokowania. lock-lib.h Plik naglowkowy (wspolny) biblioteki implementujacej funkcj blokowania. lock-lib.c Biblioteka blokad typu POSIX, korzystajaca z funkcji fcntl(); zwroc uwage na kompilacje warunkowa. flock-lib.c Biblioteka blokad typu FLOCK, korzystajaca z funkcji flock(). rw-lib.h Plik naglowkowy biblioteki interakcji z uzytkownikiem i dzialan na pliku. rw-lib.c Biblioteka interakcji z uzytkownikiem i dzialan na pliku. 4. Uwagi: a) Blokady sa zakladane na i-wezly a nie na deskryptory, a wiec tylko raz - jezeli zduplikujemy deskryptor i raz zdejmiemy blokade to bedzie zdjeta w kazdym deskryptorze. b) Sa dwa rodzaje blokad - dzielone (tylko do pisania, a wiec nie blokujace operacji czytania) oraz wylaczne (blokuja czytanie i pisanie). c) Standard POSIX umozliwia korzystanie tylko z blokad zalecenych (advisory) poprzez wywolania funkcji fcntl(). d) Dla Linuxa istnieje rozszerzenie do blokad obowiazkowych (mandatory), czyli takich, ktorych przstrzeganie wymusza jadro; zmieniaja one stanardowa semantyke funkcji read() i write(), na blokowane - niestety, w przypadu mamy duzy narzut na kazde wykonanie ww. funkcji. Korzystanie z blokad obowiazkowych jest mozliwe dla systemow plikow "zamontowanych" z opcja "mand" (UWAGA !!! stanardowo jest "nomand" co moze powodowac trudnosci z uruchomieniem programow) dla plikow oznaczonych jako kandydaci do blokowanie przez ustawienie bitu set-group-id i zdjecie prawa do wykonywania dla grupy (taka kombinacja jest bezsensowna, wiec nic nie psuje). Stosowanie blokad obowiazkowych nie jest polecane ze wzgledu na mozliwosc blokad (deadlock), narzut systemowy oraz nieprzenosnosc. e) Przykladowe programy z blokadami typu POSIX sa napisane tak, ze zajmuja cale pliki - zgodnie z semantyka POSIX mozliwe jest takze niezalezne blokowanie czesci plikow (rekordow). f) Linux udostepnie rowniez funkcje lockf() bedaca wrapperem dla funkcji fcntl() (czyli korzystajaca z niej); funkcja lockf pobiera kolejno: deskryptor pliku, polecenie (jak dla fcntl()) oraz rozmiar rekordu do zablokowania liczac od wskaznika biezacej pozycji w pliku (tak jak dla funkcji lseek()). g) Funkcja flock(), zadeklarowana w pliku naglowkowym "sys/file.h", umozliwia tworzenie blokad typu FLOCK - blokady takie moga byc tylko zalecane oraz obejmowac caly plik. Blokady FLOCK nie naleza do standardu POSIX (a wiec moga byc nieprzenosne). h) Funkcje fcntl() i flock() maja standardowo semnatyke blokujaca - proba zalozenia blokady, gdy ta juz istnieje powoduje czekanie. i) Blokady typu POSIX i FLOCK "nie widza sie" wzajemnie. j) Sieciowe systemy plikow, takie jak NSF nie przestrzegaja zazwyczaj technik blokowania, wiec programy moga dzialac, a moga tez nie dzialac "przez siec" - byc moze trzeba bedzie to testowac lokalnie (np. w katalogu /tmp). k) Zwroc uwage na warunkowa kompilacje w pliku "lock-lib.c" i na sposob, w jaki nalezy uruchomic kompilator, aby wybrac odpowiedni wariant kompilacji.