[ Pobierz całość w formacie PDF ]
.6.14.2 Funkcja Unlink()Do spisutresci tematu 66.14.2 Funkcja Unlink()Spis tresciWywolanieInformacje ogolneStruktury danychwprowadzenie,inodeImplementacja:wprowadzenie,algorytm,sys_unlink(),do_unlink(),ext2_unlink().BibliografiaPytania i odpowiedziWywolanieint unlink(sciezka)char *sciezka; /* nazwa pliku/* W przypadku powodzenia zwraca 0, bledu -1 */Informacje ogolneFunkcja systemowa unlink usuwa dowiazaniedo pliku z katalogu oraz zmniejsza o jeden licznik dowiazando tego pliku przechowywany w i-wezle.Jesli w rezultacie tej operacji licznik przyjmie wartosczero, to zostanie usuniety rowniez sam plik.Oznaczato udostepnienie zajmowanej przez niego przestrzeni dyskowejinnym plikom (dodanie jej do listy wolnych blokow) oraz zwolnieniesamego i-wezla.Jezeli licznik dowiazan osiagnie wartosc zero, podczas gdy dany plikjest nadal uzywany (tzn.otwarty) przez inny proces, tousuniecie pliku bedzie wstrzymywane do czasu jego zamkniecia.Struktury danychWprowadzenieGlowna struktura danych na ktorejdokonywane sa operacje dla funkcjiunlink 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;};ImplementacjaWprowadzenieKod zrodlowy tej funkcji znajduje sie w pliku linux/fs/namei.c,a czesc zalezaca bezposrednio od konkretnego systemu plikow w jednymz podkatalogow w katalogu lunux/fs.Opisany nizej algorytmopiera sie na systemie plikow ext2.I algorytm jest zdefiniowanyw pliku linux/fs/ext2/namei.c.Procedura sys_unlink (opisana ponizej) jest wykonywana w trybiejadra 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 modyfikowanyjezeli tak zwroc blad;Jezeli i-wezel katalogu znalezionego pliku jest roznyod i-wezla katalogu macierzystego szukanego pliku to wroc do PowtarzajSprawdz czy jezeli urzytkownik bierzacy nie ma praw do usunieciadowiazania i urzytkownik nie jest superurzytkownikiem, to czyjest 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;}BibliografiaPliki zrodlowe Linuxa:include/linux/fs.hfs/namei.cfs/ext2/namei.cBach J.M.,Budowa systemu operacyjnego UnixRochkind M.J.,Programowanie w systemie Unix dla zaawansowanychPytania i odpowiedziProsze kierowac pytania pod moim adresem dotyczace danego tematuna ktore postaram sie odpowiedziec.Odpowiedzi prosze szukac wlasniew tym miejscu.Autor: Piotr Kawczynski
[ Pobierz całość w formacie PDF ]