From: Simone Piccardi Date: Tue, 8 May 2001 16:39:23 +0000 (+0000) Subject: Sistemati alcuni paragrafi, aggiunta unlink X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=d221933f291df0359b27580e8ab6d21a752d848d;p=gapil.git Sistemati alcuni paragrafi, aggiunta unlink --- diff --git a/filedir.tex b/filedir.tex index f68576f..eaee409 100644 --- a/filedir.tex +++ b/filedir.tex @@ -100,59 +100,58 @@ disposizione per i dati e le directory. \label{fig:filedir_disk_filesys} \end{figure} -Se si va ad esaminare come è strutturata l'informazione all'interno del -filesystem (tralasciando le parti che non riguardano direttamente la gestione -di file e directory come il super-block) avremo una situazione del tipo di -quella esposta in \nfig. - +Se si va ad esaminare come è strutturata l'informazione all'interno di un +singolo filesystem (tralasciando le parti connesse alla strutturazione e al +funzionamento del filesystem stesso come il super-block) avremo una situazione +del tipo di quella esposta in \nfig. \begin{figure}[htb] \centering \caption{Organizzazione di un filesystem} \label{fig:filedir_filesys_detail} \end{figure} - - -Quanto mostrato in \curfig\ mette in evidenza alcune caratteristiche di un -filesystem unix su cui è bene porre attenzione in quanto sono fondamentali per -capire il funzionamento delle funzioni che manipolano i file e le directory su -cui torneremo fra poco; in particolare è opportuno ricordare sempre che: +da questa figura si evidenzano alcune caratteristiche su cui è bene porre +attenzione in quanto sono fondamentali per capire il funzionamento delle +funzioni che manipolano i file e le directory su cui torneremo fra poco; in +particolare è opportuno ricordare sempre che: \begin{itemize} \item L'\textit{inode} contiene tutte le informazioni riguardanti il file: il tipo di file, i permessi di accesso, le dimensioni, i puntatori ai blocchi fisici che contengono i dati e così via; le informazioni che la funzione - \texttt{stat} fornisce provengono dall'inode; dentro una directory si - troverà solo il nome del file e il numero dell'inode ad esso associato, cioè - una \textit{dentry}. + \texttt{stat} fornisce provengono dall'\textit{inode}; dentro una directory + si troverà solo il nome del file e il numero dell'\textit{inode} ad esso + associato, cioè quella che da qui in poi chiameremo una \textit{dentry}. -\item Come mostrato in \curfig si possono avere più dentries che puntano allo - stesso inode. Ogni inode ha un contatore che contiene il numero di - riferimenti (\textit{link count}) che sono stati fatti ad esso, solo quando - questo contatore si annulla il file può essere cancellato. Per questo in - generale non esiste una funzione che cancelli un file, ma solo la funzione - \texttt{unlink} che si chiama così proprio perché che toglie un riferimento - da una directory (cancellando la dentry), il che non comporta - automaticamente pure la eliminazione dei blocchi sul disco. +\item Come mostrato in \curfig si possono avere più \textit{dentries} che + puntano allo stesso \textit{inode}. Ogni \textit{inode} ha un contatore che + contiene il numero di riferimenti (\textit{link count}) che sono stati fatti + ad esso, solo quando questo contatore si annulla i dati del file vengono + effettivamente rimossi dal disco. Per questo la funzione per cancellare un + file si chiama \texttt{unlink}, ed in realtà non cancella affatto i dati del + file, ma si limita a eliminare la \textit{dentry} da una directory e + decrementare il numero di riferimenti nell'\textit{inode}. + +\item Il numero di \textit{inode} nella \textit{dentry} si riferisce ad un + \textit{inode} nello stesso filesystem e non ci può essere una directory che + contiene riferimenti ad \textit{inodes} relativi ad altri filesystem. Questo + limita l'uso del comando \texttt{ln} (che crea una nuova dentry per un file + esistente, con la funzione \texttt{link}) al filesystem corrente. -\item Siccome il numero di inode nella dentry si riferisce ad un inode nello - stesso filesystem non ci può essere una directory che contiene riferimenti - ad inodes relativi ad altri filesystem, questo limita l'uso del comando - \texttt{ln} (che crea una nuova dentry per un file esistente, con la - funzione \texttt{link}) al filesystem corrente. - \item Quando si cambia nome ad un file senza cambiare filesystem il contenuto - del file non deve essere spostato, ma basta creare una nuova dentry per - l'inode in questione rimuovendo la vecchia (che è la modalità in cui opera - normalmente il comando \texttt{mv} attraveso la funzione \texttt{rename}). + del file non deve essere spostato, viene semplicemente creta una nuova + \textit{dentry} per l'\textit{inode} in questione e rimossa la vecchia + (questa è la modalità in cui opera normalmente il comando \texttt{mv} + attraverso la funzione \texttt{rename}). \end{itemize} -Infine è bene avere presente che esiste un numero di riferimenti anche per le -directories, se a partire dalla situazione mostrata in \curfig\ creiamo una -nuova directory \texttt{textdir} avremo una situazione come quella in \nfig, -dove per chiarezza abbiamo aggiunto dei numeri di inode. +Infine è bene avere presente che essendo file pure loro, esiste un numero di +riferimenti anche per le directories; per cui se ad esempio a partire dalla +situazione mostrata in \curfig\ creiamo una nuova directory \texttt{textdir} +nella directory corrente avremo una situazione come quella in \nfig, dove per +chiarezza abbiamo aggiunto dei numeri di inode. La nuova directory avrà allora un numero di riferimenti pari a due, in quanto è referenziata dalla directory da cui si era partiti (in cui è inserita la @@ -173,31 +172,80 @@ ambiente unix, dove tali collegamenti sono usualmente chiamati \textit{link}, ma data la struttura del sistema ci sono due metodi sostanzialmente diversi per fare questa operazione. -Come si è appena visto l'accesso al contenuto di un file su disco avviene -attraverso il suo \textit{inode}, e il nome che si trova in una directory è -solo una etichetta associata ad un puntatore a detto inode. Questo significa -che la realizzazione di un link è immediata in quanto uno stesso file può -avere tanti nomi diversi allo stesso tempo, dati da altrettante diverse -associazioni allo stesso inode; si noti poi che nessuno di questi nomi viene -ad assumere una particolare preferenza rispetto agli altri. +Come si è appena detto l'accesso al contenuto di un file su disco avviene +attraverso il suo inode, e il nome che si trova in una directory è solo una +etichetta associata ad un puntatore a detto inode. Questo significa che la +realizzazione di un link è immediata in quanto uno stesso file può avere tanti +nomi diversi allo stesso tempo, dati da altrettante diverse associazioni allo +stesso inode; si noti poi che nessuno di questi nomi viene ad assumere una +particolare preferenza rispetto agli altri. Per aggiungere un nome ad un inode si utilizza la funzione \texttt{link}; si suole chiamare questo tipo di associazione un collegamento diretto (o -\textit{hard link}). La creazione di un nuovo link diretto non copia il -contenuto del file, ma si limita ad aumentare di uno il numero di referenze al -file aggiungendo il nuovo nome ai precedenti. Si noti che uno stesso file può -essere così richiamato in diverse directory. - +\textit{hard link}). Il prototipo della funzione, definita in +\texttt{unistd.h} è il seguente: \begin{itemize} \item \texttt{int link(const char * oldname, const char * newname)} - Crea un nuovo link diretto al file indicato da \texttt{oldname} dandogli - nome \texttt{newname}. + Crea un nuovo collegamento diretto al file indicato da \texttt{oldname} + dandogli nome \texttt{newname}. La funzione restituisce zero in caso di successo e -1 per un errore, in caso - di errore. La variabile \texttt{errno} viene settata secondo i codici di - errore standard di accesso ai files (trattati in dettaglio in - \ref{sec:filedir_access_control}) ai quali si aggiungono i seguenti: + di errore. La variabile \texttt{errno} viene settata secondo i seguenti + codici di errore: + + \begin{itemize} + \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo + stesso filesystem. + \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e + \texttt{newname} non supporta i link diretti. + \item \texttt{EACCESS} + Non c'è il permesso di scrittura per la directory in cui si vuole creare + il nuovo link. + \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di + già. + \item \texttt{EMLINK} Ci sono troppi link al file \texttt{oldname} (il + numero massimo è specificato dalla variabile \texttt{LINK\_MAX}, vedi + \ref{sec:xxx_limits}. + \item \texttt{ENOSPC} La directory in cui si vuole creare il link è piena e + non può essere ampliata. + \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è + su un filesystem montato readonly. + \end{itemize} +\end{itemize} + +La creazione di un nuovo collegamento diretto non copia il contenuto del file, +ma si limita ad aumentare di uno il numero di referenze al file aggiungendo il +nuovo nome ai precedenti. Si noti che uno stesso file può essere così +richiamato in diverse directory. + +Per quanto dicevamo in \ref{sec:filedir_filesystem} la creazione del +collegamento diretto è possibile solo se entrambi i pathname sono nello stesso +filesytem; inoltre il filesystem deve supportare i collegamenti diretti (non è +il caso ad esempio del filesystem \texttt{vfat} di windows). + +La funzione opera sui file ordinari, come sugli altri oggetti del filesystem, +ma solo l'amministratore è in grado di creare un collegamento diretto ad +un'altra directory, questo lo si fa perché in questo caso è possibile creare +dei cerchi nel filesystem (vedi \ref{sec:filedir_symlink}) che molti programmi +non sono in grado di gestire e la cui rimozione diventa estremamente +complicata (in genere occorre far girare il programma \texttt{fsck} per +riparare il filesystem). + + +La rimozione di un file (o più precisamente di una sua dentry) si effettua con +la funzione \texttt{unlink}; il suo prototipo, definito in \texttt{unistd.h} è +il seguente: + +\begin{itemize} +\item \texttt{int unlink(const char * filename)} + + Cancella il nome specificato dal pathname nella relativa directory e + decrementa il numero di riferimenti nel relativo inode. + + La funzione restituisce zero in caso di successo e -1 per un errore, in caso + di errore. La variabile \texttt{errno} viene settata secondo i seguenti + codici di errore: \begin{itemize} \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo @@ -219,6 +267,19 @@ essere cos \end{itemize} \end{itemize} +Per cancellare + + + + + +Una delle caratteristiche di queste funzioni è che la creazione/rimozione +della nnome dalla directory e l'incremento/decremento del numero di +riferimenti nell'inode deve essere una operazione atomica (cioè non +interrompibile da altri) processi, per questo entrambe queste funzioni sono +realizzate tramite una singola system call. + + \subsection{Le funzioni \texttt{remove} e \texttt{rename}} @@ -251,8 +312,8 @@ funzioni apposite, come la \texttt{readlink} e la \texttt{lstat} per accedere alle informazioni del link invece che a quelle del file a cui esso fa riferimento. -Le funzioni per operare sui link sono le seguenti, esse sono tutte dichiarate -nell'header file \texttt{unistd.h}. +Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte +dichiarate nell'header file \texttt{unistd.h}. \begin{itemize} \item \texttt{int symlink(const char * oldname, const char * newname)} @@ -419,15 +480,13 @@ per cambiare directory di lavoro. + + + \section{La manipolazione delle caratteristiche dei files} \label{sec:filedir_infos} -Si ricordi che in unix non esistono i tipi di file e che non c'è nessun -supporto per le estensioni come parte del filesystem. Ciò non ostante molti -programmi adottano delle convenzioni per i nomi dei file, ad esempio il codice -C normalmente si mette in file con l'estensione .c, ma questa è, appunto, solo -una convenzione. \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}} diff --git a/fileintro.tex b/fileintro.tex index dfd3081..bc08ca9 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -375,3 +375,9 @@ in cui il processo Ritorneremo su questo più avanti, quando tratteremo l'input/output sui file, esaminando in dettaglio come tutto ciò viene realizzato. +Si ricordi infine che in unix non esistono i tipi di file e che non c'è nessun +supporto per le estensioni come parte del filesystem. Ciò non ostante molti +programmi adottano delle convenzioni per i nomi dei file, ad esempio il codice +C normalmente si mette in file con l'estensione .c, ma questa è, appunto, solo +una convenzione. +