unlink (2)


6.14.2 Funkcja Unlink() Do spisu tresci tematu 6 6.14.2 Funkcja Unlink() Spis tresci Wywolanie Informacje ogolne Struktury danych wprowadzenie, inode Implementacja: wprowadzenie, algorytm, sys_unlink(), do_unlink(), ext2_unlink(). Bibliografia Pytania i odpowiedzi Wywolanie int unlink(sciezka) char *sciezka; /* nazwa pliku /* W przypadku powodzenia zwraca 0, bledu -1 */ 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: struct inode { kdev_t i_dev; unsigned long i_ino; umode_t i_mode; nlink_t i_nlink; uid_t i_uid; gid_t i_gid; kdev_t i_rdev; off_t i_size; time_t i_atime; time_t i_mtime; time_t i_ctime; unsigned long i_blksize; unsigned long i_blocks; unsigned long i_version; unsigned long i_nrpages; struct semaphore i_sem; struct inode_operations *i_op; struct super_block *i_sb; struct wait_queue *i_wait; struct file_lock *i_flock; struct vm_area_struct *i_mmap; struct page *i_pages; struct dquot *i_dquot[MAXQUOTAS]; struct inode *i_next, *i_prev; struct inode *i_hash_next, *i_hash_prev; struct inode *i_bound_to, *i_bound_by; struct inode *i_mount; unsigned short i_count; unsigned short i_flags; unsigned char i_lock; unsigned char i_dirt; unsigned char i_pipe; unsigned char i_sock; unsigned char i_seek; unsigned char i_update; unsigned short i_writecount; union { struct pipe_inode_info pipe_i; struct minix_inode_info minix_i; struct ext_inode_info ext_i; struct ext2_inode_info ext2_i; struct hpfs_inode_info hpfs_i; struct msdos_inode_info msdos_i; struct umsdos_inode_info umsdos_i; struct iso_inode_info isofs_i; struct nfs_inode_info nfs_i; struct xiafs_inode_info xiafs_i; struct sysv_inode_info sysv_i; struct affs_inode_info affs_i; struct ufs_inode_info ufs_i; struct socket socket_i; void * generic_ip; } u; }; Implementacja Wprowadzenie 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. Autor: Piotr Kawczynski

Wyszukiwarka

Podobne podstrony:
function domxml node unlink node
function unlink
unlink
unlink
function unlink
function unlink
function pg lo unlink
unlink
unlink

więcej podobnych podstron