Note e piccole correzioni
[gapil.git] / signal.tex
index 5b28acdf9f6d19a5c107dfe0365961d21ea70d72..6901b69bf0a5c8b70878d9a12226f1c371128768 100644 (file)
@@ -304,12 +304,12 @@ definiti in vari standard.
     \textbf{Sigla} & \textbf{Significato} \\
     \hline
     \hline
     \textbf{Sigla} & \textbf{Significato} \\
     \hline
     \hline
-    A & L'azione predefinita è terminare il processo. \\
-    B & L'azione predefinita è ignorare il segnale. \\
+    A & L'azione predefinita è terminare il processo.\\
+    B & L'azione predefinita è ignorare il segnale.\\
     C & L'azione predefinita è terminare il processo e scrivere un 
     C & L'azione predefinita è terminare il processo e scrivere un 
-        \itindex{core~dump} \textit{core dump}. \\
-    D & L'azione predefinita è fermare il processo. \\
-    E & Il segnale non può essere intercettato. \\
+        \itindex{core~dump} \textit{core dump}.\\
+    D & L'azione predefinita è fermare il processo.\\
+    E & Il segnale non può essere intercettato.\\
     F & Il segnale non può essere ignorato.\\
     \hline
   \end{tabular}
     F & Il segnale non può essere ignorato.\\
     \hline
   \end{tabular}
@@ -334,10 +334,10 @@ colonna standard sono stati indicati anche gli standard in cui ciascun segnale
     \textbf{Sigla} & \textbf{Standard} \\
     \hline
     \hline
     \textbf{Sigla} & \textbf{Standard} \\
     \hline
     \hline
-    P & POSIX. \\
-    B & BSD. \\
-    L & Linux.\\
-    S & SUSv2.\\
+    P & POSIX \\
+    B & BSD \\
+    L & Linux \\
+    S & SUSv2 \\
     \hline
   \end{tabular}
   \caption{Legenda dei valori della colonna \textbf{Standard} di 
     \hline
   \end{tabular}
   \caption{Legenda dei valori della colonna \textbf{Standard} di 
@@ -390,7 +390,7 @@ momento della ricezione del segnale.
     \const{SIGTRAP}  &SL & C & Trappole per un Trace/breakpoint.             \\
     \const{SIGURG}   &SLB& B & Ricezione di una \textit{urgent condition} su 
                                un socket. \\
     \const{SIGTRAP}  &SL & C & Trappole per un Trace/breakpoint.             \\
     \const{SIGURG}   &SLB& B & Ricezione di una \textit{urgent condition} su 
                                un socket. \\
-    \const{SIGVTALRM}&SLB& A & Virtual alarm clock.                          \\
+    \const{SIGVTALRM}&SLB& A & Timer di esecuzione scaduto.                  \\
     \const{SIGXCPU}  &SLB& C & Ecceduto il limite sul tempo di CPU.          \\
     \const{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file. \\
     \const{SIGIOT}   &L  & C & IOT trap. Sinonimo di \const{SIGABRT}.        \\
     \const{SIGXCPU}  &SLB& C & Ecceduto il limite sul tempo di CPU.          \\
     \const{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file. \\
     \const{SIGIOT}   &L  & C & IOT trap. Sinonimo di \const{SIGABRT}.        \\
@@ -563,16 +563,17 @@ segnali sono:
 \subsection{I segnali di allarme}
 \label{sec:sig_alarm}
 
 \subsection{I segnali di allarme}
 \label{sec:sig_alarm}
 
-Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento
-predefinito è quello di causare la terminazione del programma, ma con questi
-segnali la scelta predefinita è irrilevante, in quanto il loro uso presuppone
-sempre la necessità di un gestore.  Questi segnali sono:
+Questi segnali sono generati dalla scadenza di un timer (vedi
+sez.~\ref{sec:sig_alarm_abort}). Il loro comportamento predefinito è quello di
+causare la terminazione del programma, ma con questi segnali la scelta
+predefinita è irrilevante, in quanto il loro uso presuppone sempre la
+necessità di un gestore.  Questi segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
   usato dalla funzione \func{alarm}.
 
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
   usato dalla funzione \func{alarm}.
 
-\item[\const{SIGVTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
+\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
   precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
   processo. 
 
   precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
   processo. 
 
@@ -761,7 +762,7 @@ indicizzate per numero di segnale, per cui una chiamata del tipo di \code{char
 
 
 
 
 
 
-\section{La gestione dei segnali}
+\section{La gestione di base dei segnali}
 \label{sec:sig_management}
 
 I segnali sono il primo e più classico esempio di eventi asincroni, cioè di
 \label{sec:sig_management}
 
 I segnali sono il primo e più classico esempio di eventi asincroni, cioè di
@@ -997,9 +998,9 @@ prototipo 
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore nel qual caso \var{errno} assumerà uno dei valori:
     \begin{errlist}
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore nel qual caso \var{errno} assumerà uno dei valori:
     \begin{errlist}
-    \item[\errcode{EINVAL}] Il segnale specificato non esiste.
-    \item[\errcode{ESRCH}] Il processo selezionato non esiste.
-    \item[\errcode{EPERM}] Non si hanno privilegi sufficienti ad inviare il
+    \item[\errcode{EINVAL}] il segnale specificato non esiste.
+    \item[\errcode{ESRCH}] il processo selezionato non esiste.
+    \item[\errcode{EPERM}] non si hanno privilegi sufficienti ad inviare il
       segnale.
     \end{errlist}}
 \end{functions}
       segnale.
     \end{errlist}}
 \end{functions}
@@ -1045,11 +1046,11 @@ Una seconda funzione che pu
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
     \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
-    $>0$ & il segnale è mandato al processo con il \acr{pid} indicato.\\
-    0    & il segnale è mandato ad ogni processo del \itindex{process~group}
+    $>0$ & Il segnale è mandato al processo con il \acr{pid} indicato.\\
+    0    & Il segnale è mandato ad ogni processo del \itindex{process~group}
            \textit{process group} del chiamante.\\ 
            \textit{process group} del chiamante.\\ 
-    $-1$ & il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
-    $<-1$ & il segnale è mandato ad ogni processo del \textit{process group} 
+    $-1$ & Il segnale è mandato ad ogni processo (eccetto \cmd{init}).\\
+    $<-1$ & Il segnale è mandato ad ogni processo del \textit{process group} 
             \itindex{process~group} $|\code{pid}|$.\\
     \hline
   \end{tabular}
             \itindex{process~group} $|\code{pid}|$.\\
     \hline
   \end{tabular}
@@ -1215,6 +1216,8 @@ significa circa 10~ms). Il sistema assicura comunque che il segnale non sar
 mai generato prima della scadenza programmata (l'arrotondamento cioè è sempre
 effettuato per eccesso).  
 
 mai generato prima della scadenza programmata (l'arrotondamento cioè è sempre
 effettuato per eccesso).  
 
+% TODO: verificare cose è successo con l'introduzione nel kernel degli htrimer
+
 Una seconda causa di potenziali ritardi è che il segnale viene generato alla
 scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
 è attivo (questo è sempre vero per \const{ITIMER\_VIRT}) la consegna è
 Una seconda causa di potenziali ritardi è che il segnale viene generato alla
 scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
 è attivo (questo è sempre vero per \const{ITIMER\_VIRT}) la consegna è
@@ -1227,7 +1230,6 @@ in cui un timer scade prima che il segnale di una precedente scadenza sia
 stato consegnato; in questo caso, per il comportamento dei segnali descritto
 in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato.
 
 stato consegnato; in questo caso, per il comportamento dei segnali descritto
 in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato.
 
-
 Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
 valore corrente di un timer senza modificarlo, è possibile usare la funzione
 \funcd{getitimer}, il cui prototipo è:
 Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
 valore corrente di un timer senza modificarlo, è possibile usare la funzione
 \funcd{getitimer}, il cui prototipo è:
@@ -1472,8 +1474,8 @@ tutti gli stati di terminazione sono stati ricevuti.
 
 
 
 
 
 
-\section{Gestione avanzata}
-\label{sec:sig_control}
+\section{La gestione avanzata dei segnali}
+\label{sec:sig_adv_control}
 
 Le funzioni esaminate finora fanno riferimento alle modalità più elementari
 della gestione dei segnali; non si sono pertanto ancora prese in
 
 Le funzioni esaminate finora fanno riferimento alle modalità più elementari
 della gestione dei segnali; non si sono pertanto ancora prese in
@@ -1553,17 +1555,21 @@ vuoto.
 
 Ma anche questa implementazione comporta dei problemi; in questo caso infatti
 non viene gestita correttamente l'interazione con gli altri segnali; se
 
 Ma anche questa implementazione comporta dei problemi; in questo caso infatti
 non viene gestita correttamente l'interazione con gli altri segnali; se
-infatti il segnale di allarme interrompe un altro gestore, in questo caso
-l'esecuzione non riprenderà nel gestore in questione, ma nel ciclo
-principale, interrompendone inopportunamente l'esecuzione.  Lo stesso tipo di
-problemi si presenterebbero se si volesse usare \func{alarm} per stabilire un
-timeout su una qualunque system call bloccante.
+infatti il segnale di allarme interrompe un altro gestore, l'esecuzione non
+riprenderà nel gestore in questione, ma nel ciclo principale, interrompendone
+inopportunamente l'esecuzione.  Lo stesso tipo di problemi si presenterebbero
+se si volesse usare \func{alarm} per stabilire un timeout su una qualunque
+system call bloccante.
 
 Un secondo esempio è quello in cui si usa il segnale per notificare una
 qualche forma di evento; in genere quello che si fa in questo caso è impostare
 nel gestore un opportuno flag da controllare nel corpo principale del
 programma (con un codice del tipo di quello riportato in
 
 Un secondo esempio è quello in cui si usa il segnale per notificare una
 qualche forma di evento; in genere quello che si fa in questo caso è impostare
 nel gestore un opportuno flag da controllare nel corpo principale del
 programma (con un codice del tipo di quello riportato in
-fig.~\ref{fig:sig_event_wrong}).
+fig.~\ref{fig:sig_event_wrong}). La logica è quella di far impostare al
+gestore (\texttt{\small 14-19}) una variabile globale preventivamente
+inizializzata nel programma principale, il quale potrà determinare,
+osservandone il contenuto, l'occorrenza o meno del segnale, e prendere le
+relative azioni conseguenti (\texttt{\small 6-11}).
 
 \begin{figure}[!htb]
   \footnotesize\centering
 
 \begin{figure}[!htb]
   \footnotesize\centering
@@ -1576,18 +1582,12 @@ fig.~\ref{fig:sig_event_wrong}).
   \label{fig:sig_event_wrong}
 \end{figure}
 
   \label{fig:sig_event_wrong}
 \end{figure}
 
-La logica è quella di far impostare al gestore (\texttt{\small 14-19}) una
-variabile globale preventivamente inizializzata nel programma principale, il
-quale potrà determinare, osservandone il contenuto, l'occorrenza o meno del
-segnale, e prendere le relative azioni conseguenti (\texttt{\small 6-11}).
-
 Questo è il tipico esempio di caso, già citato in
 sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition}
 \textit{race condition}; infatti, in una situazione in cui un segnale è già
 Questo è il tipico esempio di caso, già citato in
 sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition}
 \textit{race condition}; infatti, in una situazione in cui un segnale è già
-arrivato (e \var{flag} è già ad 1) se un altro segnale segnale arriva
-immediatamente dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima
-della cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà
-perduta.
+arrivato (e \var{flag} è già ad 1) se un altro segnale arriva immediatamente
+dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima della
+cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà perduta.
 
 Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono
 delle funzioni più sofisticate di quelle finora illustrate, queste hanno la
 
 Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono
 delle funzioni più sofisticate di quelle finora illustrate, queste hanno la
@@ -1687,10 +1687,10 @@ da un processo. Il suo prototipo 
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido o si è
+  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido o si è
     cercato di installare il gestore per \const{SIGKILL} o
     \const{SIGSTOP}.
     cercato di installare il gestore per \const{SIGKILL} o
     \const{SIGSTOP}.
-  \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi.
+  \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
   \end{errlist}}
 \end{prototype}
 
   \end{errlist}}
 \end{prototype}
 
@@ -1738,13 +1738,13 @@ l'invocazione.
 L'uso di questo campo permette ad esempio di risolvere il problema residuo
 dell'implementazione di \code{sleep} mostrata in
 fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
 L'uso di questo campo permette ad esempio di risolvere il problema residuo
 dell'implementazione di \code{sleep} mostrata in
 fig.~\ref{fig:sig_sleep_incomplete}. In quel caso infatti se il segnale di
-allarme avesse interrotto un altro gestore questo non sarebbe stato
-eseguito correttamente; la cosa poteva essere prevenuta installando gli altri
-gestori usando \var{sa\_mask} per bloccare \const{SIGALRM} durante la
-loro esecuzione.  Il valore di \var{sa\_flag} permette di specificare vari
-aspetti del comportamento di \func{sigaction}, e della reazione del processo
-ai vari segnali; i valori possibili ed il relativo significato sono riportati
-in tab.~\ref{tab:sig_sa_flag}.
+allarme avesse interrotto un altro gestore questo non sarebbe stato eseguito
+correttamente; la cosa poteva essere prevenuta installando gli altri gestori
+usando \var{sa\_mask} per bloccare \const{SIGALRM} durante la loro esecuzione.
+Il valore di \var{sa\_flag} permette di specificare vari aspetti del
+comportamento di \func{sigaction}, e della reazione del processo ai vari
+segnali; i valori possibili ed il relativo significato sono riportati in
+tab.~\ref{tab:sig_sa_flag}.
 
 \begin{table}[htb]
   \footnotesize
 
 \begin{table}[htb]
   \footnotesize
@@ -1759,34 +1759,43 @@ in tab.~\ref{tab:sig_sa_flag}.
                            fermato da uno dei segnali \const{SIGSTOP},
                            \const{SIGTSTP}, \const{SIGTTIN} o 
                            \const{SIGTTOU}.\\
                            fermato da uno dei segnali \const{SIGSTOP},
                            \const{SIGTSTP}, \const{SIGTTIN} o 
                            \const{SIGTTOU}.\\
-    \const{SA\_ONESHOT}  & Ristabilisce l'azione per il segnale al valore 
+    \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore 
                            predefinito una volta che il gestore è stato
                            lanciato, riproduce cioè il comportamento della
                            semantica inaffidabile.\\  
                            predefinito una volta che il gestore è stato
                            lanciato, riproduce cioè il comportamento della
                            semantica inaffidabile.\\  
-    \const{SA\_RESETHAND}& Sinonimo di \const{SA\_ONESHOT}. \\
+    \const{SA\_ONESHOT}  & Nome obsoleto, sinonimo non standard di
+                           \const{SA\_RESETHAND}; da evitare.\\ 
+    \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \itindex{stack} stack 
+                           alternativo per l'esecuzione del gestore (vedi
+                           sez.~\ref{sec:sig_specific_features}).\\ 
     \const{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
                            call} quando vengono interrotte dal suddetto
                            segnale; riproduce cioè il comportamento standard
                            di BSD.\index{system~call~lente}\\ 
     \const{SA\_RESTART}  & Riavvia automaticamente le \textit{slow system
                            call} quando vengono interrotte dal suddetto
                            segnale; riproduce cioè il comportamento standard
                            di BSD.\index{system~call~lente}\\ 
-    \const{SA\_NOMASK}   & Evita che il segnale corrente sia bloccato durante
+    \const{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
                            l'esecuzione del gestore.\\
                            l'esecuzione del gestore.\\
-    \const{SA\_NODEFER}  & Sinonimo di \const{SA\_NOMASK}.\\
+    \const{SA\_NOMASK}   & Nome obsoleto, sinonimo non standard di
+                           \const{SA\_NODEFER}.\\ 
     \const{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
                            gestore in forma estesa usando
     \const{SA\_SIGINFO}  & Deve essere specificato quando si vuole usare un
                            gestore in forma estesa usando
-                           \var{sa\_sigaction} al posto di \var{sa\_handler}.\\
-    \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \itindex{stack} stack 
-                           alternativo per l'esecuzione del gestore (vedi
-                           sez.~\ref{sec:sig_specific_features}).\\ 
+                           \var{sa\_sigaction} al posto di
+                           \var{sa\_handler}.\\
+    \const{SA\_NOCLDWAIT}& Se il segnale è \const{SIGCHLD} allora o processi
+                           figli non divenire \textit{zombie} quando
+                           terminano.\footnotemark \\ 
     \hline
   \end{tabular}
   \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}
   \label{tab:sig_sa_flag}
 \end{table}
 
     \hline
   \end{tabular}
   \caption{Valori del campo \var{sa\_flag} della struttura \struct{sigaction}.}
   \label{tab:sig_sa_flag}
 \end{table}
 
+\footnotetext{questa funzionalità è stata introdotta nel kernel 2.6 e va a
+  modificare il comportamento di \func{waitpid}.}
+
 % TODO con il 2.6 sono stati aggiunti SA_NOCLDWAIT e altro, documentare
 
 Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette
 % TODO con il 2.6 sono stati aggiunti SA_NOCLDWAIT e altro, documentare
 
 Come si può notare in fig.~\ref{fig:sig_sigaction} \func{sigaction} permette
-di utilizzare due forme diverse di gestore,\footnote{La possibilità è prevista
+di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista
   dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x
   con l'introduzione dei segnali real-time (vedi
   sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune
   dallo standard POSIX.1b, ed è stata aggiunta nei kernel della serie 2.1.x
   con l'introduzione dei segnali real-time (vedi
   sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune
@@ -1931,8 +1940,8 @@ pi
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido.
-  \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi.
+  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
+  \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
   \end{errlist}}
 \end{prototype}
 
   \end{errlist}}
 \end{prototype}
 
@@ -1994,8 +2003,8 @@ sospensione del processo lo standard POSIX ha previsto la funzione
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce zero in caso di successo e $-1$ per un
     errore, nel qual caso \var{errno} assumerà i valori:
   \begin{errlist}
-  \item[\errcode{EINVAL}] Si è specificato un numero di segnale invalido.
-  \item[\errcode{EFAULT}] Si sono specificati indirizzi non validi.
+  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
+  \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
   \end{errlist}}
 \end{prototype}
 
   \end{errlist}}
 \end{prototype}
 
@@ -2124,10 +2133,10 @@ Installa un nuovo stack per i segnali.
     errore, nel qual caso \var{errno} assumerà i valori:
 
   \begin{errlist}
     errore, nel qual caso \var{errno} assumerà i valori:
 
   \begin{errlist}
-  \item[\errcode{ENOMEM}] La dimensione specificata per il nuovo stack è minore
+  \item[\errcode{ENOMEM}] la dimensione specificata per il nuovo stack è minore
   di \const{MINSIGSTKSZ}.
   di \const{MINSIGSTKSZ}.
-  \item[\errcode{EPERM}] Uno degli indirizzi non è valido.
-  \item[\errcode{EFAULT}] Si è cercato di cambiare lo stack alternativo mentre
+  \item[\errcode{EPERM}] uno degli indirizzi non è valido.
+  \item[\errcode{EFAULT}] si è cercato di cambiare lo stack alternativo mentre
   questo è attivo (cioè il processo è in esecuzione su di esso).
   \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un
   valore diverso da zero che non è \const{SS\_DISABLE}.
   questo è attivo (cioè il processo è in esecuzione su di esso).
   \item[\errcode{EINVAL}] \param{ss} non è nullo e \var{ss\_flags} contiene un
   valore diverso da zero che non è \const{SS\_DISABLE}.
@@ -2227,11 +2236,98 @@ parte l'uso di \type{sigjmp\_buf} per \param{env}, 
 \func{longjmp}.
 
 
 \func{longjmp}.
 
 
+\subsection{Criteri di programmazione per i gestori dei segnali}
+\label{sec:sig_signal_handler}
 
 
-\subsection{I segnali real-time}
+Abbiamo finora parlato dei gestori dei segnali come funzioni chiamate in
+corrispondenza della consegna di un segnale. In realtà un gestore non può
+essere una funzione qualunque, in quanto esso può essere eseguito in
+corrispondenza all'interruzione in un punto qualunque del programma principale,
+ed ad esempio può essere problematico chiamare all'interno di un gestore di
+segnali la stessa funzione che dal segnale è stata interrotta.
+
+\index{funzioni~sicure|(}
+
+Il concetto è comunque più generale e porta ad una distinzione fra quelle che
+che POSIX chiama \textsl{funzioni insicure} (\textit{n'Usane function}) e
+\textsl{funzioni sicure} (\textit{safe function}); quando un segnale
+interrompe una funzione insicura ed il gestore chiama al suo interno una
+funzione insicura il sistema può dare luogo ad un comportamento indefinito.
+
+Tutto questo significa che un gestore di segnale deve essere programmato con
+molta cura per evitare questa evenienza, pertanto è non è possibile chiamare
+al suo interno una funzione qualunque, e si può ricorrere soltanto all'uso di
+funzioni sicure.
+
+L'elenco delle funzioni sicure varia a secondo dello standard a cui si fa
+riferimento, secondo quanto riportato dallo standard POSIX 1003.1 nella
+revisione del 2003, le ``\textit{signal safe function}'' che possono essere
+chiamate anche all'interno di un gestore di segnali sono quelle della lista
+riportata in fig.~\ref{fig:sig_safe_functions}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \func{\_exit}, \func{abort}, \func{accept}, \func{access},
+    \func{aio\_error} \func{aio\_return}, \func{aio\_suspend}, \func{alarm},
+    \func{bind}, \func{cfgetispeed}, \func{cfgetospeed}, \func{cfsetispeed},
+    \func{cfsetospeed}, \func{chdir}, \func{chmod}, \func{chown},
+    \func{clock\_gettime}, \func{close}, \func{connect}, \func{creat},
+    \func{dup}, \func{dup2}, \func{execle}, \func{execve}, \func{fchmod},
+    \func{fchown}, \func{fcntl}, \func{fdatasync}, \func{fork},
+    \func{fpathconf}, \func{fstat}, \func{fsync}, \func{ftruncate},
+    \func{getegid}, \func{geteuid}, \func{getgid}, \func{getgroups},
+    \func{getpeername}, \func{getpgrp}, \func{getpid}, \func{getppid},
+    \func{getsockname}, \func{getsockopt}, \func{getuid}, \func{kill},
+    \func{link}, \func{listen}, \func{lseek}, \func{lstat}, \func{mkdir},
+    \func{mkfifo}, \func{open}, \func{pathconf}, \func{pause}, \func{pipe},
+    \func{poll}, \func{posix\_trace\_event}, \func{pselect}, \func{raise},
+    \func{read}, \func{readlink}, \func{recv}, \func{recvfrom},
+    \func{recvmsg}, \func{rename}, \func{rmdir}, \func{select},
+    \func{sem\_post}, \func{send}, \func{sendmsg}, \func{sendto},
+    \func{setgid}, \func{setpgid}, \func{setsid}, \func{setsockopt},
+    \func{setuid}, \func{shutdown}, \func{sigaction}, \func{sigaddset},
+    \func{sigdelset}, \func{sigemptyset}, \func{sigfillset},
+    \func{sigismember}, \func{signal}, \func{sigpause}, \func{sigpending},
+    \func{sigprocmask}, \func{sigqueue}, \func{sigset}, \func{sigsuspend},
+    \func{sleep}, \func{socket}, \func{socketpair}, \func{stat},
+    \func{symlink}, \func{sysconf}, \func{tcdrain}, \func{tcflow},
+    \func{tcflush}, \func{tcgetattr}, \func{tcgetgrp}, \func{tcsendbreak},
+    \func{tcsetattr}, \func{tcsetpgrp}, \func{time}, \func{timer\_getoverrun},
+    \func{timer\_gettime}, \func{timer\_settime}, \func{times}, \func{umask},
+    \func{uname}, \func{unlink}, \func{utime}, \func{wait}, \func{waitpid},
+    \func{write}.
+  \end{minipage} 
+  \normalsize 
+  \caption{Elenco delle funzioni sicure secondo lo standard POSIX
+    1003.1-2003.}
+  \label{fig:sig_safe_functions}
+\end{figure}
+
+\index{funzioni~sicure|)}
+
+Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
+effettuate all'interno di un gestore di segnali, qualora si debbano compiere
+operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa
+il gestore per impostare il valore di una qualche variabile globale, e poi si
+eseguono le operazioni complesse nel programma verificando (con tutti gli
+accorgimenti visti in precedenza) il valore di questa variabile tutte le volte
+che si è rilevata una interruzione dovuta ad un segnale.
+
+
+\section{Funzionalità avanzate}
 \label{sec:sig_real_time}
 
 
 \label{sec:sig_real_time}
 
 
+Tratteremo in questa ultima sezione alcune funzionalità avanzate relativa ai
+segnali ed in generale ai meccanismi di notifica, a partire dalla funzioni
+introdotte per la gestione dei cosiddetti ``\textsl{segnali real-time}'', alla
+gestione avanzata delle temporizzazioni e le nuove interfacce per la gestione
+di segnali ed eventi attraverso l'uso di filedescriptor.
+
+\subsection{I segnali real-time}
+\label{sec:sig_real_time}
+
 Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi
 real-time, ha introdotto una estensione del modello classico dei segnali che
 presenta dei significativi miglioramenti,\footnote{questa estensione è stata
 Lo standard POSIX.1b, nel definire una serie di nuove interfacce per i servizi
 real-time, ha introdotto una estensione del modello classico dei segnali che
 presenta dei significativi miglioramenti,\footnote{questa estensione è stata
@@ -2343,12 +2439,12 @@ funzione, \funcd{sigqueue}, il cui prototipo 
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EAGAIN}] La coda è esaurita, ci sono già \const{SIGQUEUE\_MAX}
-    segnali in attesa si consegna.
-  \item[\errcode{EPERM}] Non si hanno privilegi appropriati per inviare il
+  \item[\errcode{EAGAIN}] la coda è esaurita, ci sono già
+    \const{SIGQUEUE\_MAX} segnali in attesa si consegna.
+  \item[\errcode{EPERM}] non si hanno privilegi appropriati per inviare il
     segnale al processo specificato.
     segnale al processo specificato.
-  \item[\errcode{ESRCH}] Il processo \param{pid} non esiste.
-  \item[\errcode{EINVAL}] Si è specificato un valore non valido per
+  \item[\errcode{ESRCH}] il processo \param{pid} non esiste.
+  \item[\errcode{EINVAL}] si è specificato un valore non valido per
     \param{signo}.
   \end{errlist}
   ed inoltre \errval{ENOMEM}.}
     \param{signo}.
   \end{errlist}
   ed inoltre \errval{ENOMEM}.}
@@ -2367,8 +2463,8 @@ installato un gestore con \const{SA\_SIGINFO} e ci sono risorse disponibili,
   sez.~\ref{sec:sys_limits}; il suo valore minimo secondo lo standard,
   \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux questo è uno
   dei parametri del kernel impostabili sia con \func{sysctl}, che scrivendolo
   sez.~\ref{sec:sys_limits}; il suo valore minimo secondo lo standard,
   \const{\_POSIX\_SIGQUEUE\_MAX}, è pari a 32. Nel caso di Linux questo è uno
   dei parametri del kernel impostabili sia con \func{sysctl}, che scrivendolo
-  direttamente in \file{/proc/sys/kernel/rtsig-max}, il valore predefinito è
-  di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa
+  direttamente in \procfile{/proc/sys/kernel/rtsig-max}, il valore predefinito
+  è di 1024.} nella coda dei segnali real-time) esso viene inserito e diventa
 pendente; una volta consegnato riporterà nel campo \var{si\_code} di
 \struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo \var{si\_value}
 riceverà quanto inviato con \param{value}. Se invece si è installato un
 pendente; una volta consegnato riporterà nel campo \var{si\_code} di
 \struct{siginfo\_t} il valore \const{SI\_QUEUE} e il campo \var{si\_value}
 riceverà quanto inviato con \param{value}. Se invece si è installato un
@@ -2388,8 +2484,8 @@ meccanismi di comunicazione elementare; la prima di queste funzioni 
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
     errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{EINTR}] La funzione è stata interrotta.
-  \item[\errcode{EINVAL}] Si è specificato un valore non valido per
+  \item[\errcode{EINTR}] la funzione è stata interrotta.
+  \item[\errcode{EINVAL}] si è specificato un valore non valido per
     \param{set}.
   \end{errlist}
   ed inoltre \errval{EFAULT}.}
     \param{set}.
   \end{errlist}
   ed inoltre \errval{EFAULT}.}
@@ -2434,7 +2530,7 @@ relativi prototipi sono:
     errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
     \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
   \begin{errlist}
     errore, nel qual caso \var{errno} assumerà uno dei valori già visti per
     \func{sigwait}, ai quali si aggiunge, per \func{sigtimedwait}:
   \begin{errlist}
-  \item[\errcode{EAGAIN}] Si è superato il timeout senza che un segnale atteso
+  \item[\errcode{EAGAIN}] si è superato il timeout senza che un segnale atteso
     fosse emesso.
   \end{errlist}
 }
     fosse emesso.
   \end{errlist}
 }
@@ -2465,6 +2561,27 @@ questa maniera devono essere mascherati per tutti i thread, compreso quello
 dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 
 
 dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 
 
+\subsection{La gestione avanzata delle temporizzazioni}
+\label{sec:sig_timer_adv}
+
+% TODO trattare i Posix timer, e le fuzioni:
+% clock_getres clock_gettime clock_settime (vedi man page)
+% timer_getoverrun, timer_gettime, timer_settime, timer_create, timer_delete
+
+
+\subsection{Le interfacce per la notifica attraverso i file descriptor}
+\label{sec:sig_signalfd_eventfd}
+
+
+% TODO trattare qui eventfd signalfd e timerfd introdotte con il 2.6.22 
+% timerfd è stata tolta nel 2.6.23 e rifatta per bene nel 2.6.25
+% vedi: http://lwn.net/Articles/233462/
+%       http://lwn.net/Articles/245533/
+%       http://lwn.net/Articles/267331/
+
+
+
+
 % LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
 % LocalWords:  reliable unreliable fig race condition sez struct process table
 % LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
 % LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
 % LocalWords:  reliable unreliable fig race condition sez struct process table
 % LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
@@ -2495,8 +2612,20 @@ dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 % LocalWords:  how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
 % LocalWords:  SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
 % LocalWords:  RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
 % LocalWords:  how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
 % LocalWords:  SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
 % LocalWords:  RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
-% LocalWords:  SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl
-% LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB
+% LocalWords:  SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl safe
+% LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB bind
+% LocalWords:  function accept return cfgetispeed cfgetospeed cfsetispeed chdir
+% LocalWords:  cfsetospeed chmod chown gettime close connect creat dup execle
+% LocalWords:  execve fchmod fchown fdatasync fpathconf fstat fsync ftruncate
+% LocalWords:  getegid geteuid getgid getgroups getpeername getpgrp getppid sem
+% LocalWords:  getsockname getsockopt getuid listen lseek lstat mkdir mkfifo
+% LocalWords:  pathconf poll posix pselect read readlink recv recvfrom recvmsg
+% LocalWords:  rename rmdir select send sendmsg sendto setgid setpgid setsid
+% LocalWords:  setsockopt setuid shutdown sigpause socketpair stat symlink
+% LocalWords:  sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak
+% LocalWords:  tcsetattr tcsetpgrp getoverrun times umask uname unlink utime
+% LocalWords:  write sival
+
 
 %%% Local Variables: 
 %%% mode: latex
 
 %%% Local Variables: 
 %%% mode: latex