Pliki specjalne
Kazde urzadzenie w Unixie jest instalowane w systemie jako osobny plik. Jest to tzw. plik specjalny. Taki sposob dostepu do urzadzen zapewnia miedzy innymi:
Przy operacjach na zwyklych plikach po wywolaniu okreslonej funkcji na zadanym pliku system operacyjny szuka wlasciwego odpowiednika dla danego systemu plikow (np. open dla ext2 o ile dany system plikow jest typu ext2). Dla pliku specjalnego odpowiadajacego pewnemu urzadzeniu system szuka funkcji wlasciwych dla danego urzadzenia. Dostarczaniem takich funkcji zajmuja sie sterowniki urzadzen.
Pliki specjalne tworzymy za pomoca instrukcji mknod. Przyklady dotyczace tworzenia plikow znajdziecie tutaj (link do tutaj). Zapis typu pliku znajduje sie w strukturze i-wezla:
struct inode
{
dev_t i_dev; //
NR URZADZENIA
unsigned long i_ino;
umode_t i_mode; //
TYP PLIKU
nlink_t i_nlink;
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev;
...
}
fs.h
typedef unsigned short dev_t;
typedef unsigned short umode_t;
types.h
TYPY PLIKOW (zapis bitowy):
0010 urzadzenie znakowe
0100 urzadzenie blokowe
Jedno urzadzenie moze miec dwa pliki - jeden dla dostepu blokowego, a drugi dla dostepu znakowego. Otrzymujemy wtedy dwa niezalezne dostepy do jednego urzadzenia. Wada takiego rozwiazania jest to, ze nie jestesmy w stanie uzyskac jednoznacznej kontroli dostepu do danego urzadzenia. W szczegolnosci trudno jest uzyskac wylaczny dostep do urzadzenia (tzn. zeby dane urzadzenie bylo naraz otwarte tylko przez jeden proces).
Numer glowny i drugorzedny
Aby dane urzadzenie mozna bylo zidentyfikowac w systemie potrzebny jest jakis unikatowy identyfikator. Jest nim wewnetrzny numer urzadzenia, zakodowany w polu "i_dev" i-wezla danego pliku. Czesto zdarza sie, ze do systemu mamy podlaczone wiele urzadzen tego samego typu (np. identyczne dyski). Nic nie stoi na przeszkodzie aby obslugiwac je identycznie. Dlatego tez kazdemu urzadzeniu zostaje przypisany numer glowny (MAJOR) oraz numer drugorzedny (MINOR). Numer glowny okresla nam grupe urzadzen do ktorej nalezy dane urzadzenie, natomiast numer drugorzedny zapewnia nam unikatowosc w danej grupie numeru glownego. Wszystkie urzadzenia z danym numerem glownym sa obslugiwane identycznie (co okaze sie dokladniej przy tablicach rozdzielczych).
Numery glowne i drugorzedne zaleza bezposrednio od wewnetrznego numeru urzadzenia. Z numeru wewnetrzego mozemy wyliczyc pozostale numery:
#define MAJOR(a) (int)((unsigned short)(a) >> 8)
#define MINOR(a) (int)((unsigned short)(a) & 0xFF)
fs.h