\centering
\begin{tabular}[c]{|l|c|c|p{8cm}|}
\hline
- \textbf{Segnale}&\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
+ \textbf{Segnale} &\textbf{Standard}&\textbf{Azione}&\textbf{Descrizione} \\
\hline
\hline
- \macro{SIGHUP} &PL & A &Hangup o terminazione del processo di controllo\\
- \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
- \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
- \macro{SIGILL} &PL & C & Istruzione illegale \\
- \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
- \macro{SIGFPE} &PL & C & Errore aritmetico \\
- \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
- \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
- \macro{SIGPIPE} &PL & A & Pipe spezzata \\
+ \macro{SIGHUP} &PL & A & Hangup o terminazione del processo di
+ controllo \\
+ \macro{SIGINT} &PL & A & Interrupt da tastiera (\cmd{C-c}) \\
+ \macro{SIGQUIT} &PL & C & Quit da tastiera (\cmd{C-y}) \\
+ \macro{SIGILL} &PL & C & Istruzione illegale \\
+ \macro{SIGABRT} &PL & C & Segnale di abort da \func{abort} \\
+ \macro{SIGFPE} &PL & C & Errore aritmetico \\
+ \macro{SIGKILL} &PL &AEF& Segnale di terminazione forzata \\
+ \macro{SIGSEGV} &PL & C & Errore di accesso in memoria \\
+ \macro{SIGPIPE} &PL & A & Pipe spezzata \\
\macro{SIGALRM} &PL & A & Segnale del timer da \func{alarm} \\
\macro{SIGTERM} &PL & A & Segnale di terminazione \verb|C-\| \\
\macro{SIGUSR1} &PL & A & Segnale utente numero 1 \\
\macro{SIGINFO} &L & & Sinonimo di \macro{SIGPWR} \\
\macro{SIGLOST} &L & A & Perso un lock sul file (per NFS) \\
\macro{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun) \\
- \macro{SIGUNUSED}&L & A &Segnale inutilizzato (diventerà \macro{SIGSYS})\\
+ \macro{SIGUNUSED}&L & A & Segnale inutilizzato (diventerà
+ \macro{SIGSYS}) \\
\hline
\end{tabular}
\caption{Lista dei segnali in Linux.}
Il campo \var{sa\_mask} serve ad indicare l'insieme dei segnali che devono
essere bloccati durante l'esecuzione del manipolatore, ad essi viene comunque
sempre aggiunto il segnale che ne ha causato la chiamata, a meno che non si
-sia specificato con \var{sa\_flag} un comportamento diverso.
+sia specificato con \var{sa\_flag} un comportamento diverso.
+
+L'uso di questo campo permette ad esempio di risolvere il problema residuo
+dell'implementazione di \code{sleep} mostrata in
+\secref{fig:sig_sleep_incomplete}: in quel caso infatti se il segnale di
+allarme interrompe un altro manipolatore questo non sarà eseguito
+correttamente, la cosa può essere prevenuta installando quest'ultimo usando
+\var{sa\_mask} per bloccare \macro{SIGALRM} durante la sua esecuzione.
Il valore di \var{sa\_flag} permette di specificare vari aspetti del
comportamento di \func{sigaction}, e della reazione del processo ai vari
\label{tab:sig_procmask_how}
\end{table}
-Un altro
+In questo modo diventa possibile proteggere delle sezioni di codice bloccando
+l'insieme di segnali voluto per poi riabilitarli alla fine della sezione
+critica. La funzione permette di risolvere problemi come quelli mostrati in
+\secref{fig:sig_event_wrong}, proteggendo la sezione fra il controllo del flag
+e la sua cancellazione.
+
+Un altro problema che abbiamo visto presentarsi con l'uso di \func{pause} è
+quello relativo
\begin{prototype}{signal.h}
{int sigsuspend(const sigset\_t *mask)}
- Cambia la \textit{signal mask} del processo corrente.
+ Setta la \textit{signal mask} specificata, mettendo in attesa il processo.
\bodydesc{La funzione restituisce zero in caso di successo e -1 per un
errore, nel qual caso \var{errno} assumerà i valori:
-
-\subsection{Funzioni rientranti e default dei segnali}
-\label{sec:sig_reentrant}
-
-
-
-
-
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"