Do tematu:  System plików

Do tematu   Struktury danych

file_operations
Typ  
Nazwa 
Opis 
int (*lseek) (struct inode *, struct file *, off_t, int);  lseek zmiana miejsca, w ktorym zostanie wykonana następna operacja odczytu lub zapisu.
int (* ) (struct inode *, struct file *, char *, int);  read czytanie z urządzenia
int (* ) (struct inode *, struct file *, const char *, int);  write pisanie na urządzenie
int (* ) (struct inode *, struct file *, void *, filldir_t);  readdir
int (* ) (struct inode *, struct file *, int, select_table *);  select odpytywanie urządzen
int (* ) (struct inode *, struct file *, unsigned int, unsigned long);  ioctl ogólny interface dla wszystkich poleceń specyficznych dla urządzen, których nie da się zrealizowac za pomocą pozostałych funkcji. Sa to przeważnie funkcje sterownicze, definiujące parametry pracy danego urządzenia.
int (* ) (struct inode *, struct file *, struct vm_area_struct *);  mmap
int (* ) (struct inode *, struct file *);  open otwieranie pliku specjalnego
void (* ) (struct inode *, struct file *);  release zamykanie pliku specjalnego
int (* ) (struct inode *, struct file *);  fsync synchronizacja zapis buforów na dysk
int (* ) (struct inode *, struct file *, int);  fasync
int (* ) (kdev_t dev);  check_media_change dla urządzen z wymienialnym nośnikiem, 
sprawdza, czy nosnik został zmieniony
int (* ) (kdev_t dev); revalidate dla urządzen z wymienialnym nosnikiem 
uaktualnia wszystkie informacje, jakie system posiada o urządzeniu (np. tablice i-węzłów)

Opis ogólny

W Linuxie, tak jak w innych Unixach, dostęp do urzędzeń zewnetrznych odbywa sie poprzez system plikow. Wobec tego operacje wykonywane na urządzeniach zewnetrznych są takie same, jak na plikach - są to: open, close, read, write, lseek lecz takze ioctl, select, check_media_change i revalidate.

Jeśli plik, na ktorym któraś z tych operacji jest wykonywana jest plikiem specjalnym (tzn. plikiem urzadzenia), to wówczas przypisana mu w jego i-węźle tablica rozdzielcza file_operations wskazuje na tablicę danego urzędzenia i jest wykonywana funkcja specyficzna dla tego urządzenia.

Tablica rozdzielcza zdefiniowana jest za pomocą powyższej struktury (zawartej w pliku include/linux/fs.h):

Jak widac, wszystkie funkcje dostaja wskaznik na i-węzel oraz na plik, lub zakodowany numer główny i drugorzędny urzadzenia. W pierwszym przypadku poznają drugorzedny numer urządzenia (potrzebny do jego zidentyfikowania) ze struktury reprezentujacej i-wezeł (pole rdev).

Nalezy jednak zaznaczyc, że znaczna większosc rzeczy, które system musi zrobic, wykonuje sama funkcja systemowa, wobec czego charakterystyczna dla urządzenia funkcja może byc bardzo krótka, lub wręcz nie robić nic (tak jest często np. w przypadku lseek).

Niektóre pola tablicy rozdzielczej nie mają nic wspolnego z urządzeniami ( readdir).
Np. fsync sluzy do synchronizacji (zapis buforów na dysk) .

Wobec tego, proces wykonywania funkcji systemowych dla plikow specjalnych można podzielić na dwie czesci:

1.Wykonanie funkcji systemowej, praktycznie identyczne jak dla pliku zwykłego;
2.Wykonanie funkcji specyficznej dla urządzenia, wskazywanej przez odpowiedni element tablicy rozdzielczej.

Funkcje specyficzne dla urządzen są zdefiniowane w programach obslugi urządzen znajdujących się w katalogu drivers/char lub drivers/block (dla urzadzen znakowych i blokowych, odpowiednio). Są one inne dla każdego rodzaju urządzenia (tzn. dla każdego urządzenia o innym numerze glównym).

Dlatego też dużo ciekawszymi funkcjami są specyficzne dla plików specjalnych funkcje select, ioctl, check_media_change i revalidate. 


Bibliografia

1.Projekt Linux
2.M.Bach -Budowa systemu operacyjnego UNIX


Autor: Tomasz Sawicki