Messa sezione sulle {{{ioctl}}} per la gestione delle interfacce di
[gapil.git] / fileadv.tex
index 904e81ea18cdbbc17f00762232e937babf2d05fd..58c7ee6bed6825316e9765751e1cd1ca6512a516 100644 (file)
@@ -38,12 +38,11 @@ I/O.
 Abbiamo visto in sez.~\ref{sec:sig_gen_beha}, affrontando la suddivisione fra
 \textit{fast} e \textit{slow} system call,\index{system~call~lente} che in
 certi casi le funzioni di I/O possono bloccarsi indefinitamente.\footnote{si
-  ricordi però che questo può accadere solo per le pipe, i
-  socket\index{socket} ed alcuni file di
-  dispositivo\index{file!di~dispositivo}; sui file normali le funzioni di
-  lettura e scrittura ritornano sempre subito.}  Ad esempio le operazioni di
-lettura possono bloccarsi quando non ci sono dati disponibili sul descrittore
-su cui si sta operando.
+  ricordi però che questo può accadere solo per le pipe, i socket ed alcuni
+  file di dispositivo\index{file!di~dispositivo}; sui file normali le funzioni
+  di lettura e scrittura ritornano sempre subito.}  Ad esempio le operazioni
+di lettura possono bloccarsi quando non ci sono dati disponibili sul
+descrittore su cui si sta operando.
 
 Questo comportamento causa uno dei problemi più comuni che ci si trova ad
 affrontare nelle operazioni di I/O, che si verifica quando si deve operare con
@@ -91,8 +90,8 @@ ulteriori dettagli e qualche esempio in sez.~\ref{sec:TCP_sock_multiplexing}.
 Il primo kernel unix-like ad introdurre una interfaccia per l'\textit{I/O
   multiplexing} è stato BSD,\footnote{la funzione \func{select} è apparsa in
   BSD4.2 e standardizzata in BSD4.4, ma è stata portata su tutti i sistemi che
-  supportano i \textit{socket}\index{socket}, compreso le varianti di System
-  V.}  con la funzione \funcd{select}, il cui prototipo è:
+  supportano i socket, compreso le varianti di System V.}  con la funzione
+\funcd{select}, il cui prototipo è:
 \begin{functions}
   \headdecl{sys/time.h}
   \headdecl{sys/types.h}
@@ -167,8 +166,8 @@ effettuare una lettura,\footnote{per essere precisi la funzione ritorner
   tutti i casi in cui la successiva esecuzione di \func{read} risulti non
   bloccante, quindi anche in caso di \textit{end-of-file}.} il secondo,
 \param{writefds}, per verificare la possibilità effettuare una scrittura ed il
-terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni (come i
-messaggi urgenti su un \textit{socket}\index{socket}, vedi
+terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni (come i dati
+urgenti \itindex{out-of-band} su un socket, vedi
 sez.~\ref{sec:TCP_urgent_data}).
 
 Dato che in genere non si tengono mai sotto controllo fino a
@@ -393,7 +392,8 @@ nel campo \var{revents} per notificare delle condizioni di errore.
     \const{POLLIN}    & È possibile la lettura.\\
     \const{POLLRDNORM}& Sono disponibili in lettura dati normali.\\ 
     \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari. \\
-    \const{POLLPRI}   & È possibile la lettura di dati urgenti.\\
+    \const{POLLPRI}   & È possibile la lettura di \itindex{out-of-band} dati
+                        urgenti.\\ 
     \hline
     \const{POLLOUT}   & È possibile la scrittura immediata.\\
     \const{POLLWRNORM}& È possibile la scrittura di dati normali.  \\ 
@@ -418,15 +418,15 @@ compatibilit
   delle librerie standard del C.} è da questi che derivano i nomi di alcune
 costanti, in quanto per essi sono definite tre classi di dati:
 \textsl{normali}, \textit{prioritari} ed \textit{urgenti}.  In Linux la
-distinzione ha senso solo per i dati \textit{out-of-band} dei socket (vedi
-sez.~\ref{sec:TCP_urgent_data}), ma su questo e su come \func{poll} reagisce
-alle varie condizioni dei socket torneremo in sez.~\ref{sec:TCP_serv_poll},
-dove vedremo anche un esempio del suo utilizzo. Si tenga conto comunque che le
-costanti relative ai diversi tipi di dati (come \const{POLLRDNORM} e
-\const{POLLRDBAND}) sono utilizzabili soltanto qualora si sia definita la
-macro \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di farlo sempre in
-  testa al file, definirla soltanto prima di includere \file{sys/poll.h} non è
-  sufficiente.}
+distinzione ha senso solo per i dati urgenti \itindex{out-of-band} dei socket
+(vedi sez.~\ref{sec:TCP_urgent_data}), ma su questo e su come \func{poll}
+reagisce alle varie condizioni dei socket torneremo in
+sez.~\ref{sec:TCP_serv_poll}, dove vedremo anche un esempio del suo utilizzo.
+Si tenga conto comunque che le costanti relative ai diversi tipi di dati (come
+\const{POLLRDNORM} e \const{POLLRDBAND}) sono utilizzabili soltanto qualora si
+sia definita la macro \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di
+  farlo sempre in testa al file, definirla soltanto prima di includere
+  \file{sys/poll.h} non è sufficiente.}
 
 In caso di successo funzione ritorna restituendo il numero di file (un valore
 positivo) per i quali si è verificata una delle condizioni di attesa richieste
@@ -785,14 +785,14 @@ possibile effettuare una richiesta preventiva di dati, in modo da poter
 effettuare in contemporanea le operazioni di calcolo e quelle di I/O.
 
 Benché la modalità di apertura asincrona di un file possa risultare utile in
-varie occasioni (in particolar modo con i socket\index{socket} e gli altri
-file per i quali le funzioni di I/O sono \index{system~call~lente}system call
-lente), essa è comunque limitata alla notifica della disponibilità del file
-descriptor per le operazioni di I/O, e non ad uno svolgimento asincrono delle
-medesime.  Lo standard POSIX.1b definisce una interfaccia apposita per l'I/O
-asincrono vero e proprio, che prevede un insieme di funzioni dedicate per la
-lettura e la scrittura dei file, completamente separate rispetto a quelle
-usate normalmente.
+varie occasioni (in particolar modo con i socket e gli altri file per i quali
+le funzioni di I/O sono \index{system~call~lente}system call lente), essa è
+comunque limitata alla notifica della disponibilità del file descriptor per le
+operazioni di I/O, e non ad uno svolgimento asincrono delle medesime.  Lo
+standard POSIX.1b definisce una interfaccia apposita per l'I/O asincrono vero
+e proprio, che prevede un insieme di funzioni dedicate per la lettura e la
+scrittura dei file, completamente separate rispetto a quelle usate
+normalmente.
 
 In generale questa interfaccia è completamente astratta e può essere
 implementata sia direttamente nel kernel, che in user space attraverso l'uso
@@ -907,8 +907,8 @@ richiesta, o in caso di errore. Non 
 \errcode{EINVAL} siano rilevati immediatamente al momento della chiamata,
 potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e
 scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che
-il file non sia stato aperto in \textit{append mode} (vedi
-sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate
+il file non sia stato aperto in \itindex{append~mode} \textit{append mode}
+(vedi sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate
 comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}.
 
 Si tenga inoltre presente che deallocare la memoria indirizzata da
@@ -1140,7 +1140,8 @@ Oltre alle precedenti modalit
 accesso ai file più evolute rispetto alle normali funzioni di lettura e
 scrittura che abbiamo esaminato in sez.~\ref{sec:file_base_func}. In questa
 sezione allora prenderemo in esame le interfacce per l'\textsl{I/O
-  vettorizzato} e per l'\textsl{I/O mappato in memoria}.
+  vettorizzato} e per l'\textsl{I/O mappato in memoria} e la funzione
+\func{sendfile}.
 
 
 \subsection{I/O vettorizzato}
@@ -1675,7 +1676,6 @@ una combinazione dei valori di tab.~\ref{tab:file_mmap_prot}.  La nuova
 protezione verrà applicata a tutte le pagine contenute, anche parzialmente,
 dall'intervallo fra \param{addr} e \param{addr}+\param{size}-1.
 
-
 Infine Linux supporta alcune operazioni specifiche non disponibili su altri
 kernel unix-like. La prima di queste è la possibilità di modificare un
 precedente \textit{memory mapping}, ad esempio per espanderlo o restringerlo.
@@ -1851,23 +1851,32 @@ mappatura che gi
 % TODO l'I/O sulle porte di I/O 
 % consultare le manpage di ioperm, iopl e outb
 
+%\subsection{L'I/O diretto fra file descriptor con \func{sendfile}}
+%\label{sec:file_sendfile}
+%
+% TODO documentare la funzione sendfile
+% consultare la manpage di sendfile
+
+
 
 \section{Il file locking}
 \label{sec:file_locking}
 
 \index{file!locking|(}
+
 In sez.~\ref{sec:file_sharing} abbiamo preso in esame le modalità in cui un
 sistema unix-like gestisce la condivisione dei file da parte di processi
 diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
-in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
-stesso file non è possibile determinare la sequenza in cui essi opereranno.
+in \itindex{append~mode} \textit{append mode}, quando più processi scrivono
+contemporaneamente sullo stesso file non è possibile determinare la sequenza
+in cui essi opereranno.
 
-Questo causa la possibilità di una \textit{race condition}
-\itindex{race~condition}; in generale le situazioni più comuni sono due:
-l'interazione fra un processo che scrive e altri che leggono, in cui questi
-ultimi possono leggere informazioni scritte solo in maniera parziale o
-incompleta; o quella in cui diversi processi scrivono, mescolando in maniera
-imprevedibile il loro output sul file.
+Questo causa la possibilità di una \itindex{race~condition} \textit{race
+  condition}; in generale le situazioni più comuni sono due: l'interazione fra
+un processo che scrive e altri che leggono, in cui questi ultimi possono
+leggere informazioni scritte solo in maniera parziale o incompleta; o quella
+in cui diversi processi scrivono, mescolando in maniera imprevedibile il loro
+output sul file.
 
 In tutti questi casi il \textit{file locking} è la tecnica che permette di
 evitare le \textit{race condition}\itindex{race~condition}, attraverso una
@@ -2600,6 +2609,8 @@ affatto equivalente a \func{flock}).
 \subsection{Il \textit{mandatory locking}}
 \label{sec:file_mand_locking}
 
+\itindbeg{mandatory~locking|(}
+
 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4,
 per introdurre un file locking che, come dice il nome, fosse effettivo
 indipendentemente dai controlli eseguiti da un processo. Con il
@@ -2686,6 +2697,7 @@ soltanto quando si chiama \func{mmap} con l'opzione \const{MAP\_SHARED} (nel
 qual caso la funzione fallisce con il solito \errcode{EAGAIN}) che comporta la
 possibilità di modificare il file.
 \index{file!locking|)}
+\itindend{mandatory~locking|(}