Aggiunte funzioni di gestione per le varibili di ambiente
[gapil.git] / filedir.tex
index b5eb2c2ee430cd82819fece21c5a327c5757c24a..c9884c4f4e6acf56a9c851ade4307375581f011d 100644 (file)
@@ -5,7 +5,7 @@ In questo capitolo tratteremo in dettaglio le modalit
 file e directory, iniziando dalle funzioni di libreria che si usano per
 copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che
 permette la manipolazione dei vari attributi di file e directory ed alla
-finefaremo una trattazione dettagliata su come è strutturato il sistema base
+fine faremo una trattazione dettagliata su come è strutturato il sistema base
 di protezioni e controllo di accesso ai file e sulle funzioni che ne
 permettono la gestione. Tutto quello che riguarda invece la manipolazione del
 contenuto dei file è lasciato ai capitoli successivi.
@@ -29,7 +29,7 @@ capitolo precedente.
 
 Una caratteristica comune a diversi sistemi operativi è quella di poter creare
 dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows) che
-permettono di fare riferiremento allo stesso file chiamandolo con nomi diversi
+permettono di fare riferimento allo stesso file chiamandolo con nomi diversi
 o accedendovi da directory diverse.
 
 Questo è possibile anche in ambiente unix, dove tali collegamenti sono
@@ -69,7 +69,7 @@ principali, come risultano dalla man page, sono le seguenti:
     già.
   \item \macro{EMLINK} ci sono troppi link al file \var{oldpath} (il
     numero massimo è specificato dalla variabile \macro{LINK\_MAX}, vedi
-    \secref{sec:xxx_limits}).
+    \secref{sec:sys_limits}).
   \end{errlist}
   ed inoltre \macro{EACCES}, \macro{ENAMETOOLONG}, \macro{ENOTDIR},
   \macro{EFAULT}, \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP},
@@ -86,7 +86,7 @@ essere cos
 Per quanto dicevamo in \secref{sec:file_filesystem} la creazione di un
 collegamento diretto è possibile solo se entrambi i pathname sono nello stesso
 filesystem; inoltre il filesystem deve supportare i collegamenti diretti (il
-mneccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
+meccanismo non è disponibile ad esempio con il filesystem \acr{vfat} di
 Windows). 
 
 La funzione inoltre opera sia sui file ordinari che sugli altri oggetti del
@@ -108,7 +108,6 @@ funzione restituisce l'errore \macro{EPERM}.
 La rimozione di un file (o più precisamente della voce che lo referenzia
 all'interno di una directory) si effettua con la funzione \func{unlink}; il
 suo prototipo è il seguente:
-
 \begin{prototype}{unistd.h}{int unlink(const char * pathname)}
   Cancella il nome specificato dal pathname nella relativa directory e
   decrementa il numero di riferimenti nel relativo inode. Nel caso di link
@@ -143,9 +142,9 @@ restrizioni 
 
 Una delle caratteristiche di queste funzioni è che la creazione/rimozione
 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.
+nell'inode deve essere una operazione atomica (si veda
+\secref{sec:proc_atom_oper}), 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
@@ -167,19 +166,18 @@ processo (quando tutti i file vengono chiusi).
 \label{sec:file_remove}
 
 Al contrario di quanto avviene con altri unix in Linux non è possibile usare
-\func{unlink} sulle directory;  per cancellare una directory si può usare la
+\func{unlink} sulle directory; per cancellare una directory si può usare la
 funzione \func{rmdir} (vedi \secref{sec:file_dir_creat_rem}), oppure la
 funzione \func{remove}. Questa è la funzione prevista dallo standard ANSI C
 per cancellare un file o una directory (e funziona anche per i sistemi che non
-supportano i link diretti), che per i file è identica alla \func{unlink} e per
-le directory è identica alla \func{rmdir}:
-
+supportano i link diretti). Per i file è identica a \func{unlink} e per le
+directory è identica a \func{rmdir}:
 \begin{prototype}{stdio.h}{int remove(const char *pathname)}
   Cancella un nome dal filesystem. Usa \func{unlink} per i file e
   \func{rmdir} per le directory.
   
   La funzione restituisce zero in caso di successo e -1 per un errore, nel
-  qual caso il file non viene toccato. Per i codici di errori vedi quanto
+  qual caso il file non viene toccato. Per i codici di errore vedi quanto
   riportato nelle descrizioni di \func{unlink} e \func{rmdir}.
 \end{prototype}
 
@@ -187,11 +185,10 @@ Per cambiare nome ad un file o a una directory (che devono comunque essere
 nello stesso filesystem) si usa invece la funzione \func{rename}\footnote{la
   funzione è definita dallo standard ANSI C solo per i file, POSIX estende la
   funzione anche alle directory}, il cui prototipo è:
-
 \begin{prototype}{stdio.h}
   {int rename(const char *oldpath, const char *newpath)} 
   
-  Rinomina \var{oldpath} in \var{newpth}, eseguendo se necessario lo
+  Rinomina \var{oldpath} in \var{newpath}, eseguendo se necessario lo
   spostamento di un file fra directory diverse. Eventuali altri link diretti
   allo stesso file non vengono influenzati.
   
@@ -211,19 +208,12 @@ nello stesso filesystem) si usa invece la funzione \func{rename}\footnote{la
   \item \macro{EINVAL} \var{newpath} contiene un prefisso di \var{oldpath} o
     più in generale si è cercato di creare una directory come sottodirectory
     di se stessa.
-  \item \macro{EMLINK} \var{oldpath} ha già il massimo numero di link
-    consentiti o è una directory e la directory che contiene \var{newpath} ha
-    già il massimo numero di link.
   \item \macro{ENOTDIR} Uno dei componenti dei pathname non è una directory o
     \var{oldpath} è una directory e \var{newpath} esiste e non è una
     directory.
-  \item \macro{EPERM} le directory contenenti \var{oldpath} o \var{newpath}
-    hanno lo sticky bit attivo e i permessi del processo non consentono
-    rispettivamente la cancellazione e la creazione del file, o il filesystem
-    non supporta i link.
   \end{errlist} 
-  ed inoltre \macro{EACCESS}, \macro{ENOENT}, \macro{ENOMEM}, \macro{EROFS},
-  \macro{ELOOP} e \macro{ENOSPC}.
+  ed inoltre \macro{EACCESS}, \macro{EPERM}, \macro{EMLINK}, \macro{ENOENT},
+  \macro{ENOMEM}, \macro{EROFS}, \macro{ELOOP} e \macro{ENOSPC}.
 \end{prototype}
 
 Il comportamento della funzione è diverso a seconda che si voglia rinominare
@@ -235,9 +225,10 @@ cancellato e rimpiazzato (atomicamente).
 Se \var{oldpath} è una directory allora \var{newpath} se esiste deve essere
 una directory vuota, altrimenti si avranno gli errori \macro{ENOTDIR} (se non
 è una directory) o \macro{ENOTEMPTY} (se non è vuota). Chiaramente
-\var{newpath} non può contenere \var{oldpath}. 
+\var{newpath} non può contenere \var{oldpath} altrimenti si avrà un errore
+\macro{EINVAL}.
 
-Se \var{oldpath} si riferisce a un link simbolico questo sara rinominato; se
+Se \var{oldpath} si riferisce a un link simbolico questo sarà rinominato; se
 \var{newpath} è un link simbolico verrà cancellato come qualunque altro file.
 Infine qualora \var{oldpath} e \var{newpath} siano due nomi dello stesso file
 lo standard POSIX prevede che la funzione non dia errore, e non faccia nulla,
@@ -258,84 +249,62 @@ presente una istanza di \var{newpath}, tuttavia nella sovrascrittura potr
 esistere una finestra in cui sia \var{oldpath} che \var{newpath} fanno
 riferimento allo stesso file.
 
+
 \subsection{I link simbolici}
 \label{sec:file_symlink}
 
-Siccome la funzione \func{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.
+Come abbiamo visto in \secref{sec:file_link} la funzione \func{link} crea
+riferimenti agli inodes, pertanto può funzionare soltanto per file che
+risiedono sullo stesso filesystem e solo per un filesystem di tipo unix.
+Inoltre abbiamo visto che in Linux non è consentito eseguire un link diretto
+ad una directory.
 
 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,
-come avviene in altri sistemi operativi, dei file che contengono il
+come avviene in altri sistemi operativi, dei file speciali che contengono il
 semplicemente il riferimento ad un altro file (o directory). In questo modo è
-possibile effettuare link anche attraverso filesystem diversi e a directory, e
-pure a file che non esistono ancora.
+possibile effettuare link anche attraverso filesystem diversi, a file posti in
+filesystem che non supportano i link diretti, a delle directory, e anche a
+file che non esistono ancora.
 
 Il sistema funziona in quanto i link simbolici sono contrassegnati come tali
-al kernel (analogamente a quanto avviene per le directory) per cui la chiamata
-ad una \var{open} o una \var{stat} su un link simbolico comporta la lettura
-del contenuto del medesimo e l'applicazione della funzione al file specificato
-da quest'ultimo. Invece altre funzioni come quelle per cancellare o rinominare
-i file operano direttamente sul link simbolico (per l'elenco vedi \ntab).
-Inoltre esistono funzioni apposite, come la \func{readlink} e la \func{lstat}
-per accedere alle informazioni del link invece che a quelle del file a cui
-esso fa riferimento.
-
-Le funzioni per operare sui link simbolici sono le seguenti, esse sono tutte
-dichiarate nell'header file \file{unistd.h}.
-
+al kernel (analogamente a quanto avviene per le directory) per cui per alcune
+funzioni di libreria (come \func{open} o \func{stat}) dare come parametro un
+link simbolico comporta l'applicazione della funzione al file da esso
+specificato. La funzione che permette di creare un nuovo link simbolico è
+\func{symlink}; il suo prototipo è:
 \begin{prototype}{unistd.h}
-{int symlink(const char * oldname, const char * newname)}
-  Crea un nuovo link simbolico al file indicato da \var{oldname} dandogli
-  nome \func{newname}.
+  {int symlink(const char * oldpath, const char * newpath)} 
+  Crea un nuovo link simbolico di nome \func{newpath} il cui contenuto è
+  \func{oldpath}.
   
-  La funzione restituisce zero in caso di successo e -1 per un errore, in caso
-  di errore. La variabile \var{errno} viene settata secondo i codici di
-  errore standard di accesso ai file (trattati in dettaglio in
-  \secref{sec:file_access_control}) ai quali si aggiungono i seguenti:
+  La funzione restituisce zero in caso di successo e -1 per un errore, nel
+  qual caso la variabile \var{errno} restituisce i valori:
   \begin{errlist}
-  \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di
-    già.
-  \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
-    su un filesystem montato in sola lettura.
-  \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
-    link è piena e non c'è ulteriore spazio disponibile.
-  \item \macro{ELOOP} Ci sono troppi link simbolici nella risoluzione di
-    \var{oldname} o di \var{newname}.
+  \item \macro{EPERM} il filesystem che contiene \var{newpath} non supporta i
+    link simbolici.
+  \item \macro{ENOENT} una componente di \var{newpath} non esiste o
+    \func{oldpath} è una stringa vuota.
+  \item \macro{EEXIST} esiste già un file \var{newpath}.
+  \item \macro{EROFS} \var{newpath} è su un filesystem montato in sola lettura.
   \end{errlist}
+  ed inoltre \macro{EFAULT}, \macro{EACCES}, \macro{ENAMETOOLONG},
+  \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{ENOSPC} e
+  \macro{EIO}.
 \end{prototype}
 
-Dato che, come indicato in \secref{tab:file_symb_effect}, la funzione
-\func{open} segue i link simbolici, è necessaria usare un'altra funzione
-quando si vuole leggere il contenuto di un link simbolico, questa funzione è
-la:
+Si tenga presente che la funzione non effettua nessun controllo sull'esistenza
+di un file di nome \var{oldpath}, ma si limita ad inserire quella stringa nel
+link simbolico. Pertanto un link simbolico può anche riferirsi ad un file che
+non esiste: quello che viene chiamato un \textit{dangling link}, letteralmente
+\textsl{link ciondolante}.
 
-\begin{prototype}{unistd.h}
-{int readlink(const char * path, char * buff, size\_t size)} 
-  Legge il contenuto del link simbolico indicato da \var{path} nel buffer
-  \var{buff} di dimensione \var{size}. Non chiude la stringa con un
-  carattere nullo e la tronca a \var{size} nel caso il buffer sia troppo
-  piccolo per contenerla.
-  
-  La funzione restituisce il numero di caratteri letti dentro \var{buff} o
-  -1 per un errore, in caso di errore. La variabile \var{errno} viene
-  settata secondo i codici di errore:
-  \begin{errlist}
-  \item \macro{EEXIST} Un file (o una directory) con quel nome esiste di
-    già.
-  \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
-    su un filesystem montato in sola lettura.
-  \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
-    link è piena e non c'è ulteriore spazio disponibile.
-  \end{errlist}
-\end{prototype}
 
-In \ntab\ si è riportato un elenco dei comportamenti delle varie funzioni che
-operano sui file rispetto ai link simbolici; specificando quali seguono il
-link simbolico e quali possono operare direttamente sul suo contenuto.
+Come accennato i link simbolici sono risolti automaticamente dal kernel
+all'invocazione delle varie system call; in \ntab\ si è riportato un elenco
+dei comportamenti delle varie funzioni di libreria che operano sui file nei
+confronti della risoluzione dei link simbolici, specificando quali seguono il
+link simbolico e quali invece possono operare direttamente sul suo contenuto.
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -370,14 +339,46 @@ link simbolico e quali possono operare direttamente sul suo contenuto.
   \caption{Uso dei link simbolici da parte di alcune funzioni.}
   \label{tab:file_symb_effect}
 \end{table}
-si noti che non si è specificato il comportamento delle funzioni che operano
-con i file descriptor, in quanto la gestione del link simbolico viene in
+
+Si noti che non si è specificato il comportamento delle funzioni che operano
+con i file descriptor, in quanto la risoluzione del link simbolico viene in
 genere effettuata dalla funzione che restituisce il file descriptor
-(normalmente la \func{open}).
+(normalmente la \func{open}) e tutte le operazioni seguenti fanno riferimento
+solo a quest'ultimo.
+
+Dato che, come indicato in \tabref{tab:file_symb_effect}, funzioni come la
+\func{open} seguono i link simbolici, occorrono funzioni apposite per accedere
+alle informazioni del link invece che a quelle del file a cui esso fa
+riferimento. Quando si vuole leggere il contenuto di un link simbolico si usa
+la funzione \func{readlink}, il cui prototipo è:
+\begin{prototype}{unistd.h}
+{int readlink(const char * path, char * buff, size\_t size)} 
+  Legge il contenuto del link simbolico indicato da \var{path} nel buffer
+  \var{buff} di dimensione \var{size}.
+  
+  La funzione restituisce il numero di caratteri letti dentro \var{buff} o -1
+  per un errore, nel qual caso la variabile \var{errno} viene settata a:
+  \begin{errlist}
+  \item \macro{EINVAL} \var{file} non è un link simbolico o \var{size} non è
+    positiva. 
+  \item \macro{EROFS} La directory su cui si vuole inserire il nuovo link è
+    su un filesystem montato in sola lettura.
+  \item \macro{ENOSPC} La directory o il filesystem in cui si vuole creare il
+    link è piena e non c'è ulteriore spazio disponibile.
+  \end{errlist}
+  ed inoltre \macro{ENOTDIR}, \macro{ENAMETOOLONG}, \macro{ENOENT},
+  \macro{EACCES}, \macro{ELOOP}, \macro{EIO}, \macro{EFAULT} e \macro{ENOMEM}.
+\end{prototype}
+
+La funzione apre il link simbolico, ne legge il contenuto, lo scrive nel
+buffer, e lo richiude. Si tenga presente che la funzione non termina la
+stringa con un carattere nullo e la tronca alla dimensione specificata da
+\var{size} per evitare di sovrascrivere oltre le dimensioni del buffer.
+
 
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=5cm]{img/link_loop.eps}
+  \includegraphics[width=5cm]{img/link_loop}
   \caption{Esempio di loop nel filesystem creato con un link simbolico.}
   \label{fig:file_link_loop}
 \end{figure}
@@ -397,27 +398,30 @@ Questo pu
 scansione di una directory senza tener conto dei link simbolici, ad esempio se
 lanciassimo un comando del tipo \cmd{grep -r linux *}, il loop nella directory
 porterebbe il comando ad esaminare \file{/boot}, \file/{boot/boot},
-\file/{boot/boot/boot} e così via, fino a generare un errore (che poi è
-\macro{ELOOP}) quando viene superato il numero massimo di link simbolici
-consentiti (uno dei limiti del sistema, posto proprio per poter uscire da
-questo tipo di situazione).
-
-Un secondo punto da tenere presente è che un link simbolico può essere fatto
-anche ad un file che non esiste; ad esempio possiamo creare un file temporaneo
-nella nostra directory con un link del tipo:
+\file/{boot/boot/boot} e così via.
+
+Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
+un pathname possano essere seguiti un numero limitato di link simbolici, il
+cui valore limite è specificato dalla costante \macro{MAXSYMLINKS}; qualora
+questo limite venga superato viene generato un errore ed \var{errno} viene
+settata al valore \macro{ELOOP}.
+
+Un punto da tenere sempre presente è il fatto che un link simbolico può fare
+riferimento anche ad un file che non esiste; ad esempio possiamo creare un
+file temporaneo nella nostra directory con un link del tipo:
 \begin{verbatim}
 $ ln -s /tmp/tmp_file temporaneo
 \end{verbatim}%$
-ma anche se \file{/tmp/tmp\_file} non esiste (quello che viene chiamato un
-\textit{dangling link}, letteralemnte \textsl{link ciondolante}). Aprendo in
-scrittura \file{temporaneo} questo verrà scritto; ma se cercassimo di
-accederlo in sola lettura (ad esempio con \cmd{cat}) otterremmo:
+anche se \file{/tmp/tmp\_file} non esiste. Questo può generare confusione, in
+quanto aprendo in scrittura \file{temporaneo} verrà creato
+\file{/tmp/tmp\_file} e scritto; ma accedendo in sola lettura a
+\file{temporaneo}, ad esempio con \cmd{cat}, otterremmo:
 \begin{verbatim}
 $ cat temporaneo
 cat: temporaneo: No such file or directory
 \end{verbatim}%$
-con un errore che può sembrare sbagliato, dato \cmd{ls} ci mostrerebbe
-l'esistenza di \file{temporaneo}.
+con un errore che può sembrare sbagliato, dato che invece \cmd{ls} ci
+mostrerebbe l'esistenza di \file{temporaneo}.
 
 
 \subsection{Le funzioni \func{mkdir} e \func{rmdir}} 
@@ -426,8 +430,7 @@ l'esistenza di \file{temporaneo}.
 Queste due funzioni servono per creare e cancellare delle directory e sono
 omonime degli analoghi comandi di shell.  Per poter accedere ai tipi usati
 da queste funzioni si deve includere il file \file{sys/types.h}, il
-protoripo della prima è:
-
+prototipo della prima è:
 \begin{prototype}{sys/stat.h}
   {int mkdir (const char * dirname, mode\_t mode)} 
   Crea una nuova directory vuota con il nome indicato da \var{dirname},
@@ -444,7 +447,7 @@ protoripo della prima 
   \item \macro{EMLINK} La directory in cui si vuole creare la nuova directory
     contiene troppi file. Sotto Linux questo normalmente non avviene perché il
     filesystem standard consente la creazione di un numero di file maggiore di
-    quelli che possono essere contenuti nell'hard-disk, ma potendo avere a che
+    quelli che possono essere contenuti nel disco, ma potendo avere a che
     fare anche con filesystem di altri sistemi questo errore può presentarsi.
   \item \macro{ENOSPC} Non c'è abbastanza spazio sul file system per creare
     la nuova directory o si è esaurita la quota disco dell'utente.
@@ -454,12 +457,21 @@ protoripo della prima 
   \macro{EROFS}.
 \end{prototype}
  
-
-
+La funzione crea una nuova directory vuota (che contiene solo le due voci
+standard \file{.} e \file{..}). I permessi di accesso (vedi la trattazione in
+\secref{sec:file_access_control}) specificati da \var{mode} (i cui possibili
+valori sono riportati in \tabref{tab:file_permission_const}) sono modificati
+dalla maschera di creazione dei file (si veda \secref{sec:file_umask}).  La
+titolarità della nuova directory è settata secondo quanto riportato in
+\secref{sec:file_ownership}.
+
+La seconda funzione serve ad eliminare una directory già vuota (la directory
+deve cioè contenere soltanto le due voci standard \file{.} e \file{..}); il
+suo prototipo è:
 \begin{prototype}{sys/stat.h}
-  {int rmdir (const char * dirname)} 
-  Cancella la directory \var{dirname}, che deve essere vuota.  Il nome può
-  essere indicato con il pathname assoluto o relativo.
+  {int rmdir (const char * dirname)} Cancella la directory \var{dirname}, che
+  deve essere vuota.  Il nome può essere indicato con il pathname assoluto o
+  relativo.
   
   La funzione restituisce zero in caso di successo e -1 per un errore, nel
   qual caso \var{errno} assumerà i valori:
@@ -479,7 +491,14 @@ protoripo della prima 
   ed inoltre anche \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
   \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ELOOP}, \macro{EROFS}.
 \end{prototype}
+
+La modalità con cui avviene la cancellazione è analoga a quella di
+\func{unlink}, fintanto che il numero di link all'inode della directory non
+diventa nullo e nessun processo ha la directory aperta lo spazio occupato su
+disco non viene rilasciato. Se un processo ha la directory aperta la funzione
+rimuove il link all'inode e nel caso sia l'ultimo, pure le voci standard
+\file{.} e \file{..}, ed il kernel non consentirà di creare più nuovi file
+nella directory.
 
 
 \subsection{Accesso alle directory}
@@ -488,51 +507,48 @@ protoripo della prima 
 Benché le directory siano oggetti del filesystem come tutti gli altri non ha
 ovviamente senso aprirle come fossero dei file di dati. Può però essere utile
 poterne leggere il contenuto ad esempio per fare la lista dei file che esse
-contengono o ricerche sui medesimi.
+contengono o ricerche sui medesimi. Solo il kernel scrivere direttamente in
+una directory (onde evitare inconsistenze all'interno del filesystem), i
+processi devono creare i file usando le apposite funzioni.
 
 Per accedere al contenuto delle directory si usano i cosiddetti
 \textit{directory streams} (chiamati così per l'analogia con i file stream);
 la funzione \func{opendir} apre uno di questi stream e la funzione
 \func{readdir} legge il contenuto della directory, i cui elementi sono le
 \textit{directory entry} (da distinguersi da quelle della cache di cui
-parlavamo in \secref{sec:file_vfs}) in una opportuna struttura
-\var{struct dirent}.
+parlavamo in \secref{sec:file_vfs}) in una opportuna struttura \var{struct
+  dirent}.
 
 (NdA Il resto va scritto!!! É noioso e lo farò più avanti).
 
 
-
 \subsection{La directory di lavoro}
 \label{sec:file_work_dir}
 
 A ciascun processo è associato ad una directory nel filesystem che è chiamata
 directory corrente o directory di lavoro (\textit{current working directory})
 che è quella a cui si fa riferimento quando un filename è espresso in forma
-relativa (relativa appunto a questa directory).
+relativa, dove il relativa fa riferimento appunto a questa directory.
 
 Quando un utente effettua il login questa directory viene settata alla
-cosiddetta \textit{home directory} del suo account, il comando \cmd{cd}
-della shell consente di cambiarla a piacere, spostandosi da una directory ad
-un'altra.  Siccome la directory corrente resta la stessa quando viene creato
-un processo figlio, la directory corrente della shell diventa anche la
+\textit{home directory} del suo account. Il comando \cmd{cd} della shell
+consente di cambiarla a piacere, spostandosi da una directory ad un'altra, il
+comando \cmd{pwd} la stampa sul terminale.  Siccome la directory corrente
+resta la stessa quando viene creato un processo figlio (vedi
+\secref{sec:proc_fork}), la directory corrente della shell diventa anche la
 directory corrente di qualunque comando da essa lanciato.
 
-Le funzioni qui descritte servono esaminare e cambiare la directory di lavoro
-corrente. 
-
+In genere il kernel tiene traccia per ciascun processo dell'inode della
+directory di lavoro corrente, per ottenere il pathname occorre usare una
+apposita funzione di libreria,  \func{getcwd}, il cui prototipo è:
 \begin{prototype}{unistd.h}{char * getcwd (char * buffer, size\_t size)}
   Restituisce il filename completo della directory di lavoro corrente nella
   stringa puntata da \var{buffer}, che deve essere precedentemente
-  allocata, per una dimensione massima di \var{size}. Si può anche
-  specificare un puntatore nullo come \var{buffer}, nel qual caso la
-  stringa sarà allocata automaticamente per una dimensione pari a
-  \var{size} qualora questa sia diversa da zero, o della lunghezza esatta
-  del pathname altrimenti. In questo caso si deve ricordare di disallocare la
-  stringa una volta cessato il suo utilizzo.
+  allocata, per una dimensione massima di \var{size}.
   
-  La funzione restituisce il puntatore \var{buffer} se riesce,
-  \macro{NULL} se fallisce, in quest'ultimo caso la variabile
-  \var{errno} è settata con i seguenti codici di errore:
+  La funzione restituisce il puntatore \var{buffer} se riesce, \macro{NULL} se
+  fallisce, in quest'ultimo caso la variabile \var{errno} è settata con i
+  seguenti codici di errore:
   \begin{errlist}
   \item \macro{EINVAL} L'argomento \var{size} è zero e \var{buffer} non
     è nullo.
@@ -544,42 +560,59 @@ corrente.
   \end{errlist}
 \end{prototype}
 
+Il buffer deve essere sufficientemente lungo da poter contenere il pathname
+completo più lo zero di terminazione della stringa. Qualora esso ecceda le
+dimensioni specificate con \var{size} la funzione restituisce un errore.  Si
+può anche specificare un puntatore nullo come \var{buffer}\footnote{questa è
+  una estensione allo standard POSIX.1, supportata da Linux}, nel qual caso la
+stringa sarà allocata automaticamente per una dimensione pari a \var{size}
+qualora questa sia diversa da zero, o della lunghezza esatta del pathname
+altrimenti. In questo caso ci si deve ricordare di disallocare la stringa una
+volta cessato il suo utilizzo.
+
 Di questa funzione esiste una versione \func{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 \macro{PATH\_MAX} (di solito 256 byte, vedi
-\secref{sec:xxx_limits}); il problema è che in Linux non esiste una dimensione
+\secref{sec:sys_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.
 
-Una seconda funzione simile è \func{char * get\_current\_dir\_name(void)}
-che è sostanzialmente equivalente ad una \func{getcwd(NULL, 0)}, con la sola
-differenza che essa ritorna il valore della variabile di ambiente
-\macro{PWD}, che essendo costruita dalla shell può contenere anche dei
-riferimenti simbolici.
-
-Come già detto in unix anche le directory sono file, è possibile pertanto
-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{prototype}{unistd.h}{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 specificata dal pathname
-  contenuto nella stringa \var{pathname}.
-\end{prototype}
+Una seconda funzione simile è \func{char * get\_current\_dir\_name(void)} che
+è sostanzialmente equivalente ad una \func{getcwd(NULL, 0)}, con la sola
+differenza che essa ritorna il valore della variabile di ambiente \macro{PWD},
+che essendo costruita dalla shell può contenere anche dei riferimenti
+simbolici; nel caso di  \func{getcwd} infatti, essendo il pathname ricavato
+risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni
+passaggio attraverso eventuali pathname.
+
+Altre due funzioni, \func{chdir} e \func{fchdir}, vengono usate, come dice il
+nome (che deriva da \textit{change directory}), per cambiare la directory di
+lavoro corrente. Dato che anche le directory sono file, è possibile riferirsi
+ad esse anche tramite il file descriptor dell'interfaccia a basso livello, e
+non solo tramite il filename, i prototipi di queste funzioni sono:
+\begin{functions}
+  \headdecl{unistd.h} 
+  \funcdecl{int chdir (const char * path)} 
+  Cambia la directory di lavoro corrente a quella specificata dal pathname
+  contenuto nella stringa \var{path}.
   
-\begin{prototype}{unistd.h}{int fchdir (int filedes)} 
-  Analoga alla precedente, ma usa un file descriptor invece del pathname.
+  \funcdecl{int fchdir (int fd)} 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 \var{errno} viene settata secondo i codici di
-  errore standard di accesso ai file (trattati in dettaglio in
-  \secref{sec:file_access_control}) ai quali si aggiunge il codice
-  \macro{ENOTDIR} nel caso il \var{filename} indichi un file che non sia una
-  directory.
-\end{prototype}
+  errore, in caso di errore \var{errno} viene settata per \func{chdir} ai
+  valori:
+  \begin{errlist}
+  \item \macro{ENOTDIR} Uno dei componenti di \var{path} non è una directory. 
+  \item \macro{EACCESS} Manca il permesso di ricerca su uno dei componenti di
+    \func{path}.
+  \end{errlist}
+  ed inoltre \macro{EFAULT}, \macro{ENAMETOOLONG}, \macro{ENOENT},
+  \macro{ENOMEM}, \macro{ELOOP} e \macro{EIO}. Per \func{fchdir} invece gli
+  errori sono \macro{EBADF} e \macro{EACCES}.
+\end{functions}
 
 
 
@@ -656,7 +689,7 @@ struct stat {
     \end{lstlisting}
   \end{minipage} 
   \normalsize 
-  \caption{La struttura \texttt{stat} per la lettura delle informazioni dei 
+  \caption{La struttura \var{stat} per la lettura delle informazioni dei 
     file}
   \label{fig:file_stat_struct}
 \end{figure}
@@ -781,19 +814,18 @@ corrente.
 In tal caso si avranno differenti risultati a seconda del modi in cui si
 calcola la lunghezza del file, ad esempio il comando \cmd{du}, (che riporta il
 numero di blocchi occupati) potrà dare una dimensione inferiore, mentre se si
-legge dal file (ad esempio usando \cmd{wc -c}), dato che in tal caso per le
-parti non scritte vengono restituiti degli zeri, si avrà lo stesso risultato
-di \cmd{ls}.
-
-Se è sempre possibile allargare un file scrivendoci sopra od usando la
-funzione \func{seek} (vedi \secref{sec:file_seek}) per spostarsi oltre la sua
-fine. Esistono però anche casi in cui si può avere bisogno di effettuare un
-troncamento scartando i dati al di là della dimensione scelta come nuova fine
-del file.
-
-Un file può essere troncato a zero aprendolo con il flag \macro{O\_TRUNC}, ma
-questo è un caso particolare; per qualunque altra dimensione si possono usare
-le due funzioni:
+legge dal file (ad esempio usando il comando \cmd{wc -c}), dato che in tal
+caso per le parti non scritte vengono restituiti degli zeri, si avrà lo stesso
+risultato di \cmd{ls}.
+
+Se è sempre possibile allargare un file, scrivendoci sopra od usando la
+funzione \func{seek} per spostarsi oltre la sua fine, esistono anche casi in
+cui si può avere bisogno di effettuare un troncamento, scartando i dati
+presenti al di là della dimensione scelta come nuova fine del file.
+
+Un file può sempre essere troncato a zero aprendolo con il flag
+\macro{O\_TRUNC}, ma questo è un caso particolare; per qualunque altra
+dimensione si possono usare le due funzioni:
 \begin{functions}
   \headdecl{unistd.h} \funcdecl{int truncate(const char *file\_name, off\_t
     length)} Fa si che la dimensione del file \var{file\_name} sia troncata ad
@@ -803,9 +835,9 @@ le due funzioni:
   eccetto che si usa con un file aperto, specificato tramite il suo file
   descriptor \var{fd}.
   
-  Le funzioni restituiscono zero in caso di successo e -1 per un errore, in
-  caso di errore \var{errno} viene settato opportunamente; per
-  \func{ftruncate} si hanno i valori:
+  Le funzioni restituiscono zero in caso di successo e -1 per un errore, nel
+  qual caso \var{errno} viene settato opportunamente; per \func{ftruncate} si
+  hanno i valori:
   \begin{errlist}
   \item \macro{EBADF} \var{fd}  non è un file descriptor.
   \item \macro{EINVAL} \var{fd} è un riferimento ad un socket, non a un file
@@ -825,17 +857,17 @@ Se il file 
 perduti; il comportamento in caso di lunghezza inferiore non è specificato e
 dipende dall'implementazione: il file può essere lasciato invariato o esteso
 fino alla lunghezza scelta; in quest'ultimo caso lo spazio viene riempito con
-zeri (e in genere si ha la creazione di un hole nel file).
+zeri (e in genere si ha la creazione di un \textit{hole} nel file).
 
 
 \subsection{I tempi dei file}
 \label{sec:file_file_times}
 
 Il sistema mantiene per ciascun file tre tempi. Questi sono registrati
-nell'inode insieme agli altri attributi del file e possono essere letti tramite
-la funzione \func{stat}, che li restituisce attraverso tre campi della
-struttura in \figref{fig:file_stat_struct}. Il significato di detti tempi e
-dei relativi campi è riportato nello schema in \ntab:
+nell'inode insieme agli altri attributi del file e possono essere letti
+tramite la funzione \func{stat}, che li restituisce attraverso tre campi della
+struttura \var{stat} di \figref{fig:file_stat_struct}. Il significato di detti
+tempi e dei relativi campi è riportato nello schema in \ntab:
 
 \begin{table}[htb]
   \centering
@@ -858,7 +890,7 @@ dei relativi campi 
 
 Il primo punto da tenere presente è la differenza fra il cosiddetto tempo di
 modifica (il \textit{modification time} \var{st\_mtime}) e il tempo di
-cambiamento di stato (il \textit{chage time} \var{st\_ctime}). Il primo
+cambiamento di stato (il \textit{change time} \var{st\_ctime}). Il primo
 infatti fa riferimento ad una modifica del contenuto di un file, mentre il
 secondo ad una modifica dell'inode; siccome esistono molte operazioni (come la
 funzione \func{link} e molte altre che vedremo in seguito) che modificano solo
@@ -867,9 +899,9 @@ l'utilizzo di un altro tempo.
 
 Il sistema non tiene conto dell'ultimo accesso all'inode, pertanto funzioni
 come \func{access} o \func{stat} non hanno alcuna influenza sui tre tempi. Il
-tempo di ultimo accesso viene di solito usato per cancellare i file che non
-servono più dopo un certo lasso di tempo (ad esempio \cmd{leafnode} cancella i
-vecchi articoli sulla base di questo tempo).  
+tempo di ultimo accesso (ai dati) viene di solito usato per cancellare i file
+che non servono più dopo un certo lasso di tempo (ad esempio \cmd{leafnode}
+cancella i vecchi articoli sulla base di questo tempo).
 
 Il tempo di ultima modifica invece viene usato da \cmd{make} per decidere
 quali file necessitano di essere ricompilati o (talvolta insieme anche al
@@ -882,14 +914,15 @@ L'effetto delle varie funzioni di manipolazione dei file sui tempi 
 illustrato in \ntab. Si sono riportati gli effetti sia per il file a cui si fa
 riferimento, sia per la directory che lo contiene; questi ultimi possono
 essere capiti se si tiene conto di quanto già detto, e cioè che anche le
-directory sono files, che il sistema tratta in maniera del tutto analoga agli
-altri. 
+directory sono file (che contengono una lista di nomi) che il sistema tratta
+in maniera del tutto analoga a tutti gli altri.
 
 Per questo motivo tutte le volte che compiremo una operazione su un file che
-comporta una modifica della sua directory entry, andremo anche a scrivere
-sulla directory che lo contiene cambiandone il tempo di modifica. Un esempio
-di questo può essere la cancellazione di un file, mentre leggere o scrivere o
-cambiarne i permessi ha effetti solo sui tempi del file.
+comporta una modifica del nome contenuto nella directory, andremo anche a
+scrivere sulla directory che lo contiene cambiandone il tempo di modifica. Un
+esempio di questo può essere la cancellazione di un file, invece leggere o
+scrivere o cambiare i permessi di un file ha effetti solo sui tempi di
+quest'ultimo.
 
 \begin{table}[htb]
   \centering
@@ -963,7 +996,7 @@ cambiarne i permessi ha effetti solo sui tempi del file.
 \end{table}
 
 Si noti infine come \var{st\_ctime} non abbia nulla a che fare con il tempo di
-creazione del file, usato da molti altri sistemi operativi, che in unix non
+creazione del file, usato in molti altri sistemi operativi, ma che in unix non
 esiste.
 
 
@@ -972,7 +1005,6 @@ esiste.
 
 I tempi di ultimo accesso e modifica possono essere cambiati usando la
 funzione \func{utime}, il cui prototipo è:
-
 \begin{prototype}{utime.h}
 {int utime(const char * filename, struct utimbuf *times)} 
 
@@ -1008,9 +1040,8 @@ volte che si modifica l'inode (quindi anche alla chiamata di \func{utime}).
 Questo serve anche come misura di sicurezza per evitare che si possa
 modificare un file nascondendo completamente le proprie tracce.  In realtà la
 cosa resta possibile, se si è in grado di accedere al device, scrivendo
-direttamente sul disco senza passare attraverso il filesystem, ma ovviamente è
-molto più complicato da realizzare.
-
+direttamente sul disco senza passare attraverso il filesystem, ma ovviamente
+in questo modo la cosa è molto più complicata da realizzare.
 
 
 
@@ -1168,7 +1199,7 @@ di accesso sono i seguenti:
   all'amministratore) l'accesso è sempre garantito senza nessun ulteriore
   controllo. Per questo motivo \textsl{root} ha piena libertà di accesso a
   tutti i file.
-\item Se l'\textit{effective user id} del processo è uguale all'uid del
+\item Se l'\textit{effective user id} del processo è uguale all'\acr{uid} del
   proprietario del file (nel qual caso si dice che il processo è proprietario
   del file) allora:
   \begin{itemize}
@@ -1218,19 +1249,19 @@ corrispondono dell'utente con cui si 
 Se però il file del programma\footnote{per motivi di sicurezza il kernel
   ignora i bit \acr{suid} e \acr{sgid} per gli script eseguibili} (che
 ovviamente deve essere eseguibile) ha il bit \acr{suid} settato, il kernel
-assegnerà come \textit{effective user id} al nuovo processo l'uid del
-proprietario del file al posto dell'uid del processo originario.  Avere il bit
-\acr{sgid} settato ha lo stesso effetto sull'\textit{effective group id} del
-processo.
-
-I bit \textsl{suid} e \textsl{sgid} vengono usati per permettere agli utenti
-normali di usare programmi che abbisognano di privilegi speciali; l'esempio
-classico è il comando \cmd{passwd} che ha la necessità di modificare il file
-delle password, quest'ultimo ovviamente può essere scritto solo
-dall'amministratore, ma non è necessario chiamare l'amministratore per
-cambiare la propria password. Infatti il comando \cmd{passwd} appartiene a
-root ma ha il bit suid settato per cui quando viene lanciato da un utente
-normale parte con i privilegi di root.
+assegnerà come \textit{effective user id} al nuovo processo l'\acr{uid} del
+proprietario del file al posto dell'\acr{uid} del processo originario.  Avere
+il bit \acr{sgid} settato ha lo stesso effetto sull'\textit{effective group
+  id} del processo.
+
+I bit \acr{suid} e \acr{sgid} vengono usati per permettere agli utenti normali
+di usare programmi che abbisognano di privilegi speciali; l'esempio classico è
+il comando \cmd{passwd} che ha la necessità di modificare il file delle
+password, quest'ultimo ovviamente può essere scritto solo dall'amministratore,
+ma non è necessario chiamare l'amministratore per cambiare la propria
+password. Infatti il comando \cmd{passwd} appartiene a root ma ha il bit
+\acr{suid} settato per cui quando viene lanciato da un utente normale parte
+con i privilegi di root.
 
 Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe
 normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di
@@ -1257,7 +1288,7 @@ Infine Linux utilizza il bit \acr{sgid} per una ulteriore estensione
 mutuata da SVR4. Il caso in cui il file abbia il bit \acr{sgid} settato ma
 non il corrispondente bit di esecuzione viene utilizzato per attivare per
 quel file il \textit{mandatory locking} (argomento che affronteremo nei
-dettagli in \secref{sec:xxx_mandatory_lock}).
+dettagli in \secref{sec:file_mand_locking}).
 
 
 \subsection{Il bit \textsl{sticky}}
@@ -1322,11 +1353,11 @@ invece prevede due diverse possibilit
 \begin{itemize}
 \item il \acr{gid} del file corrisponde all'\textit{effective group id} del
   processo.
-\item il \acr{gid} del file corrisponde al gid della directory in cui esso è
-  creato.
+\item il \acr{gid} del file corrisponde al \acr{gid} della directory in cui
+  esso è creato.
 \end{itemize}
 in genere BSD usa sempre la seconda possibilità, che viene per questo chiamata
-semantica BSD. Linux invece segue quella che viene chiamata semantica SVR4; di
+semantica BSD. Linux invece segue quella che viene chiamata semantica SVr4; di
 norma cioè il nuovo file viene creato, seguendo la prima opzione, con il
 \acr{gid} del processo, se però la directory in cui viene creato il file ha il
 bit \acr{sgid} settato allora viene usata la seconda opzione.
@@ -1352,7 +1383,6 @@ l'\acr{uid} dell'utente che ha lanciato il programma, che, come accennato in
 \secref{sec:file_suid_sgid} e spiegato in \secref{sec:proc_perms} non è
 detto sia uguale all'\textit{effective user id}). Per far questo si può usare
 la funzione \func{access}, il cui prototipo è:
-
 \begin{prototype}{unistd.h}
 {int access(const char *pathname, int mode)}
 
@@ -1379,7 +1409,6 @@ possa scrivere come in un file, e il fatto che un file abbia permesso di
 esecuzione non comporta che contenga un programma eseguibile. La funzione
 ritorna zero solo se tutte i permessi controllati sono disponibili, in caso
 contrario (o di errore) ritorna -1.
-
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -1411,7 +1440,6 @@ accedere ad un certo file.
 Per cambiare i permessi di un file il sistema mette ad disposizione due
 funzioni, che operano rispettivamente su un filename e su un file descriptor,
 i loro prototipi sono:
-
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/stat.h} 
@@ -1442,7 +1470,7 @@ divisibili in gruppi di tre). Ad esempio i permessi standard assegnati ai
 nuovi file (lettura e scrittura per il proprietario, sola lettura per il
 gruppo e gli altri) sono corrispondenti al valore ottale $0644$, un programma
 invece avrebbe anche il bit di esecuzione attivo, con un valore di $0755$, se
-si volesse attivare il bit suid il valore da fornire sarebbe $4755$.
+si volesse attivare il bit \acr{suid} il valore da fornire sarebbe $4755$.
 
 \begin{table}[!htb]
   \centering
@@ -1495,7 +1523,7 @@ particolare:
   l'\textit{effective user id} del processo è zero).
 \end{itemize}
 
-Per alcuni filesystem\footnote{il filesystem \textsl{ext2} supporta questa
+Per alcuni filesystem\footnote{il filesystem \acr{ext2} supporta questa
   caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore
 misura di sicurezza, volta ad scongiurare l'abuso dei bit \acr{suid} e
 \acr{sgid}; essa consiste nel cancellare automaticamente questi bit qualora un
@@ -1504,14 +1532,12 @@ modo anche se un utente malizioso scopre un file \acr{suid} su cui pu
 scrivere, un eventuale modifica comporterà la perdita di ogni ulteriore
 privilegio.
 
-
 \subsection{La funzione \func{umask}}
 \label{sec:file_umask}
 
 Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai
 nuovi file sono controllati anche da una maschera di bit settata con la
 funzione \func{umask}, il cui prototipo è:
-
 \begin{prototype}{stat.h}
 {mode\_t umask(mode\_t mask)}
 
@@ -1548,7 +1574,6 @@ allora occorrer
 Come per i permessi, il sistema fornisce anche delle funzioni che permettano
 di cambiare utente e gruppo cui il file appartiene; le funzioni in questione
 sono tre e i loro prototipi sono i seguenti:
-
 \begin{functions}
   \headdecl{sys/types.h} 
   \headdecl{sys/stat.h}