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.
\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}
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
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
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
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
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.}
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.}
\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