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
\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}
\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)}
\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
\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,
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}