Continua la conversione delle figure con i listati
[gapil.git] / fileadv.tex
index 78adf0840bb8c1d743f0e03b95e36304a16a6cdd..9980d895a06ce42c75840ee22a1aff8f3f75dd21 100644 (file)
@@ -211,7 +211,7 @@ negativo indica un'attesa indefinita).
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+    \begin{lstlisting}[stepnumber=0]{}
 struct pollfd {
         int fd;           /* file descriptor */
         short events;     /* requested events */
@@ -313,12 +313,13 @@ della funzione.
 L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili
 race condition\footnote{in Linux però, non esistendo una system call apposita,
   la funzione è implementata nelle \acr{glibc} usando \func{select}, e la
-  possibilità di una race condition resta.} quando si deve eseguire un test su
-una variabile assegnata da un gestore sulla base dell'occorrenza di un
-segnale per decidere se lanciare \func{select}. Fra il test e l'esecuzione è
-presente una finestra in cui potrebbe arrivare il segnale che non sarebbe
-rilevato; la race condition diventa superabile disabilitando il segnale prima
-del test e riabilitandolo poi grazie all'uso di \param{sigmask}.
+  possibilità di una race condition\index{race condition} resta.} quando si
+deve eseguire un test su una variabile assegnata da un gestore sulla base
+dell'occorrenza di un segnale per decidere se lanciare \func{select}. Fra il
+test e l'esecuzione è presente una finestra in cui potrebbe arrivare il
+segnale che non sarebbe rilevato; la race condition\index{race condition}
+diventa superabile disabilitando il segnale prima del test e riabilitandolo
+poi grazie all'uso di \param{sigmask}.
 
 
 
@@ -404,9 +405,10 @@ di thread. Al momento\footnote{fino ai kernel della serie 2.4.x, nella serie
   di I/O, che prevede anche l'introduzione di un nuovo layer per l'I/O
   asincrono (effettuato a partire dal 2.5.32).} esiste una sola versione
 stabile di questa interfaccia, quella delle \acr{glibc}, che è realizzata
-completamente in user space.  Esistono comunque vari progetti sperimentali
-(come il KAIO della SGI, o i patch di Benjamin La Haise) che prevedono un
-supporto diretto da parte del kernel.
+completamente in user space, ed accessibile linkando i programmi con la
+libreria \file{librt}.  Esistono comunque vari progetti sperimentali (come il
+KAIO della SGI, o i patch di Benjamin La Haise) che prevedono un supporto
+diretto da parte del kernel.
 
 Lo standard prevede che tutte le operazioni di I/O asincrono siano controllate
 attraverso l'uso di una apposita struttura \struct{aiocb} (il cui nome sta per
@@ -419,7 +421,7 @@ disponibilit
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+    \begin{lstlisting}[stepnumber=0]{}
 struct aiocb
 {
     int aio_fildes;               /* File descriptor.  */
@@ -469,14 +471,14 @@ esse.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+    \begin{lstlisting}[stepnumber=0]{}
 struct sigevent
 {
     sigval_t sigev_value;
     int sigev_signo;
     int sigev_notify;
-    sigev_notify_function;
-    sigev_notify_attributes;
+    void (*sigev_notify_function)(sigval_t);
+    pthread_attr_t *sigev_notify_attributes;
 };
     \end{lstlisting}
   \end{minipage} 
@@ -492,15 +494,17 @@ notifica del completamento delle operazioni richieste. La struttura 
 riportata in \secref{fig:file_sigevent}; il campo \var{sigev\_notify} è quello
 che indica le modalità della notifica, esso può assumere i tre valori:
 \begin{basedescript}{\desclabelwidth{3.0cm}}
-\item[\const{SIGEV\_NONE}]   Non viene inviata nessuna notifica.
+\item[\const{SIGEV\_NONE}]  Non viene inviata nessuna notifica.
 \item[\const{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
-  chiamante il segnale specificato nel campo \var{sigev\_signo}, se il
-  gestore è installato con \const{SA\_SIGINFO}, il gli verrà restituito
-  il valore di \var{sigev\_value} in come valore del campo \var{si\_value} per
+  chiamante il segnale specificato da \var{sigev\_signo}; se il gestore di
+  questo è stato installato con \const{SA\_SIGINFO} gli verrà restituito il
+  valore di \var{sigev\_value} (la cui definizione è in
+  \figref{fig:sig_sigval}) come valore del campo \var{si\_value} di
   \struct{siginfo\_t}.
 \item[\const{SIGEV\_THREAD}] La notifica viene effettuata creando un nuovo
-  thread che esegue la funzione specificata da \var{sigev\_notify\_function},
-  con gli attributi specificati da \var{sigev\_notify\_attribute}.
+  thread che esegue la funzione specificata da \var{sigev\_notify\_function}
+  con argomento \var{sigev\_value}, e con gli attributi specificati da
+  \var{sigev\_notify\_attribute}.
 \end{basedescript}
 
 Le due funzioni base dell'interfaccia per l'I/O asincrono sono
@@ -814,7 +818,7 @@ il secondo, \var{iov\_len}, la dimensione dello stesso.
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+    \begin{lstlisting}[stepnumber=0]{}
 struct iovec {
     __ptr_t iov_base;    /* Starting address */
     size_t iov_len;      /* Length in bytes  */
@@ -1129,14 +1133,14 @@ Pertanto se si modifica un file con l'interfaccia standard queste modifiche
 potranno essere visibili o meno a seconda del momento in cui la memoria
 virtuale trasporterà dal disco in memoria quella sezione del file, perciò è
 del tutto imprevedibile il risultato della modifica di un file nei confronti
-del contenuto della memoria mappata su cui è mappato.
-
-Per quanto appena visto, è sempre sconsigliabile eseguire scritture su file
-attraverso l'interfaccia standard, quando lo si è mappato in memoria, è invece
-possibile usare l'interfaccia standard per leggere un file mappato in memoria,
-purché si abbia una certa cura; infatti l'interfaccia dell'I/O mappato in
-memoria mette a disposizione la funzione \funcd{msync} per sincronizzare il
-contenuto della memoria mappata con il file su disco; il suo prototipo è:
+del contenuto della memoria su cui è mappato.
+
+Per questo, è sempre sconsigliabile eseguire scritture su file attraverso
+l'interfaccia standard, quando lo si è mappato in memoria, è invece possibile
+usare l'interfaccia standard per leggere un file mappato in memoria, purché si
+abbia una certa cura; infatti l'interfaccia dell'I/O mappato in memoria mette
+a disposizione la funzione \funcd{msync} per sincronizzare il contenuto della
+memoria mappata con il file su disco; il suo prototipo è:
 \begin{functions}  
   \headdecl{unistd.h}
   \headdecl{sys/mman.h} 
@@ -1240,9 +1244,10 @@ 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 race condition, attraverso una serie di funzioni che permettono di
-bloccare l'accesso al file da parte di altri processi, così da evitare le
-sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
+evitare le race condition\index{race condition}, attraverso una serie di
+funzioni che permettono di bloccare l'accesso al file da parte di altri
+processi, così da evitare le sovrapposizioni, e garantire la atomicità delle
+operazioni di scrittura.
 
 
 
@@ -1507,12 +1512,12 @@ regione bloccata.
 \begin{figure}[!bht]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
-    \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+    \begin{lstlisting}[stepnumber=0]{}
 struct flock {
     short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
-    short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+    short int l_whence; /* Where `l_start' is relative to (like `lseek').*/
     off_t l_start;      /* Offset where the lock begins.  */
-    off_t l_len;        /* Size of the locked area; zero means until EOF.  */
+    off_t l_len;        /* Size of the locked area; zero means until EOF.*/
     pid_t l_pid;        /* Process holding the lock.  */
 };
     \end{lstlisting}