Sistemata buona parte del capitolo 3.
[gapil.git] / fileunix.tex
index 5de72aa67cd481a748a0c4c9d9ca829fd9a45687..dad3b0fc0e7d67ff56ced3db6006924a9d774d58 100644 (file)
@@ -40,7 +40,7 @@ tutte le implementazione di un sistema unix-like.
 Per poter accedere al contenuto di un file occorre creare un canale di
 comunicazione con il kernel che renda possibile operare su di esso (si ricordi
 quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si fa aprendo il file
-con la funzione \func{open} che provvederà a localizzare \index{inode} l'inode
+con la funzione \func{open} che provvederà a localizzare \itindex{inode} l'inode
 del file e inizializzare i puntatori che rendono disponibili le funzioni che
 il VFS mette a disposizione (riportate in
 tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il
@@ -83,9 +83,9 @@ informazioni relative al file, fra cui:
 \item lo stato del file (nel campo \var{f\_flags}).
 \item il valore della posizione corrente (l'\textit{offset}) nel file (nel
   campo \var{f\_pos}).
-\item un puntatore \index{inode} all'inode\footnote{nel kernel 2.4.x si è in
+\item un puntatore \itindex{inode} all'inode\footnote{nel kernel 2.4.x si è in
     realtà passati ad un puntatore ad una struttura \struct{dentry} che punta
-    a sua volta \index{inode} all'inode passando per la nuova struttura del
+    a sua volta \itindex{inode} all'inode passando per la nuova struttura del
     VFS.}  del file.
 %\item un puntatore alla tabella delle funzioni \footnote{la struttura
 %    \var{f\_op} descritta in sez.~\ref{sec:file_vfs_work}} che si possono usare
@@ -101,7 +101,7 @@ capire i dettagli del funzionamento dell'interfaccia dei \textit{file
 
 \index{file!descriptor|)}
 
-\begin{figure}[htb]
+\begin{figure}[!htb]
   \centering
   \includegraphics[width=13cm]{img/procfile}
   \caption{Schema della architettura dell'accesso ai file attraverso
@@ -142,7 +142,7 @@ tab.~\ref{tab:file_std_files}.
   \footnotesize
   \begin{tabular}[c]{|l|l|}
     \hline
-    \textbf{Costante} & \textbf{Significato} \\
+    \textbf{File} & \textbf{Significato} \\
     \hline
     \hline
     \const{STDIN\_FILENO}  & \textit{file descriptor} dello \textit{standard
@@ -162,7 +162,7 @@ In fig.~\ref{fig:file_proc_file} si è rappresentata una situazione diversa,
 facendo riferimento ad un programma in cui lo \textit{standard input} è
 associato ad un file mentre lo \textit{standard output} e lo \textit{standard
   error} sono entrambi associati ad un altro file (e quindi utilizzano lo
-stesso \index{inode} inode).
+stesso \itindex{inode} inode).
 
 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
 numero di file aperti era anche soggetto ad un limite massimo dato dalle
@@ -322,7 +322,7 @@ ritorno il file descriptor con il valore più basso disponibile.
                          \const{O\_NONBLOCK}.\\
     \const{O\_ASYNC}   & Apre il file per l'I/O in modalità asincrona (vedi
                          sez.~\ref{sec:file_asyncronous_io}). Quando è
-                         impostato viene generato il segnale \const{SIGIO}
+                         impostato viene generato il segnale \signal{SIGIO}
                          tutte le volte che sono disponibili dati in input
                          sul file.\\  
     \const{O\_SYNC}    & Apre il file per l'input/output sincrono: ogni
@@ -552,6 +552,10 @@ seguenti valori\footnote{per compatibilità con alcune vecchie notazioni
   per ottenere la nuova posizione corrente.
 \end{basedescript}
 
+% TODO, trattare, SEEK_HOLE e SEEK_DATA, inclusi nel kernel 3.1, vedi
+% http://lwn.net/Articles/439623/ 
+
+
 Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al
 file, si limita a modificare la posizione corrente (cioè il valore
 \var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}).  Dato che
@@ -765,7 +769,7 @@ scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
     processo o su una posizione oltre il massimo consentito.
   \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è
     chiuso in lettura; in questo caso viene anche generato il segnale
-    \const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
+    \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
     funzione ritorna questo errore.
   \item[\errcode{EINTR}] si è stati interrotti da un segnale prima di aver
     potuto scrivere qualsiasi dato.
@@ -826,7 +830,7 @@ fig.~\ref{fig:file_proc_file} le principali strutture usate dal kernel;
 esamineremo ora in dettaglio le conseguenze che questa architettura ha nei
 confronti dell'accesso allo stesso file da parte di processi diversi.
 
-\begin{figure}[htb]
+\begin{figure}[!htb]
   \centering
   \includegraphics[width=15cm]{img/filemultacc}
   \caption{Schema dell'accesso allo stesso file da parte di due processi 
@@ -840,7 +844,7 @@ situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
 processo avrà una sua voce nella \textit{file table} referenziata da un
 diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
 nella \itindex{file~table} \textit{file table} faranno però riferimento allo
-stesso \index{inode} inode su disco.
+stesso \itindex{inode} inode su disco.
 
 Questo significa che ciascun processo avrà la sua posizione corrente sul file,
 la sua modalità di accesso e versioni proprie di tutte le proprietà che
@@ -852,20 +856,20 @@ che:
 \item ciascun processo può scrivere indipendentemente; dopo ciascuna
   \func{write} la posizione corrente sarà cambiata solo nel processo. Se la
   scrittura eccede la dimensione corrente del file questo verrà esteso
-  automaticamente con l'aggiornamento del campo \var{i\_size} \index{inode}
+  automaticamente con l'aggiornamento del campo \var{i\_size} \itindex{inode}
   nell'inode.
 \item se un file è in modalità \itindex{append~mode} \const{O\_APPEND} tutte
   le volte che viene effettuata una scrittura la posizione corrente viene
-  prima impostata alla dimensione corrente del file letta \index{inode}
+  prima impostata alla dimensione corrente del file letta \itindex{inode}
   dall'inode. Dopo la scrittura il file viene automaticamente esteso.
 \item l'effetto di \func{lseek} è solo quello di cambiare il campo
   \var{f\_pos} nella struttura \struct{file} della \itindex{file~table}
   \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la
   si usa per porsi alla fine del file la posizione viene impostata leggendo la
-  dimensione corrente \index{inode} dall'inode.
+  dimensione corrente \itindex{inode} dall'inode.
 \end{itemize}
 
-\begin{figure}[htb]
+\begin{figure}[!htb]
   \centering
   \includegraphics[width=15cm]{img/fileshar}
   \caption{Schema dell'accesso ai file da parte di un processo figlio}
@@ -1015,7 +1019,7 @@ Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del
 file specificato, ed attendono fino alla conclusione delle operazioni;
 \func{fsync} forza anche la sincronizzazione dei meta-dati del file (che
 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
-altri dati contenuti \index{inode} nell'inode che si leggono con \func{fstat},
+altri dati contenuti \itindex{inode} nell'inode che si leggono con \func{fstat},
 come i tempi del file).
 
 Si tenga presente che questo non comporta la sincronizzazione della
@@ -1056,7 +1060,7 @@ semplicemente quello di copiare il valore nella struttura
 alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
 
-\begin{figure}[htb]
+\begin{figure}[!htb]
   \centering \includegraphics[width=14cm]{img/filedup}
   \caption{Schema dell'accesso ai file duplicati}
   \label{fig:file_dup}
@@ -1139,15 +1143,15 @@ molti casi in cui sarebbe invece utile che ogni singolo \itindex{thread}
 Per risolvere questi problemi, riprendendo una interfaccia già presente in
 Solaris, a fianco delle normali funzioni che operano sui file (come
 \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
-funzioni, contraddistinte dal suffisso \texttt{at}, che permettono l'apertura
-di un file (o le rispettive altre operazioni) usando un pathname relativo ad
-una directory specificata.\footnote{l'introduzione è avvenuta su proposta
-  dello sviluppatore principale delle \acr{glibc} Urlich Drepper; le
-  corrispondenti system call sono state inserite nel kernel ufficiale a
-  partire dalla versione 2.6.16, in precedenza era disponibile una emulazione
-  che, sia pure con prestazioni inferiori, funzionava facendo ricorso all'uso
-  del filesystem \textit{proc} con l'apertura del file attraverso il
-  riferimento a pathname del tipo di
+funzioni, dette anche funzioni ``\textit{at}'' in quanto contraddistinte dal
+suffisso \texttt{at}, che permettono l'apertura di un file (o le rispettive
+altre operazioni) usando un pathname relativo ad una directory
+specificata.\footnote{l'introduzione è avvenuta su proposta dello sviluppatore
+  principale delle \acr{glibc} Urlich Drepper; le corrispondenti system call
+  sono state inserite nel kernel ufficiale a partire dalla versione 2.6.16, in
+  precedenza era disponibile una emulazione che, sia pure con prestazioni
+  inferiori, funzionava facendo ricorso all'uso del filesystem \textit{proc}
+  con l'apertura del file attraverso il riferimento a pathname del tipo di
   \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste funzioni non
 siano presenti negli standard tradizionali esse sono state adottate da vari
 Unix\footnote{oltre a Linux e Solaris sono presenti in vari BSD.} fino ad
@@ -1325,7 +1329,7 @@ il comportamento rispetto a quello ordinario di \func{access}. In questo caso
 esso può essere specificato come maschera binaria di due valori:
 \begin{basedescript}{\desclabelwidth{3.0cm}}
 \item[\const{AT\_EACCESS}] se impostato \funcd{faccessat} esegue il controllo
-  dei permessi usando l'\textsl{user-ID effettivo} invece di quello reale (il
+  dei permessi usando l'\acr{uid} effettivo invece di quello reale (il
   comportamento di default, che riprende quello di \func{access}).
 \item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue
   la dereferenziazione dei link simbolici, effettuando il controllo dei
@@ -1455,13 +1459,13 @@ per \var{cmd} è riportata di seguito:
     (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
     controllo di sessione; a ciascuno di essi è associato un identificatore
     (un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione
-  dei segnali \const{SIGIO}\footnote{o qualunque altro segnale alternativo
+  dei segnali \signal{SIGIO}\footnote{o qualunque altro segnale alternativo
     impostato con \const{F\_FSETSIG}.} per gli eventi associati al file
   descriptor \param{fd}\footnote{il segnale viene usato sia per il
     \textit{Signal Drive I/O}, che tratteremo in
     sez.~\ref{sec:file_asyncronous_operation}, e dai vari meccanismi di
     notifica asincrona, che tratteremo in
-    sez.~\ref{sec:file_asyncronous_lease}.} e \const{SIGURG} per la notifica
+    sez.~\ref{sec:file_asyncronous_lease}.} e \signal{SIGURG} per la notifica
   dei dati urgenti di un socket.\footnote{vedi
     sez.~\ref{sec:TCP_urgent_data}.} Nel caso di un \textit{process group}
   viene restituito un valore negativo il cui valore assoluto corrisponde
@@ -1469,7 +1473,7 @@ per \var{cmd} è riportata di seguito:
   caso di errore viene restituito $-1$.
 \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
   l'identificatore del processo o del \itindex{process~group} \textit{process
-    group} che riceverà i segnali \const{SIGIO}  e \const{SIGURG} per gli
+    group} che riceverà i segnali \signal{SIGIO}  e \signal{SIGURG} per gli
   eventi associati al file descriptor \param{fd}, ritorna un valore nullo in
   caso di successo o $-1$ in caso di errore.  Come per \const{F\_GETOWN}, per
   impostare un \itindex{process~group} \textit{process group} si deve usare
@@ -1478,14 +1482,14 @@ per \var{cmd} è riportata di seguito:
 \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
   sono dati disponibili in ingresso su un file descriptor aperto ed impostato
   per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
-  indica il valore predefinito (che è \const{SIGIO}), un valore diverso da
+  indica il valore predefinito (che è \signal{SIGIO}), un valore diverso da
   zero indica il segnale richiesto, (che può essere anche lo stesso
-  \const{SIGIO}). In caso di errore ritorna $-1$.
+  \signal{SIGIO}). In caso di errore ritorna $-1$.
 \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
   possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
   ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
-  valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
-  valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il
+  valore zero indica di usare il segnale predefinito, \signal{SIGIO}. Un altro
+  valore diverso da zero (compreso lo stesso \signal{SIGIO}) specifica il
   segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
   installato il gestore del segnale come \var{sa\_sigaction} usando
   \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere
@@ -1510,7 +1514,7 @@ per \var{cmd} è riportata di seguito:
   argomento può essere omesso. Questa funzionalità avanzata è trattata in
   dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
 \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
-  riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro
+  riportata al processo chiamante, tramite il segnale \signal{SIGIO} (o altro
   segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
   direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
   in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in caso
@@ -1659,11 +1663,11 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare
   tipo \texttt{const int *}) che contiene un valore logico (un valore nullo
   disabilita, un valore non nullo abilita).
 \item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali
-  \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve
+  \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
   essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui
   valore specifica il PID del processo.
 \item[\const{FIOGETOWN}] legge il processo che riceverà i segnali
-  \const{SIGURG} e \const{SIGIO} generati sul file; il terzo argomento deve
+  \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
   essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà
   scritto il PID del processo.
 \item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
@@ -1681,7 +1685,6 @@ operazioni che sono predefinite per qualunque file,\footnote{in particolare
 
 % TODO aggiungere FIBMAP e FIEMAP, vedi http://lwn.net/Articles/260832
 
-
 Si noti però come la gran parte di queste operazioni specifiche dei file (per
 essere precisi le prime sei dell'elenco) siano effettuabili in maniera
 generica anche tramite l'uso di \func{fcntl}. Le due funzioni infatti sono