Informacje ogolne Funkcja systemowa unlink usuwa dowiazanie do pliku z katalogu oraz zmniejsza o jeden licznik dowiazan do tego pliku przechowywany w i-wezle. Jesli w rezultacie tej operacji licznik przyjmie wartosc zero, to zostanie usuniety rowniez sam plik. Oznacza to udostepnienie zajmowanej przez niego przestrzeni dyskowej innym plikom (dodanie jej do listy wolnych blokow) oraz zwolnienie samego i-wezla. Jezeli licznik dowiazan osiagnie wartosc zero, podczas gdy dany plik jest nadal uzywany (tzn. otwarty) przez inny proces, to usuniecie pliku bedzie wstrzymywane do czasu jego zamkniecia.
Struktury danych
Wprowadzenie
Glowna struktura danych na ktorej dokonywane sa operacje dla funkcji unlink jest sturktura i-wezla (inode).
Struktura inode (przypomnienie)
Oto dokladna definicja struktury inode z pliku include/linux/fs.h:
Kod zrodlowy tej funkcji znajduje sie w pliku linux/fs/namei.c, a czesc zalezaca bezposrednio od konkretnego systemu plikow w jednym z podkatalogow w katalogu lunux/fs. Opisany nizej algorytm opiera sie na systemie plikow ext2. I algorytm jest zdefiniowany w pliku linux/fs/ext2/namei.c. Procedura sys_unlink (opisana ponizej) jest wykonywana w trybie jadra systemu.
Funkcja sys_unlink()
DEFINICJA: asmlinkage int sys_unlink(pathname) const char *pathname;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Kopiuj plik do wolnej przestrzeni adresowej jadra; Wywolaj funkcje do_unlink(); Zwolnij zarezerwowane strony przestrzeni jadra systemu; }
Funkcja do_unlink()
DEFINICJA: int do_unlink(name) const char *name;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Zwroc i-wezel katalogu macierzystego danego pliku(dir_namei); Sprawdz czy plik nie jest tylko do odczyty(IS_RDONLY); Sprawdz czy w katalogu jest prawo do pisania(MAY_WRITE) i wykonywania(MAY_EXEC); Sprawdz czy i-wezel katalogu moze byc modyfikowany(IS_APPEND); Sprawdz czy dostepna jest operacja unlink; Wywolaj funkcje charakterystyczna dla systemu plikow (w naszym przypadku ext2_unlink); }
Funkcja ext2_unlink()
DEFINICJA: int ext2_unlink(dir, name, len) struct inode *dir; const char *name; int len;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Powtarzaj: Znajdz plik o poszukiwanej nazwie i zwroc bufor; Pobierz i-wezel katalogu macierzystego znalezionego pliku; Sprawdz czy katalog lub urzytkownik ma prawo do usuniecia dowiazania; Sprawdz czy mozna modyfikowac i-wezel lub czy jest modyfikowany jezeli tak zwroc blad; Jezeli i-wezel katalogu znalezionego pliku jest rozny od i-wezla katalogu macierzystego szukanego pliku to wroc do Powtarzaj
Sprawdz czy jezeli urzytkownik bierzacy nie ma praw do usuniecia dowiazania i urzytkownik nie jest superurzytkownikiem, to czy jest wlascicielem pliku lub katalogu macirzystego; Usun dane o pliku z tablicy plikow; Zapisz informacje z bufora na plik i czekaj az operacja sie zakonczy; Zmien czas zmian w i-wezle katalogu bierzacym; Zmien czas zmian w i-wezle pliku na ustalony wczesniej dla katalogu; Zwolnij bufor; Zwolnij i-wezel pliku; Zwolnij i-wezel katalogu; }
Bibliografia
Pliki zrodlowe Linuxa:
include/linux/fs.h
fs/namei.c
fs/ext2/namei.c
Bach J.M., Budowa systemu operacyjnego Unix
Rochkind M.J., Programowanie w systemie Unix dla zaawansowanych
Pytania i odpowiedzi
Prosze kierowac pytania pod moim adresem dotyczace danego tematu na ktore postaram sie odpowiedziec. Odpowiedzi prosze szukac wlasnie w tym miejscu.