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 nodefunction unlinkunlinkunlinkfunction unlinkfunction unlinkfunction pg lo unlinkunlinkunlinkwięcej podobnych podstron