From: Simone Piccardi Date: Tue, 1 Sep 2009 14:22:13 +0000 (+0000) Subject: Correzioni sul signal driven I/O dal fine settimana, rimaste indietro X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=1fe3be8e307c2190bf91e531478d39a6d3d51911 Correzioni sul signal driven I/O dal fine settimana, rimaste indietro --- diff --git a/fileadv.tex b/fileadv.tex index 983a14c..bb1df38 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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 diff --git a/fileunix.tex b/fileunix.tex index a97db9a..ea5484a 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -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 diff --git a/signal.tex b/signal.tex index b120698..7773028 100644 --- a/signal.tex +++ b/signal.tex @@ -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