Proseguito con mount e statfs
[gapil.git] / signal.tex
index b675fdeacf09a4ba5b1cf902789ffa2dde5f6c82..d0f68b3a2dfdc9f9c9156047de4fd9f26fb31769 100644 (file)
@@ -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}
 
@@ -74,7 +76,7 @@ int sig_handler()
 \end{lstlisting}
 \normalsize
 se un secondo segnale arriva prima che il manipolatore invocato dal primo
-abbia eseguito la re-installazione di se stesso il segnale può essere perso o
+abbia eseguito la reinstallazione di se stesso il segnale può essere perso o
 causare il comportamento originale assegnato al segnale (in genere la
 terminazione del processo).
 
@@ -122,14 +124,14 @@ 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.
 
 % Un'altra caratteristica della implementazione inaffidabile è che le chiamate
 % di sistema non sono fatte ripartire automaticamente quando sono interrotte da
 % un segnale, per questo un programma deve controllare lo stato di uscita della
-% chiamata al sistema e riperterla nel caso l'errore riportato da \texttt{errno}
+% chiamata al sistema e ripeterla nel caso l'errore riportato da \texttt{errno}
 % sia \texttt{EINTR}.
 
 Questo ci mostra ad esempio come con la semantica inaffidabile non esista una
@@ -402,7 +404,7 @@ Questi segnali sono:
 
 %   Per questo segnale le cose sono complicate dal fatto che possono esserci
 %   molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo
-%   standard IEEE per le operazioni in virgola mobile definisce vaire eccezioni
+%   standard IEEE per le operazioni in virgola mobile definisce varie eccezioni
 %   aritmetiche e richiede che esse siano notificate.  
 
 \item[\macro{SIGILL}] Il nome deriva da \textit{illegal instruction},
@@ -425,7 +427,7 @@ Questi segnali sono:
   inizializzato leggendo al di la della fine di un vettore. 
 \item[\macro{SIGBUS}] Il nome deriva da \textit{bus error}. Come
   \macro{SIGSEGV} questo è un segnale che viene generato di solito quando si
-  dereferenzia un puntatore non inzializzato, la differenza è che
+  dereferenzia un puntatore non inizializzato, la differenza è che
   \macro{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
   (tipo fuori dallo heap o dallo stack), mentre \macro{SIGBUS} indica
   l'accesso ad un indirizzo non valido, come nel caso di un puntatore non
@@ -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: