Usate le nuove macro per le referenze, e trovato un formato sensato per
[gapil.git] / filedir.tex
index 6df35b229a497155c8f74bda6a5c3311dd971353..ecabab0f6aa07cc148f8df4c684a27d2ec2d062e 100644 (file)
@@ -18,12 +18,12 @@ cancellare i files ed esaminare o cambiare i loro attributi.
 \label{sec:filedir_org}
 
 L'organizzazione dei nomi dei file deriva direttamente dall'organizzazione dei
-medesimi nell'albero descritto brevemente in \ref{sec:fileintr_overview}; una
-directory comunque, come già specificato in \ref{sec:fileintr_vfs}, è solo un
-particolare tipo di file che contiene le informazioni che associano un nome al
-contenuto. Per questo, anche se è usuale parlare di ``file in una directory''
-in realtà una directory contiene solo delle etichette per fare riferimento ai
-file stessi.
+medesimi nell'albero descritto brevemente in \secref{sec:fileintr_overview};
+una directory comunque, come già specificato in \secref{sec:fileintr_vfs}, è
+solo un particolare tipo di file che contiene le informazioni che associano un
+nome al contenuto. Per questo, anche se è usuale parlare di ``file in una
+directory'' in realtà una directory contiene solo delle etichette per fare
+riferimento ai file stessi.
 
 I manuale delle librerie del C chiama i nomi contenuti nelle directory
 \textsl{componenti} (in inglese \textit{file name components}), noi li
@@ -53,12 +53,12 @@ permessi devono consentire l'accesso.
 
 Se il pathname comincia per \texttt{/} la ricerca parte dalla directory radice
 del processo; questa, a meno di un \textit{chroot} (su cui torneremo in
-seguito, vedi \ref{sec:proc_chroot}) è la stessa per tutti i processi ed
+seguito, vedi \secref{sec:proc_chroot}) è la stessa per tutti i processi ed
 equivale alla directory radice dell'albero (come descritto in
-\ref{sec:fileintr_overview}): in questo caso si parla di un pathname
+\secref{sec:fileintr_overview}): in questo caso si parla di un pathname
 \textsl{assoluto}. Altrimenti la ricerca parte dalla directory corrente (su
-cui torneremo più avanti in \ref{sec:filedir_work_dir}) ed il pathname è detto
-\textsl{relativo}.
+cui torneremo più avanti in \secref{sec:filedir_work_dir}) ed il pathname è
+detto \textsl{relativo}.
 
 I nomi \texttt{.} e \texttt{..} hanno un significato speciale e vengono
 inseriti in ogni directory, il primo fa riferimento alla directory corrente e
@@ -76,13 +76,13 @@ breve introduzione agli oggetti su cui 
 particolare si riprenderà, approfondendolo sul piano dell'uso nelle funzioni
 di libreria, il concetto di \textit{inode} di cui abbiamo brevemente accennato
 le caratteristiche (dal lato dell'implementazione nel kernel) in
-\ref{sec:fileintr_vfs}.
+\secref{sec:fileintr_vfs}.
 
 
 \subsection{Il funzionamento di un filesystem}
 \label{sec:filedir_filesystem}
 
-Come già accennato in \ref{sec:fileintr_overview} linux (ed ogni unix in
+Come già accennato in \secref{sec:fileintr_overview} linux (ed ogni unix in
 generale) organizza i dati che tiene su disco attraverso l'uso di un
 filesystem. Una delle caratteristiche di linux rispetto agli altri unix è
 quella di poter supportare grazie al VFS una enorme quantità di filesystem
@@ -118,7 +118,7 @@ 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}
+\begin{enumerate}
   
 \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
@@ -128,7 +128,7 @@ particolare 
   associato, cioè quella che da qui in poi chiameremo una \textsl{voce}
   (traduzione approssimata dell'inglese \textit{directory entry}, che non
   useremo anche per evitare confusione con le \textit{dentries} del kernel di
-  cui si parlava in \ref{sec:fileintr_vfs}).
+  cui si parlava in \secref{sec:fileintr_vfs}).
   
 \item Come mostrato in \curfig si possono avere più voci che puntano allo
   stesso \textit{inode}. Ogni \textit{inode} ha un contatore che contiene il
@@ -146,12 +146,12 @@ particolare 
   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, viene semplicemente creata 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}).
+  del file non deve essere spostato, viene semplicemente creata una nuova voce
+  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}
+\end{enumerate}
 
 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
@@ -191,17 +191,14 @@ suole chiamare questo tipo di associazione un collegamento diretto (o
 \textit{hard link}).  Il prototipo della funzione, definita in
 \texttt{unistd.h}, e le sue caratteritiche principali, come risultano dalla
 man page, sono le seguenti:
-\begin{itemize}
-\item \texttt{int link(const char * oldname, const char * newname)}
-  
+\begin{prototype}{int link(const char * oldname, const char * 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 seguenti
   codici di errore:
-
-  \begin{itemize}
+  \begin{errlist}
   \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
     stesso filesystem.
   \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e
@@ -213,20 +210,20 @@ man page, sono le seguenti:
     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}.
+    \secref{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}
+  \end{errlist}
+\end{prototype}
 
 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
+Per quanto dicevamo in \secref{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).
@@ -234,27 +231,24 @@ 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
+dei cerchi nel filesystem (vedi \secref{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:
+La rimozione di un file (o più precisamente della voce che lo referenzia) 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)}
-  
+\begin{prototype}{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}
+  La funzione restituisce zero in caso di successo e -1 per un errore, nel
+  qual caso il file non viene toccato. La variabile \texttt{errno} viene
+  settata secondo i seguenti codici di errore:
+  \begin{errlist}
   \item \texttt{EXDEV} \texttt{oldname} e \texttt{newname} non sono sullo
     stesso filesystem.
   \item \texttt{EPERM} il filesystem che contiene \texttt{oldname} e
@@ -266,27 +260,36 @@ il seguente:
     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}.
+    \secref{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}
-
-Per cancellare 
-
-
-
+  \end{errlist}
+\end{prototype}
 
+Per cancellare una voce in una directory è necessario avere il permesso di
+scrittura su di essa (dato che si va a rimuovere una voce dal suo contenuto) e
+il diritto di esecuzione sulla directory che la contiene (torneremo in
+dettaglio sui permessi e gli attributi fra poco), se inoltre lo
+\textit{sticky} bit è settato occorerà anche essere proprietari del file o
+proprietari della directory (o root, per cui nessuna delle restrizioni è
+applicata).
 
 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
-della nnome dalla directory e l'incremento/decremento del numero di
+della nome 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.
 
-
+Si ricordi infine che il file non viene eliminato dal disco fintanto che tutti
+i riferimenti ad esso sono stati cancellati, solo quando il \textit{link
+  count} mantenuto nell'inode diventa zero lo spazio occupato viene rimosso. A
+questo però si aggiunge una altra condizione, e cioè che non ci siano processi
+che abbiano detto file aperto. Come accennato questa proprietà viene spesso
+usata per essere sicuri di non lasciare file temporanei su disco in caso di
+crash dei programmi; la tecnica è quella di aprire il file e chiamare
+\texttt{unlink} subito dopo.
 
 
 \subsection{Le funzioni \texttt{remove} e \texttt{rename}}
@@ -296,11 +299,11 @@ realizzate tramite una singola system call.
 \subsection{I link simbolici}
 \label{sec:filedir_sym_link}
 
-Siccome tutto ciò funziona facendo riferimento ad un inode, questa funzione
-può essere applicata soltanto per file che risiedono sullo stesso filesystem,
-(dato che solo in questo caso è garantita l'unicità dell'inode) e solo per
-filesystem di tipo unix. Inoltre in linux non è consentito eseguire un link
-diretto ad una directory.
+Siccome la funzione \texttt{link} crea riferimenti agli inodes, essa può
+funzionare soltanto per file che risiedono sullo stesso filesystem, dato che
+in questo caso è garantita l'unicità dell'inode, e solo per un filesystem di
+tipo unix.  Inoltre in linux non è consentito eseguire un link diretto ad una
+directory se non si è root.
 
 Per ovviare a queste limitazioni i sistemi unix supportano un'altra forma di
 link (i cosiddetti \textit{soft link} o \textit{symbolic link}), che sono,
@@ -322,18 +325,15 @@ riferimento.
 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)}
-  
+\begin{prototype}{int symlink(const char * oldname, const char * newname)}
   Crea un nuovo link simbolico 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:
-
-  \begin{itemize}
+  \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+  \begin{errlist}
   \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di
     già.
   \item \texttt{EROFS} La directory su cui si vuole inserire il nuovo link è
@@ -342,8 +342,8 @@ dichiarate nell'header file \texttt{unistd.h}.
     link è piena e non c'è ulteriore spazio disponibile.
   \item \texttt{ELOOP} Ci sono troppi link simbolici nella risoluzione di
     \texttt{oldname} o di \texttt{newname}.
-  \end{itemize}
-\end{itemize}
+  \end{errlist}
+\end{prototype}
 
 
 \subsection{Le funzioni \texttt{mkdir} e \texttt{rmdir}} 
@@ -353,9 +353,7 @@ Per creare una nuova directory si pu
 dell'analogo comando di shell \texttt{mkdir}; per accedere alla funzioni il
 programma deve includere il file \texttt{sys/stat.h}.
 
-\begin{itemize}
-\item \texttt{char * mkdir (const char * dirname, mode\_t mode)}
-  
+\begin{prototype}{char * mkdir (const char * dirname, mode\_t mode)}
   Questa funzione crea una nuova directory vuota con il nome indicato da
   \texttt{dirname}, assegnandole i permessi indicati da \texttt{mode}. Il nome
   può essere indicato con il pathname assoluto o relativo.
@@ -363,8 +361,8 @@ programma deve includere il file \texttt{sys/stat.h}.
   La funzione restituisce zero in caso di successo e -1 per un errore, in caso
   di errore \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:
-  \begin{itemize}
+  \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti:
+  \begin{errlist}
   \item \texttt{EACCESS} 
     Non c'è il permesso di scrittura per la directory in cui si vuole inserire
     la nuova directory.
@@ -378,8 +376,8 @@ programma deve includere il file \texttt{sys/stat.h}.
     la nuova directory.
   \item \texttt{EROFS} La directory su cui si vuole inserire la nuova
     directory è su un filesystem montato readonly.
-  \end{itemize}
-\end{itemize}
+  \end{errlist}
+\end{prototype}
  
 
 \subsection{Accesso alle directory}
@@ -395,7 +393,7 @@ Per accedere al contenuto delle directory si usano i cosiddetti
 la funzione \texttt{opendir} apre uno di questi stream e la funzione
 \texttt{readdir} legge il contenuto della directory, i cui elementi sono le
 \textit{directory entries} (da distinguersi da quelle della cache di cui
-parlavamo in \ref{sec:fileintr_vfs}) in una opportuna struttura
+parlavamo in \secref{sec:fileintr_vfs}) in una opportuna struttura
 \texttt{struct dirent}.
 
 
@@ -417,9 +415,7 @@ directory corrente di qualunque comando da essa lanciato.
 Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
 corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}. 
 
-\begin{itemize}
-\item \texttt{char * getcwd (char * buffer, size\_t size)}
-  
+\begin{prototype}{char * getcwd (char * buffer, size\_t size)}
   Restituisce il filename completo della directory di lavoro corrente nella
   stringa puntata da \texttt{buffer}, che deve essere precedentemente
   allocata, per una dimensione massima di \texttt{size}. Si può anche
@@ -432,8 +428,7 @@ corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}.
   La funzione restituisce il puntatore \texttt{buffer} se riesce,
   \texttt{NULL} se fallisce, in quest'ultimo caso la variabile
   \texttt{errno} è settata con i seguenti codici di errore:
-
-  \begin{itemize}
+  \begin{errlist}
   \item \texttt{EINVAL} L'argomento \texttt{size} è zero e \texttt{buffer} non
     è nullo.
   \item \texttt{ERANGE} L'argomento \texttt{size} è più piccolo della
@@ -441,14 +436,14 @@ corrente. I prototipi di queste funzioni sono dichiarati in \texttt{unistd.h}.
   \item \texttt{EACCES} Manca il permesso di lettura o di ricerca su uno dei
     componenti del pathname (cioè su una delle directory superiori alla
     corrente).
-  \end{itemize}
-\end{itemize}
+  \end{errlist}
+\end{prototype}
 
 Di questa funzione esiste una versione \texttt{char * getwd(char * buffer)}
 fatta per compatibilità all'indietro con BSD, che non consente di specificare
 la dimensione del buffer; esso deve essere allocato in precedenza ed avere una
 dimensione superiore a \texttt{PATH\_MAX} (di solito 256 byters, vedi
-\ref{sec:xxx_limits}; il problema è che in linux non esiste una dimensione
+\secref{sec:xxx_limits}; il problema è che in linux non esiste una dimensione
 superiore per un pathname, per cui non è detto che il buffer sia sufficiente a
 contenere il nome del file, e questa è la ragione principale per cui questa
 funzione è deprecata.
@@ -464,27 +459,22 @@ riferirsi ad esse tramite il file descriptor dell'interfaccia a basso livello,
 e non solo tramite il filename; per questo motivo ci sono due diverse funzioni
 per cambiare directory di lavoro.
 
-\begin{itemize}
-\item \texttt{int chdir (const char * pathname)}
-  
+\begin{prototype}{int chdir (const char * pathname)}
   Come dice il nome (che significa \textit{change directory}) questa funzione
   serve a cambiare la directory di lavoro a quella speficata dal pathname
   contenuto nella stringa \texttt{pathname}.
+\end{prototype}
   
-\item \texttt{int fchdir (int filedes)} analoga alla precedente, ma usa un
-  file descriptor invece del pathname.
-
+\begin{prototype}{int fchdir (int filedes)} 
+  Analoga alla precedente, ma usa un file descriptor invece del pathname.
   
   Entrambe le funzioni restituiscono zero in caso di successo e -1 per un
   errore, in caso di errore \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 aggiunge il codice
+  \secref{sec:filedir_access_control}) ai quali si aggiunge il codice
   \texttt{ENOTDIR} nel caso il \texttt{filename} indichi un file che non sia
   una directory.
-\end{itemize}
-
-
-
+\end{prototype}
 
 
 
@@ -543,6 +533,6 @@ per cambiare directory di lavoro.
 %La struttura fondamentale che contiene i dati essenziali relativi ai file è il
 %cosiddetto \textit{inode}; questo conterrà informazioni come il
 %tipo di file (file di dispositivo, directory, file di dati, per un elenco
-%completo vedi \ntab), i permessi (vedi \ref{sec:file_perms}), le date (vedi
-%\ref{sec:file_times}).
+%completo vedi \ntab), i permessi (vedi \secref{sec:file_perms}), le date (vedi
+%\secref{sec:file_times}).