X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=signal.tex;h=d0f68b3a2dfdc9f9c9156047de4fd9f26fb31769;hp=a73b7fc05867970f483837247d229d7d1728f9f5;hb=707eaacf08258c80e480b416856bcba020d0a0a6;hpb=e20a546af590a50e7ac47f68f6c7d4648bb4f31a diff --git a/signal.tex b/signal.tex index a73b7fc..d0f68b3 100644 --- a/signal.tex +++ b/signal.tex @@ -12,6 +12,8 @@ anche essere usati come forma elementare di comunicazione fra processi (ad esempio vengono usati per il controllo di sessione), per notificare eventi (come la terminazione di un processo figlio), etc. + + \section{I concetti base} \label{sec:sig_base} @@ -122,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. @@ -453,7 +455,7 @@ La ragione per cui pu programma può dover eseguire una serie di azioni di pulizia prima di terminare, come salvare informazioni sullo stato in cui si trova, cancellare file temporanei, o ripristinare delle condizioni alterate durante il -funzionamento (tipi il modo del terminale o i settaggi di una qualche +funzionamento (come il modo del terminale o i settaggi di una qualche periferica). L'azione di default di questi segnali è di terminare il processo, questi @@ -489,10 +491,10 @@ segnali sono: Se un processo non risponde a nessun altro segnale \macro{SIGKILL} ne causa sempre la terminazione (in effetti il fallimento della terminazione di un - processo da parte di \macro{SIGKILL} costituirebbe un funzionamento del + processo da parte di \macro{SIGKILL} costituirebbe un malfunzionamento del kernel). Talvolta è il sistema stesso che può generare questo segnale quando per condizioni particolari il processo non può più essere eseguito neanche - per eseguire il manipolatore. + per eseguire un manipolatore. \item[\macro{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il terminale dell'utente si è disconnesso (ad esempio perché si è interrotta la rete). Viene usato anche per riportare la terminazione del processo di @@ -633,7 +635,7 @@ segnali sono: Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non classificabili in maniera omogenea. Questi segnali sono: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\macro{SIGUSR1}] e \macro{SIGUSR2} Sono due segnali a disposizione +\item[\macro{SIGUSR1} e \macro{SIGUSR2}] Sono due segnali a disposizione dell'utente che li può usare per quello che vuole. Possono essere utili per implementare una comunicazione elementare fra processi diversi, o per eseguire a richiesta una operazione utilizzando un manipolatore. L'azione di @@ -653,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:intro_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} @@ -705,13 +722,13 @@ comportamento, pur mantenendone immutato il prototipo\footnote{in realt Installa una nuova funzione di gestione (manipolatore) per il segnale \param{signum}, usando il manipolatore \param{handler}. - La funzione ritorna il precedente manipolatore in caso di successo o - \macro{SIG\_ERR} in caso di errore. + \bodydesc{La funzione ritorna il precedente manipolatore in caso di successo + o \macro{SIG\_ERR} in caso di errore.} \end{prototype} 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} @@ -743,3 +760,8 @@ intercettati). \subsection{La funzione \func{sigpending}} \label{sec:sig_sigpending} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "gapil" +%%% End: