X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=e67985bc2fdc42b902f632e35f34911e76ec1120;hp=072b1d1edeaf638aef100fa2e141f3b3b5c7892c;hb=cdc1b275bbd83ad0dbf1ba4be801118724a51085;hpb=2110eb3a139f7fafc2ca2e5175f15ef6128ae347 diff --git a/signal.tex b/signal.tex index 072b1d1..e67985b 100644 --- a/signal.tex +++ b/signal.tex @@ -124,7 +124,7 @@ riprende l'esecuzione all'istruzione successiva, ma essendo cambiato il flag la condizione non è più soddisfatta e il programma prosegue. Il problema con l'implementazione inaffidabile è che niente ci garantisce che -il segnale arrivi fra la valutazione della condizione del \func{while} e la +il segnale arrivi fra la valutazione della condizione del \code{while} e la chiamata a \func{pause}, nel qual caso, se il segnale non viene più generato, il processo resterà in sleep permanentemente. @@ -655,24 +655,39 @@ classificabili in maniera omogenea. Questi segnali sono: \subsection{Le funzioni \func{strsignal} e \func{psignal}} \label{sec:sig_strsignal} -Per la descrizione dei segnali il sistema mette a disposizione due funzioni -che stampano un messaggio di descrizione dato il numero. In genere si usano -quando si vuole notificare all'utente il segnale avvenuto (nel caso di -terminazione di un processo figlio o di un manipolatore che gestisce più -segnali); la prima funzione è una estensione GNU ed è analoga alla funzione -\func{strerr} per gli errori: -\begin{prototype}{string.h}{char * strsignal (int signum)} - Ritorna il puntatore ad una stringa allocata staticamente che contiene la - descrizione del segnale \var{signum}. +Per la descrizione dei segnali il sistema mette a disposizione due funzioni, +\func{strsignal} e \func{psignal}, che stampano un messaggio di descrizione +dato il numero. In genere si usano quando si vuole notificare all'utente il +segnale avvenuto (nel caso di terminazione di un processo figlio o di un +manipolatore che gestisce più segnali); la prima funzione è una estensione +GNU, accessibile avendo definito \macro{\_GNU\_SOURCE}, ed è analoga alla +funzione \func{strerror} (si veda \secref{sec:sys_strerror}) per gli errori: +\begin{prototype}{string.h}{char *strsignal(int signum)} + Ritorna il puntatore ad una stringa che contiene la descrizione del segnale + \var{signum}. \end{prototype} - -Dato che la stringa è allocata staticamente non se ne deve modificare il -contenuto, che resta valido solo fino alla successiva chiamata di -\func{strsignal}; nel caso si debba mantenere traccia del messaggio sarà +\noindent dato che la stringa è allocata staticamente non se ne deve +modificare il contenuto, che resta valido solo fino alla successiva chiamata +di \func{strsignal}. Nel caso si debba mantenere traccia del messaggio sarà necessario copiarlo. La seconda funzione deriva da BSD ed è analoga alla funzione \func{perror} -descritta in \secref{sec:sys_strerror}. +descritta in \secref{sec:sys_strerror}; il suo prototipo è: +\begin{prototype}{signal.h}{void psignal(int sig, const char *s)} + Stampa sullo standard error un messaggio costituito dalla stringa \param{s}, + seguita da due punti ed una descrizione del segnale indicato da \param{sig}. +\end{prototype} + +Una modalità alternativa per utilizzare le descrizioni restituite da +\func{strsignal} e \func{psignal} è quello di fare usare la variabile +\var{sys\_siglist}, che può essere acceduta dichiarando: +\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{} + extern const char *const sys_siglist[] +\end{lstlisting} +\var{sys\_siglist} contiene le stringhe di descrizione indicizzate per numero +di segnale, per cui \code{char *decr = strsignal(SIGINT)} può essere +sostituito dall'equivalente \code{char *decr = sys\_siglist[SIGINT]}. + \section{La gestione dei segnali} @@ -713,7 +728,7 @@ comportamento, pur mantenendone immutato il prototipo\footnote{in realt In questa definizione si è usato il tipo \type{sighandler\_t} che è una estensione GNU definita in Linux che permette di riscrivere il prototipo in -forma più leggibile dell'originario \func{void (*signal(int signum, void +forma più leggibile dell'originario \code{void (*signal(int signum, void (*handler)(int)))int)}, e che è sostanzialmente equivalente alla definizione: \begin{verbatim}