Laboratorium 10
===============
Blokowanie plikow
-----------------
Literatura:
  * Projekt Linux czesc w podrozdziale 6
  * Stevens, "Programowanie sieciowe ...", rozdzial 3.2 (uwaga na bledy)
  * man do funkcji: flock i fcntl

1. Kompilacja: wywolaj program `make'

2. Uzytkowanie: 
  a) uruchamianie programow: client, client-flock, client-lockf, client-fcntl
  b) program client nie stosuje zadnego mechanizmu blokad
  c) program client-flock stosuje blokady typu FLOCK, ktore moga byc tylko 
     blokadami zalecanymi - blokowanie zaobserwujemy tylko, gdy uruchamiamy 
     jednoczesnie programy client-flock, tzn. tylko wtedy gdy kazdy z tych 
     programow "przestrzega" warunkow blokowania; uruchomienie zwyklego klienta
     (client) z blokujacym (client-flock) bedzie dzialac tak, jak uruchomienie
     dwoch zwyklych klientow.
  d) program client-lockf stosuje blokady typu POSIX (zarowno zalecane, jak i 
     obowiazkowe); program korzysta z wywolania funkcji lockf(), ktora zgodnie
     z dokumentacja nie istnieje, a w praktyce jest implementowana jako 
     interfejs do funkcji fcntl()
  e) program client-fcntl stosuje blokady typu POSIX (zarowno zalecane, jak i 
     obowiazkowe); program korzysta z wywolania funkcji fcntl()

3. Pliki:

db.h
        Plik naglowkowy z definicjami potrzebnymi bazie danych.

db_lib.h
        Plik naglowkowy biblioteki implementujacej dostep klientow do bazy 
	danych.

db_lib-flock.c
        Biblioteka implementujaca funkcje zadeklarowane w `db_lib.h'.
	Zaleznie od tego czy:
	a) jest zdefiniowany symbol FLOCK - korzysta z blokowania plikow typu
	   FLOCK (tylko zalecane).
	b) jest zdefiniowany symbol LOCKF - korzysta z blokowania typu POSIX
 	   (zarowno zalecane jak i obowiazkowe) poprzez wywolanie funkcji 
	   my_lock() i my_unlock() z odpowiednich bibliotek
	c) nie jest zdefiniowany zaden symbol - nie korzysta z blokad

mylock.h 
	Plik naglowkowy dla bibliotek mylock-lockf.c i mylock-fcntl.c.
	
mylock-lockf.c
	Biblioteka implementujaca funkcje my_lock() i my_unlock() 
	z zastosowaniem funkcji lockf() ("wrapper" funkcji fcntl()).
		
myfcnlt.c
	Biblioteka implementujaca funkcje my_lock() i my_unlock()
	z zastosowaniem funkcji fcntl().

client.c
        Program klienta; korzysta z funkcji zdefiniowanych w `db_lib.h'.

4. Uwagi:
  a) Mamy dwa rodzaje blokad: dzielone (tylko na pisanie, nie blokuja czytania)
     i wylaczne (blokuja czytanie i pisanie).
  b) Funkcja `flock' jest zadeklarowana w pliku naglowkowym `sys/file.h'.
  c) funkcja `lockf' pobiera kolejno: deskryptor pliku, komende i rozmiar
     rekordu do zablokowania liczac od wskaznika biezacej pozycji pliku
     (0L - caly plik do konca, liczba ujemna - tyle bajtow, ale w kierunku
     poczatku pliku, liczba dodatnia - tyle bajtow w kierunku konca pliku) 
  d) Aby korzystac z blokad obowiazkowych musimy miec jadro skompilowane tak,
     aby wspieralo takie blokady i zaznaczyc plik jako kandydata do blokady 
     obowiazkowej (w prawach dla tego pliku ustawiamy bit grupy i zabieramy bit
     execute dla grupy - kombinacja taka jest bezsensowna, dlatego nie psuje 
     niczego w istniejacym oprogramowaniu)
  e) Od wersji 2.0.32 jadra wspieranie blokowania obowiazkowego jest opcja 
     standardowa, ale system plikow, na ktorym ma dzialac blokowanie musi byc
     zamontowany z opcja "mand".
  f) Przykladowe programy klientow z blokadami typu POSIX sa napisane tak, ze
     zajmuja cale pliki - zgodnie z definicja POSIX mozna blokowac czesci
     plikow (rekordy).
  g) Zwroc uwage na warunkowa kompilacje w pliku `db_lib-flock.c' i na sposob, 
     w jaki nalezy uruchomic kompilator, aby wybrac odpowiedni wariant 
     kompilacji.

