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.
 
 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}
 
 \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
 \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).
 
 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
 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 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
 % 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
 
 %   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},
 %   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
   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
   \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
 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
 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
 
   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
   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
 \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}}
 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
   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}
 
 \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}
 \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}
 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}
 
 
 \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}.
   
   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
 \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}
   (*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}
 
 \subsection{La funzione \func{sigpending}}
 \label{sec:sig_sigpending}
 
+
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: