Correzioni sul signal driven I/O dal fine settimana, rimaste indietro
authorSimone Piccardi <piccardi@gnulinux.it>
Tue, 1 Sep 2009 14:22:13 +0000 (14:22 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Tue, 1 Sep 2009 14:22:13 +0000 (14:22 +0000)
fileadv.tex
fileunix.tex
signal.tex

index 983a14ccef9e0ad773ef044061c22d500dda1112..bb1df38d03c8114448eead5d32e4287929657437 100644 (file)
@@ -1778,10 +1778,11 @@ Come gi
 contemponeamente, per far questo di nuovo è necessaria una variante della
 funzione di attesa che consenta di reimpostare all'uscita una maschera di
 segnali, analoga alle precedenti estensioni \func{pselect} e \func{ppoll}; in
-questo caso la funzione si chiama \funcd{epoll\_pwait} ed il suo prototipo è:
-\begin{prototype}{sys/epoll.h}
+questo caso la funzione si chiama \funcd{epoll\_pwait}\footnote{introdotta a
+  partire dal kernel 2.6.19.} ed il suo prototipo è:
+\begin{prototype}{sys/epoll.h} 
   {int epoll\_pwait(int epfd, struct epoll\_event * events, int maxevents, 
-    int timeout, const sigset_t *sigmask)}
+    int timeout, const sigset\_t *sigmask)}
 
   Attende che uno dei file descriptor osservati sia pronto, mascherando i
   segnali. 
@@ -1793,9 +1794,10 @@ questo caso la funzione si chiama \funcd{epoll\_pwait} ed il suo prototipo 
 \end{prototype}
 
 La funzione è del tutto analoga \funcd{epoll\_wait}, soltanto che alla sua
-uscita viene ripristinata la maschera di segnali impostata con
-l'argomento \param{sigmask}, in sostanza la chiamata a questa funzione è
-equivalente al seguente codice, eseguito però in maniera atomica:
+uscita viene ripristinata la maschera di segnali originale, sostituita durante
+l'esecuzione da quella impostata con l'argomento \param{sigmask}; in sostanza
+la chiamata a questa funzione è equivalente al seguente codice, eseguito però
+in maniera atomica:
 \includecodesnip{listati/epoll_pwait_means.c} 
 
 Si tenga presente che come le precedenti funzioni di \textit{I/O multiplexing}
@@ -1836,26 +1838,28 @@ l'uso del flag \const{O\_ASYNC},\footnote{l'uso del flag di \const{O\_ASYNC} e
   specifico di Linux e BSD.} aprire un file in modalità asincrona, così come è
 possibile attivare in un secondo tempo questa modalità impostando questo flag
 attraverso l'uso di \func{fcntl} con il comando \const{F\_SETFL} (vedi
-sez.~\ref{sec:file_fcntl}).
-
-In realtà parlare di apertura in modalità asincrona non significa che le
-operazioni di lettura o scrittura del file vengono eseguite in modo asincrono
-(tratteremo questo, che è ciò che più propriamente viene chiamato \textsl{I/O
-  asincrono}, in sez.~\ref{sec:file_asyncronous_io}), quanto dell'attivazione
-un meccanismo di notifica asincrona delle variazione dello stato del file
-descriptor aperto in questo modo.  Quello che succede in questo caso è che il
-sistema genera un segnale (normalmente \const{SIGIO}, ma è possibile usarne
-altri con il comando \const{F\_SETSIG} di \func{fcntl}) tutte le volte che
-diventa possibile leggere o scrivere dal file descriptor che si è posto in
-questa modalità.\footnote{questa modalità non è utilizzabile con i file
-  ordinari ma solo con socket, file di terminale o pseudo terminale, e, a
-  partire dal kernel 2.6, anche per fifo e pipe.}
-
-Si può inoltre selezionare, con il comando \const{F\_SETOWN} di \func{fcntl},
-quale processo (o gruppo di processi) riceverà il segnale. Se pertanto si
-effettuano le operazioni di I/O in risposta alla ricezione del segnale non ci
-sarà più la necessità di restare bloccati in attesa della disponibilità di
-accesso ai file. 
+sez.~\ref{sec:file_fcntl}). In realtà parlare di apertura in modalità
+asincrona non significa che le operazioni di lettura o scrittura del file
+vengono eseguite in modo asincrono (tratteremo questo, che è ciò che più
+propriamente viene chiamato \textsl{I/O asincrono}, in
+sez.~\ref{sec:file_asyncronous_io}), quanto dell'attivazione un meccanismo di
+notifica asincrona delle variazione dello stato del file descriptor aperto in
+questo modo.  
+
+Quello che succede è che per tutti i file posti in questa modalità\footnote{si
+  tenga presente però che essa non è utilizzabile con i file ordinari ma solo
+  con socket, file di terminale o pseudo terminale, ed anche, a partire dal
+  kernel 2.6, anche per fifo e pipe.} il sistema genera un apposito segnale,
+\const{SIGIO}, tutte le volte che diventa possibile leggere o scrivere dal
+file descriptor che si è posto in questa modalità. Inoltre è possibile, come
+illustrato in sez.~\ref{sec:file_fcntl}, selezionare con il comando
+\const{F\_SETOWN} di \func{fcntl} quale processo o quale gruppo di processi
+dovrà ricevere il segnale. In questo modo diventa possibile effettuare le
+operazioni di I/O in risposta alla ricezione del segnale, e non ci sarà più la
+necessità di restare bloccati in attesa della disponibilità di accesso ai
+file.
+
+% TODO: per i thread l'uso di F_SETOWN ha un significato diverso
 
 Per questo motivo Stevens, ed anche le pagine di manuale di Linux, chiamano
 questa modalità ``\textit{Signal driven I/O}''.  Si tratta di un'altra
@@ -1988,7 +1992,7 @@ Esistono due tipi di \textit{file lease}: di lettura (\textit{read lease}) e
 di scrittura (\textit{write lease}). Nel primo caso la notifica avviene quando
 un altro processo esegue l'apertura del file in scrittura o usa
 \func{truncate} per troncarlo. Nel secondo caso la notifica avviene anche se
-il file viene aperto il lettura; in quest'ultimo caso però il \textit{lease}
+il file viene aperto in lettura; in quest'ultimo caso però il \textit{lease}
 può essere ottenuto solo se nessun altro processo ha aperto lo stesso file.
 
 Come accennato in sez.~\ref{sec:file_fcntl} il comando di \func{fcntl} che
index a97db9a0bc6c2c8d9a1dc53777a5684e6cc7ed0b..ea5484a93225cdf11f0f770e98474ea489320ad2 100644 (file)
@@ -1396,15 +1396,22 @@ per \var{cmd} 
     group}\footnote{i \itindex{process~group} \textit{process group} sono
     (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} e \const{SIGURG} per gli eventi associati al file
-  descriptor \param{fd}. Nel caso di un \textit{process group} viene
-  restituito un valore negativo il cui valore assoluto corrisponde
+    (un numero positivo analogo al \acr{pid}).} che è preposto alla ricezione
+  dei segnali \const{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
+  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
   all'identificatore del \itindex{process~group} \textit{process group}.  In
   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 \const{SIGIO}  e \const{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
index b1206981548bfcfcd7a32e40ef00a30c5be08fe2..7773028509164402112d6798356aa089ed7b6caa 100644 (file)
@@ -1859,7 +1859,7 @@ affini, le informazioni circa l'origine del segnale stesso, ad esempio se
 generato dal kernel, da un timer, da \func{kill}, ecc. Il valore viene sempre
 espresso come una costante,\footnote{le definizioni di tutti i valori
   possibili si trovano in \file{bits/siginfo.h}.} ed i valori possibili in
-questo caso sono riportati in tab.~\ref{tab:sig_sa_code_generic}.
+questo caso sono riportati in tab.~\ref{tab:sig_si_code_generic}.
 
 Nel caso di alcuni segnali però il valore di \var{si\_code} viene usato per
 fornire una informazione specifica relativa alle motivazioni della ricezione
@@ -1896,9 +1896,9 @@ altre informazioni specifiche.
                          sez.~\ref{cha:threads_xxx}).\footnotemark\\ 
     \hline
   \end{tabular}
-  \caption{Valori del campo \var{sa\_code} della struttura \struct{sigaction}
+  \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
     per i segnali generici.}
-  \label{tab:sig_sa_code_generic}
+  \label{tab:sig_si_code_generic}
 \end{table}
 
 \footnotetext[24]{introdotto con il kernel 2.6.6.}
@@ -1910,7 +1910,7 @@ segnali;\footnote{dato che si tratta di una costante, e non di una maschera
   binaria, i valori numerici vengono riutilizzati e ciascuno di essi avrà un
   significato diverso a seconda del segnale a cui è associato.} l'elenco
 dettagliato dei nomi di queste costanti è riportato nelle diverse sezioni di
-tab.~\ref{tab:sig_sa_code_special} che sono state ordinate nella sequenza in
+tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella sequenza in
 cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
   indica comunque in maniera diretta il segnale a cui le costanti fanno
   riferimento.}
@@ -1966,11 +1966,11 @@ cui si sono appena citati i rispettivi segnali.\footnote{il prefisso del nome
     \const{POLL\_HUP}  & il dispositivo è stato disconnesso.\\
     \hline
   \end{tabular}
-  \caption{Valori del campo \var{sa\_code} della struttura \struct{sigaction}
+  \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
     impostati rispettivamente dai segnali \const{SIGILL}, \const{SIGFPE},
     \const{SIGSEGV}, \const{SIGBUS}, \const{SIGCHLD}, \const{SIGTRAP} e
-    \const{SIGPOLL}.}
-  \label{tab:sig_sa_code_special}
+    \const{SIGPOLL}/\const{SIGIO}.}
+  \label{tab:sig_si_code_special}
 \end{table}
 
 Il resto della struttura \struct{siginfo\_t} è definito come \ctyp{union} ed i