Do tematu Struktury danych
|
|
|
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) |
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.