X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=3187101587105ffb6066fb68ecd5345f0a9bd0e1;hp=1a2f3d08f8a43bfcfbf66b482d00f2c210d98c90;hb=689b99ce22ba645115d553468ec3bfed263a69fa;hpb=b19105fc2dcf0dc62a64b093f155c0db8e8ad5a6 diff --git a/signal.tex b/signal.tex index 1a2f3d0..3187101 100644 --- a/signal.tex +++ b/signal.tex @@ -432,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 -tipologia, verrà affrontate nel seguito. +tipologia, verrà affrontate nei paragrafi successivi. \subsection{Segnali di errore di programma} @@ -1768,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 è: - \begin{prototype}{signal.h}{int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)} @@ -1850,7 +1849,7 @@ segnali; i valori possibili ed il relativo significato sono riportati in \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 @@ -1905,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} - 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, @@ -1916,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 -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}