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 posix-owe, korzystajac z 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 funkcje
	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 zalecanych (advisory)
     poprzez wywolania funkcji fcntl().
  d) Dla Linuxa istnieje rozszerzenie do blokad obowiazkowych (mandatory),
     czyli takich, ktorych przestrzeganie wymusza jadro; zmieniaja one
     standardowa 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 semantyke 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.
