Aggiunti un po' di prototipi e una tabellina
[gapil.git] / signal.tex
index b766ea6464574de019317ab94fa0f1661d00b0b4..3187101587105ffb6066fb68ecd5345f0a9bd0e1 100644 (file)
@@ -84,6 +84,20 @@ attivo.
 In questo caso è possibile una situazione in cui i segnali possono essere
 perduti. Si consideri il seguente segmento di codice, in cui la prima
 operazione del manipolatore è quella di reinstallare se stesso: 
 In questo caso è possibile una situazione in cui i segnali possono essere
 perduti. Si consideri il seguente segmento di codice, in cui la prima
 operazione del manipolatore è quella di reinstallare se stesso: 
+\footnotesize
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+    int sig_handler();            /* handler function */
+    ...
+    signal(SIGINT, sig_handler);  /* establish handler */
+    ...
+
+int sig_handler() 
+{
+    signal(SIGINT, sig_handler);  /* restablish handler */
+    ...                           /* process signal */
+}
+\end{lstlisting}
+\normalsize
 se un secondo segnale arriva prima che il manipolatore invocato dal primo
 abbia eseguito la reinstallazione di se stesso il segnale può essere perso o
 causare il comportamento originale assegnato al segnale (in genere la
 se un secondo segnale arriva prima che il manipolatore invocato dal primo
 abbia eseguito la reinstallazione di se stesso il segnale può essere perso o
 causare il comportamento originale assegnato al segnale (in genere la
@@ -418,7 +432,7 @@ stato dello stack e delle variabili al momento della ricezione del segnale.
 \end{table}
 
 La descrizione dettagliata del significato dei vari segnali, raggruppati per
 \end{table}
 
 La descrizione dettagliata del significato dei vari segnali, raggruppati per
-tipologia, verrà affrontate nel seguito.
+tipologia, verrà affrontate nei paragrafi successivi.
 
 
 \subsection{Segnali di errore di programma}
 
 
 \subsection{Segnali di errore di programma}
@@ -1754,7 +1768,6 @@ La funzione principale dell'interfaccia standard POSIX.1 per i segnali 
 \func{sigaction}, essa ha sostanzialemente le stesse funzioni di
 \func{signal}, permette cioè di specificare come un segnale può essere gestito
 da un processo. Il suo prototipo è:
 \func{sigaction}, essa ha sostanzialemente le stesse funzioni di
 \func{signal}, permette cioè di specificare come un segnale può essere gestito
 da un processo. Il suo prototipo è:
-
 \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
     *act, struct sigaction *oldact)} 
   
 \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction
     *act, struct sigaction *oldact)} 
   
@@ -1836,7 +1849,7 @@ segnali; i valori possibili ed il relativo significato sono riportati in
   \centering
   \begin{tabular}[c]{|l|p{8cm}|}
     \hline
   \centering
   \begin{tabular}[c]{|l|p{8cm}|}
     \hline
-    \textbf{Valore} & \textbf{Timer} \\
+    \textbf{Valore} & \textbf{Significato} \\
     \hline
     \hline
     \macro{SA\_NOCLDSTOP}& Se il segnale è \macro{SIGCHLD} allora non deve
     \hline
     \hline
     \macro{SA\_NOCLDSTOP}& Se il segnale è \macro{SIGCHLD} allora non deve
@@ -1891,8 +1904,8 @@ permettono si bloccare temporaneamente (o di eliminare completamente, settando
 \macro{SIG\_IGN} come azione) la consegna dei segnali ad un processo. Questo è
 fatto specificando la cosiddetta \textit{signal mask} del
 processo\footnote{nel caso di Linux essa è mantenuta dal campo \var{blocked}
 \macro{SIG\_IGN} come azione) la consegna dei segnali ad un processo. Questo è
 fatto specificando la cosiddetta \textit{signal mask} del
 processo\footnote{nel caso di Linux essa è mantenuta dal campo \var{blocked}
-  della relativa \var{task\_struct}} che viene espressa come il signal set dei
-segnali la cui consegna è bloccata. Abbiamo accennato in
+  della \var{task\_struct} del processo.} che viene espressa come il signal
+set dei segnali la cui consegna è bloccata. Abbiamo accennato in
 \secref{sec:proc_fork} che la \textit{signal mask} viene ereditata dal padre
 alla creazione di un processo figlio, e abbiamo visto al paragrafo precedente
 che essa può essere specificata, durante l'esecuzione di un manipolatore,
 \secref{sec:proc_fork} che la \textit{signal mask} viene ereditata dal padre
 alla creazione di un processo figlio, e abbiamo visto al paragrafo precedente
 che essa può essere specificata, durante l'esecuzione di un manipolatore,
@@ -1902,7 +1915,59 @@ Uno dei problemi evidenziatisi con l'esempio di \secref{fig:sig_event_wrong} 
 che in molti casi è necessario proteggere delle sezioni di codice (nel caso la
 sezione fra il test e la eventuale cancellazione del flag che testimoniava
 l'avvenuta occorrenza del segnale) in modo da essere sicuri che essi siano
 che in molti casi è necessario proteggere delle sezioni di codice (nel caso la
 sezione fra il test e la eventuale cancellazione del flag che testimoniava
 l'avvenuta occorrenza del segnale) in modo da essere sicuri che essi siano
-eseguiti senza interruzioni.
+eseguiti senza interruzioni. Le operazioni più semplici, come l'assegnazione o
+il controllo di una variabile (per essere sicuri si può usare il tipo
+\type{sig\_atomic\_t}) di norma sono atomiche, ma quando le operazioni sono
+più complesse si può usare la funzione \func{sigprocmask} per bloccare uno o
+più segnali; il suo prototipo è:
+\begin{prototype}{signal.h}
+{int sigprocmask(int how, const sigset\_t *set, sigset\_t *oldset)} 
+  
+  Cambia la \textit{signal mask} del processo corrente.
+  
+  \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[\macro{EINVAL}] Si è specificato un numero di segnale invalido.
+  \item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
+  \end{errlist}}
+\end{prototype}
+
+La funzione 
+
+
+\begin{table}[htb]
+  \footnotesize
+  \centering
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Valore} & \textbf{Significato} \\
+    \hline
+    \hline
+    \macro{SIG\_BLOCK}   & .\\
+    \macro{SIG\_UNBLOCK} & .\\
+    \macro{SIG\_SETMASK} & .\\
+    \hline
+  \end{tabular}
+  \caption{Valori e significato dell'argomento \param{how} della funzione
+    \func{sigprocmask}.}
+  \label{tab:sig_procmask_how}
+\end{table}
+
+
+Un altro 
+\begin{prototype}{signal.h}
+{int sigsuspend(const sigset\_t *mask)} 
+  
+  Cambia la \textit{signal mask} del processo corrente.
+  
+  \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[\macro{EINVAL}] Si è specificato un numero di segnale invalido.
+  \item[\macro{EFAULT}] Si sono specificati indirizzi non validi.
+  \end{errlist}}
+\end{prototype}