Altre due funzioni "speciali"
[gapil.git] / signal.tex
index 172ba3ea7957ca2a1bf7f7e92cb61a87289c875b..a73b7fc05867970f483837247d229d7d1728f9f5 100644 (file)
@@ -19,7 +19,7 @@ Come il nome stesso indica i segnali sono usati per notificare ad un processo
 l'occorrenza di un evento eccezionale. Gli eventi che possono generare un
 segnale sono vari; un breve elenco di possibile cause è il seguente:
 
-\begin{itemize}
+\begin{itemize*}
 \item un errore del programma, come una divisione per zero o un tentativo di
   accesso alla memoria fuori dai limiti validi.
 \item la terminazione di un processo figlio.
@@ -29,9 +29,9 @@ segnale sono vari; un breve elenco di possibile cause 
 \item una richiesta dell'utente di terminare o fermare il programma. In genere
   si realizza attraverso un segnale mandato dalla shell in corrispondenza
   della pressione di tasti del terminale come 'ctrl-c' o 'ctrl-z'.
-\item l'esecuzione di una \texttt{kill} o di una \texttt{raise} da parte del
-  processo stesso o di un'altro (solo nel caso della \texttt{kill}).
-\end{itemize}
+\item l'esecuzione di una \func{kill} o di una \func{raise} da parte del
+  processo stesso o di un'altro (solo nel caso della \func{kill}).
+\end{itemize*}
 
 Ciascuno di questi eventi (tranne gli ultimi due che sono controllati
 dall'utente) comporta l'intervento diretto da parte del kernel che causa la
@@ -59,8 +59,8 @@ in cui si vuole che il signal handler esterno resti attivo.
 In questo caso è possibile una situazione in cui i segnali possono essere
 perduti; si consideri il seguente segmento di codice in cui la prima
 operazione del manipolatore è quella di reinstallare se stesso:
-\begin{lstlisting}{showlines=false}
-
+\footnotesize
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
     int sig_handler();            /* handler function */
     ...
     signal(SIGINT, sig_handler);  /* establish handler */
@@ -72,8 +72,9 @@ int sig_handler()
     ...                           /* process signal */
 }
 \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).
 
@@ -92,7 +93,8 @@ quello in cui si usa il manipolatore per settare un flag che riporta al
 processo l'occorrenza del segnale. Si consideri il seguente segmento di
 codice il cui scopo sarebbe quello di fermare il processo fino all'occorrenza
 di un opportuno segnale:
-\begin{lstlisting}{}
+\footnotesize
+\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
 int signal_flag = 0;
 main ()
 {
@@ -111,6 +113,7 @@ int sig_handler()
     signal_flag = 1;              /* set flag */
 }
 \end{lstlisting}
+\normalsize
 l'idea è che quando il processo trova il flag a zero viene messo in sleep e
 verrà risvegliato solo dalla ricezione di un segnale. Il manipolatore si
 limita in questo caso a settare il flag a uno; all'uscita dal manipolatore la
@@ -126,7 +129,7 @@ il processo rester
 % 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
@@ -160,8 +163,7 @@ usare la funzione \func{sigpending} (vedi \secref{sec:sig_sigpending}) per
 determinare quali segnali sono bloccati e quali sono pendenti.
 
 
-
-\subsubsection{Tipi di segnali}
+\subsection{Tipi di segnali}
 \label{sec:sig_types}
 
 In generale gli eventi che generano i segnali si possono dividere in tre
@@ -179,7 +181,7 @@ esempi di segnali di questo tipo sono quelli legati all'arrivo di dati di
 input, scadenze di un timer, terminazione di processi figli.
 
 Una richiesta esplicita significa l'uso di una chiamata di sistema (come
-\texttt{kill} o \texttt{raise}) per la generazione di un segnale, cosa che
+\func{kill} o \func{raise}) per la generazione di un segnale, cosa che
 viene fatta usualmente dalla shell quando l'utente invoca la sequenza di tasti
 di stop o di suspend, ma può essere pure inserita all'interno di un programma.
 
@@ -217,18 +219,19 @@ volta per
 
 Una volta che il segnale viene notificato (che questo avvenga subito o dopo
 una attesa più o meno lunga) viene eseguita l'azione specificata per detto
-segnale. Per alcuni segnali (\texttt{SIGKILL} e \texttt{SIGSTOP}) questa azione
+segnale. Per alcuni segnali (\macro{SIGKILL} e \macro{SIGSTOP}) questa azione
 è fissa e non può essere cambiata, ma per tutti gli altri il programma può
 specificare una scelta fra le tre seguenti:
 
-\begin{itemize}
-\item ignorare il segnale
-\item utilizzare il manipolatore (\textit{signal handler}) specificato
+\begin{itemize*}
+\item ignorare il segnale.
+\item catturare il segnale, ed utilizzare il manipolatore (\textit{signal
+    handler}) specificato.
 \item accettare l'azione di default per quel segnale.
-\end{itemize}
+\end{itemize*}
 
 Il programma può specificare queste scelte usano le due routine
-\texttt{signal} e \texttt{sigaction}; se si è installato un manipolatore sarà
+\func{signal} e \func{sigaction}; se si è installato un manipolatore sarà
 quest'ultimo a intercettare il segnale ed ad essere eseguito, e mentre viene
 eseguito (onde evitare race conditions) il segnale viene bloccato.
 
@@ -246,7 +249,7 @@ l'azione standard 
 
 Quando un segnale termina un processo, il padre può determinare la causa della
 terminazione esaminando il codice di stato riportato delle funzioni
-\texttt{wait} e \texttt{waitpid} in cui è riportato anche se la causa è un
+\func{wait} e \func{waitpid} in cui è riportato anche se la causa è un
 segnale e nel caso quale; questo è il modo in cui la shell determina i motivi
 della terminazione di un programma e scrive un eventuale messaggio di errore.
 
@@ -255,7 +258,7 @@ violazioni di accesso) hanno anche la caratteristica di scrivere un file
 \textit{core dump} che registra lo stato del processo prima della terminazione
 e può essere esaminato da un debugger per investigare sulla causa dell'errore.
 Lo stesso avviene se i suddetti segnale vengono generati artificialmente con
-una \texttt{kill}.
+una \func{kill}.
 
 
 
@@ -271,9 +274,9 @@ Per questo ad ogni tipo di segnale viene associato un nome, che corrisponde,
 tramite una macro di preprocessore, al suddetto numero. Sono questi nomi, che
 sono standardizzati e uniformi rispetto alle varie implementazioni, che si
 devono usare nei programmi. Tutti i nomi e le funzioni che concernono i
-segnali sono definiti nell'header di sistema \texttt{signal.h}.
+segnali sono definiti nell'header di sistema \file{signal.h}.
 
-Il numero totale di segnali presenti è dato dalla macro \texttt{NSIG}, e dato
+Il numero totale di segnali presenti è dato dalla macro \macro{NSIG}, e dato
 che i numeri dei segnali sono allocati progressivamente, essa corrisponde
 anche al successivo del valore numerico assegnato all'ultimo segnale definito.
 In \ntab\ si è riportato l'elenco completo dei segnali definiti in Linux
@@ -281,13 +284,13 @@ In \ntab\ si 
 \begin{table}[htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|c|c|c||c|p{8cm}|}
+  \begin{tabular}[c]{|l|c|c|c||c|p{6cm}|}
     \hline
     Segnale  & POSIX.1 & SUSv2 & Linux  &Azione &  Descrizione \\
     \hline
     \hline
-    SIGHUP   &$\bullet$&&$\bullet$&  A  & Hangup sul terminale  o
-    morte del processo di controllo  \\
+    SIGHUP   &$\bullet$&&$\bullet$&  A  & Hangup  o
+    fine del processo di controllo  \\
     SIGINT   &$\bullet$&&$\bullet$&  A  & Interrupt da tastiera (\cmd{C-c})\\
     SIGQUIT  &$\bullet$&&$\bullet$&  C  & Quit da tastiera (\cmd{C-y}) \\
     SIGILL   &$\bullet$&&$\bullet$&  C  & Istruzione illegale\\
@@ -306,8 +309,8 @@ In \ntab\ si 
     SIGTSTP  &$\bullet$&&$\bullet$&  D  & Stop typed at tty \\
     SIGTTIN  &$\bullet$&&$\bullet$&  D  & tty input for background process \\
     SIGTTOU  &$\bullet$&&$\bullet$&  D  & tty output for background process \\
-    SIGBUS    &&$\bullet$&$\bullet$& C & Bus error (bad memory access) \\
-    SIGPOLL   &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\
+    SIGBUS   &&$\bullet$&$\bullet$& C & Bus error (bad memory access) \\
+    SIGPOLL  &&$\bullet$&$\bullet$& A & Pollable event (Sys V). Synonym of SIGIO\\
     SIGPROF   &&$\bullet$&$\bullet$& A & Profiling timer expired \\
     SIGSYS    &&$\bullet$&$\bullet$& C & Bad argument to routine (SVID)\\
     SIGTRAP   &&$\bullet$&$\bullet$& C & Trace/breakpoint trap \\
@@ -343,7 +346,11 @@ stato dello stack e delle variabili al momento della ricezione del segnale.
 
 \begin{table}[htb]
   \centering
-  \begin{tabular}[c]{c p{10cm}}
+  \begin{tabular}[c]{|c|p{8cm}|}
+    \hline
+    Sigla & Significato \\
+    \hline
+    \hline
     A & L'azione di default è terminare il processo. \\
     B & L'azione di default è ignorare il segnale. \\
     C & L'azione di default è terminare il processo e scrivere un \textit{core
@@ -351,15 +358,18 @@ stato dello stack e delle variabili al momento della ricezione del segnale.
     D & L'azione di default è fermare il processo. \\
     E & Il segnale non può essere intercettato. \\
     F & Il segnale non può essere ignorato.\\
+    \hline
   \end{tabular}
   \caption{Legenda delle caratteristiche dei segnali riportate in 
     \tabref{tab:sig_signal_list}. }
   \label{tab:sig_action_leg}
 \end{table}
-la descrizione dettagliata del significato dei vari segnali, raggruppati per
-tipologia, è a seguire.
 
-\subsubsection{Segnali di errore di programma}
+La descrizione dettagliata del significato dei vari segnali, raggruppati per
+tipologia, verrà affrontate nel seguito.
+
+
+\subsection{Segnali di errore di programma}
 \label{sec:sig_prog_error}
 
 Questi segnali sono generati quando il sistema, o in certi casi direttamente
@@ -380,22 +390,22 @@ non ci fosse stato.
 L'azione di default per tutti questi segnali è causare la terminazione del
 processo che li ha causati. In genere oltre a questo il segnale provoca pure
 la registrazione su disco di un file di \textit{core dump} che viene scritto
-in un file \texttt{core} nella directory corrente del processo al momento
+in un file \file{core} nella directory corrente del processo al momento
 dell'errore, che il debugger può usare per ricostruire lo stato del programma
 al momento della terminazione.
 
 Questi segnali sono:
-\begin{description}
-\item \texttt{SIGFPE} Riporta un errore aritmetico fatale. Benché il nome
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
   derivi da \textit{floating point exception} si applica a tutti gli errori
   aritmetici compresa la divisione per zero e l'overflow. 
 
 %   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 \texttt{SIGILL} Il nome deriva da \textit{illegal instruction},
+\item[\macro{SIGILL}] Il nome deriva da \textit{illegal instruction},
   significa che il programma sta cercando di eseguire una istruzione
   privilegiata o inesistente, in generale del codice illegale. Poiché il
   compilatore del C genera del codice valido si ottiene questo segnale se il
@@ -405,7 +415,7 @@ Questi segnali sono:
   una variabile locale, andando a corrompere lo stack. Lo stesso segnale viene
   generato in caso di overflow dello stack o di problemi nell'esecuzione di di
   un signal handler.
-\item \texttt{SIGSEGV} Il nome deriva da \textit{segment violation}, e
+\item[\macro{SIGSEGV}] Il nome deriva da \textit{segment violation}, e
   significa che il programma sta cercando di leggere o scrivere in una zona di
   memoria protetta al di fuori di quella che gli è stata riservata dal
   sistema. In genere è il meccanismo della protezione della memoria che si
@@ -413,23 +423,23 @@ Questi segnali sono:
 
   È tipico ottenere questo segnale dereferenziando un puntatore nullo o non
   inizializzato leggendo al di la della fine di un vettore. 
-\item \texttt{SIGBUS} Il nome deriva da \textit{bus error}. Come
-  \texttt{SIGSEGV} questo è un segnale che viene generato di solito quando si
-  dereferenzia un puntatore non inzializzato, la differenza è
-  che\texttt{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
-  (tipo fuori dallo heap o dallo stack), mentre \texttt{SIGBUS} indica
+\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 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
   allineato.
-\item \texttt{SIGABRT} Il nome deriva da \textit{abort}. Il segnale indica che
+\item[\macro{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica che
   il programma stesso ha rilevato un errore che viene riportato chiamando la
-  funzione \texttt{abort} che genera questo segnale.
-\item \texttt{SIGTRAP} È il segnale generato da un'istruzione di breakpoint o
+  funzione \func{abort} che genera questo segnale.
+\item[\macro{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
   dall'attivazione del tracciamento per il processo. È usato dai programmi per
   il debugging e se un programma normale non dovrebbe ricevere questo segnale.
-\item \texttt{SIGSYS} Sta ad indicare che si è eseguita una istruzione che
+\item[\macro{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
   richiede l'esecuzione di una system call, ma si è fornito un codice
   sbagliato per quest'ultima.
-\end{description}
+\end{basedescript}
 
 
 \subsection{I segnali di terminazione}
@@ -448,18 +458,18 @@ periferica).
 
 L'azione di default di questi segnali è di terminare il processo, questi
 segnali sono:
-\begin{description}
-\item \macro{SIGTERM} Il nome sta per \textit{terminate}. È un segnale
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
   generico usato per causare la conclusione di un programma. Al contrario di
   \macro{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
   usa per chiedere in maniera ``educata'' ad un processo di concludersi.
-\item \macro{SIGINT} Il nome sta per \textit{interrupt}. È il segnale di
+\item[\macro{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
   interruzione per il programma. È quello che viene generato di default dal
   comando \cmd{kill} o dall'invio sul terminale del carattere di controllo
   INTR (interrupt, generato dalla sequenza \macro{C-c}).
-\item  \macro{SIGQUIT} È analogo a \macro{SIGINT} con la differenze che è
+\item[\macro{SIGQUIT}] È analogo a \macro{SIGINT} con la differenze che è
   controllato da un'altro carattere di controllo, QUIT, corrispondente alla
-  sequenza \macro{C-\\}. A differenza del precedente l'azione di default,
+  sequenza \verb|C-\|. A differenza del precedente l'azione di default,
   oltre alla terminazione del processo, comporta anche la creazione di un core
   dump. 
 
@@ -469,7 +479,7 @@ segnali sono:
   normalmente previste (tipo la cancellazione di file temporanei), dato che in
   certi casi esse possono eliminare informazioni utili nell'esame dei core
   dump. 
-\item \macro{SIGKILL} Il nome è utilizzato per terminare in maniera immediata
+\item[\macro{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
   qualunque programma. Questo segnale non può essere né intercettato, né
   ignorato, né bloccato, per cui causa comunque la terminazione del processo.
   In genere esso viene generato solo per richiesta esplicita dell'utente dal
@@ -483,7 +493,7 @@ segnali sono:
   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.
-\item \macro{SIGHUP} Il nome sta per \textit{hang-up}. Segnala che il
+\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
   controllo di un terminale a tutti i processi della sessione, in modo che
@@ -492,7 +502,8 @@ segnali sono:
   Viene inoltre usato in genere per segnalare ai demoni (che non hanno un
   terminale di controllo) la necessità di reinizializzarsi e rileggere il/i
   file di configurazione.
-\end{description}
+\end{basedescript}
+
 
 \subsection{I segnali di allarme}
 \label{sec:sig_alarm}
@@ -501,19 +512,19 @@ Questi segnali sono generati dalla scadenza di un timer. Il loro comportamento
 di default è quello di causare la terminazione del programma, ma con questi
 segnali la scelta di default è irrilevante, in quanto il loro uso presuppone
 sempre la necessità di un manipolatore.  Questi segnali sono:
-\begin{description}
-\item \texttt{SIGALRM} Il nome sta per \textit{alarm}. Segnale la scadenza di
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
   un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
   usato dalla funzione \func{alarm}.
-\item  \texttt{SIGVTALRM} Il nome sta per \textit{virtual alarm}. È analogo al
+\item[\macro{SIGVTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
   precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
   processo. 
-\item \texttt{SIGPROF} Il nome sta per \textit{profiling}. Indica la scadenza
+\item[\macro{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
   di un timer che misura sia il tempo di CPU speso direttamente dal processo
   che quello che il sistema ha speso per conto di quest'ultimo. In genere
   viene usato dai tool che servono a fare il profilo d'uso della CPU da parte
   del processo.
-\end{description}
+\end{basedescript}
 
 
 \subsection{I segnali di I/O asincrono}
@@ -524,17 +535,18 @@ questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a
 generare questi segnali. 
 
 L'azione di default è di essere ignorati. Questi segnali sono:
-\begin{description}
-\item \texttt{SIGIO} Questo segnale viene inviato quando un file descriptor è
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGIO}] Questo segnale viene inviato quando un file descriptor è
   pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
   terminali possono generare questo segnale, in Linux questo può essere usato
   anche per i file, posto che la \func{fcntl} abbia avuto successo.
-\item \texttt{SIGURG} Questo segnale è inviato quando arrivano dei dati
+\item[\macro{SIGURG}] Questo segnale è inviato quando arrivano dei dati
   urgenti o \textit{out of band} su di un socket; per maggiori dettagli al
   proposito si veda \secref{sec:xxx_urgent_data}.
-\item \texttt{SIGPOLL} Questo segnale è equivalente a \macro{SIGIO}, è
+\item[\macro{SIGPOLL}] Questo segnale è equivalente a \macro{SIGIO}, è
   definito solo per compatibilità con i sistemi System V.
-\end{description}
+\end{basedescript}
+
 
 \subsection{I segnali per il controllo di sessione}
 \label{sec:sig_job_control}
@@ -542,13 +554,13 @@ L'azione di default 
 Questi sono i segnali usati dal controllo delle sessioni e dei processi, il
 loro uso è specifico e viene trattato in maniera specifica nelle sezioni in
 cui si trattano gli argomenti relativi.  Questi segnali sono:
-\begin{description} 
-\item \macro{SIGCHLD} Questo è il segnale mandato al processo padre quando un
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
   figlio termina o viene fermato. L'azione di default è di ignorare il
-  segnale, la sua gestione è trattata in \secref{sec:prochand_wait}.
-\item \macro{SIGCLD} Per Linux questo è solo un segnale identico al
+  segnale, la sua gestione è trattata in \secref{sec:proc_wait}.
+\item[\macro{SIGCLD}] Per Linux questo è solo un segnale identico al
   precedente, il nome è obsoleto e andrebbe evitato. 
-\item \macro{SIGCONT} Il nome sta per \textit{continue}. Il segnale viene
+\item[\macro{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
   usato per fare ripartire un programma precedentemente fermato da
   \macro{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
   ripartire il processo prima della sua consegna. Il comportamento di default
@@ -562,9 +574,9 @@ cui si trattano gli argomenti relativi.  Questi segnali sono:
   manipolatori per far si che un programma produca una qualche azione speciale
   se viene fermato e riavviato, come per esempio riscrivere un prompt, o
   inviare un avviso. 
-\item \macro{SIGSTOP} Il segnale ferma un processo (lo porta in uno stato di
+\item[\macro{SIGSTOP}] Il segnale ferma un processo (lo porta in uno stato di
   sleep); il segnale non può essere né intercettato, né ignorato, né bloccato.
-\item \macro{SIGTSTP} Il nome sta per \textit{interactive stop}. Il segnale
+\item[\macro{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
   ferma il processo interattivamente, ed è generato dal carattere SUSP
   (prodotto dalla combinazione \macro{C-z}), ed al contrario di
   \macro{SIGSTOP} può essere intercettato e ignorato. In genere un programma
@@ -572,9 +584,17 @@ cui si trattano gli argomenti relativi.  Questi segnali sono:
   o il terminale in uno stato definito prima di fermarsi; se per esempio un
   programma ha disabilitato l'eco sul terminale può installare un manipolatore
   per riabilitarlo prima di fermarsi.
-\item \macro{SIGTTIN} 
-\item \macro{SIGTTOU}
-\end{description}
+\item[\macro{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
+  sessione di lavoro in background. Quando un processo in background tenta di
+  leggere da un terminale viene inviato questo segnale a tutti i processi
+  della sessione di lavoro. L'azione di default è di fermare il processo.
+  L'argomento è trattato in \secref{sec:sess_xxx}.
+\item[\macro{SIGTTOU}] Segnale analogo al precedente \macro{SIGTTIN}, ma
+  generato quando si tenta di scrivere o modificare uno dei modi del
+  terminale. L'azione di default è di fermare il processo, l'argomento è
+  trattato in \secref{sec:sess_xxx}.
+\end{basedescript}
+
 
 \subsection{I segnali di operazioni errate}
 \label{sec:sig_oper_error}
@@ -586,18 +606,25 @@ resto del sistema.
 
 L'azione di default di questi segnali è di terminare il processo, questi
 segnali sono:
-\begin{description}
-\item \texttt{SIGPIPE} Sta per \textit{Broken pipe}. Se si usano delle pipes o
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\item[\macro{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle pipe o
   delle FIFO è necessario che, prima che un processo inizi a scrivere su di
   essa, un'altro abbia aperto la pipe in lettura (si veda
   \secref{sec:ipc_pipes}). Se il processo in lettura non è partito o è
   terminato inavvertitamente alla scrittura sulla pipe il kernel genera questo
   segnale. Se il segnale è bloccato, intercettato o ignorato la chiamata che
   lo ha causato fallisce restituendo l'errore \macro{EPIPE} 
-\item  \texttt{SIGLOST} Sta per \textit{Resource lost}. 
-\item  \texttt{SIGXCPU} Sta per \textit{CPU time limit exceeded}.
-\item  \texttt{SIGXFSZ} Sta per \textit{File size limit exceeded}.
-\end{description}
+\item[\macro{SIGLOST}] Sta per \textit{Resource lost}. Viene generato quando
+  c'è un advisory lock su un file NFS, ed il server riparte dimenticando la
+  situazione precedente.
+\item[\macro{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
+  segnale è generato quando un processo eccede il limite impostato per il
+  tempo di CPU disponibile, vedi \secref{sec:sys_xxx}. 
+\item[\macro{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
+  segnale è generato quando un processo tenta di estendere un file oltre le
+  dimensioni specificate dal limite impostato per le dimensioni massime di un
+  file, vedi \secref{sec:sys_xxx}. 
+\end{basedescript}
 
 
 \subsection{Ulteriori segnali}
@@ -605,24 +632,46 @@ segnali sono:
 
 Raccogliamo qui infine usa serie di segnali che hanno scopi differenti non
 classificabili in maniera omogenea. Questi segnali sono:
-\begin{description}
-\item  \texttt{SIGUSR1} e \texttt{SIGUSR2} Sono due segnali a disposizione
+\begin{basedescript}{\desclabelwidth{2.0cm}}
+\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
-  default è terminare il processo.  
-\item \texttt{SIGWINCH} Il nome sta per \textit{window (size) change} ed è
+  default è terminare il processo.
+\item[\macro{SIGWINCH}] Il nome sta per \textit{window (size) change} ed è
   generato da molti sistemi (GNU/Linux compreso) quando le dimensioni (in
   righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
   programmi testuali per riformattare l'uscita su schermo quando si cambia
   dimensione a quest'ultimo. L'azione di default è di essere ignorato.
-\item  \texttt{SIGINFO} Il segnale indica una richiesta di informazioni. È
+\item[\macro{SIGINFO}] Il segnale indica una richiesta di informazioni. È
   usato con il controllo di sessione, causa la stampa di informazioni da parte
   del processo leader del gruppo associato al terminale di controllo, gli
   altri processi lo ignorano.
-\end{description}
+\end{basedescript}
 
 
+\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}. 
+\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à
+necessario copiarlo.
+
+La seconda funzione deriva da BSD ed è analoga alla funzione \func{perror}
+descritta in \secref{sec:intro_strerror}.
+
 
 \section{La gestione dei segnali}
 \label{sec:sig_handlers}
@@ -666,7 +715,7 @@ forma pi
   (*handler)(int)))int)}, e che è sostanzialmente equivalente alla
 definizione:
 \begin{verbatim}
-typedef void (* sighandler_t)(int) 
+    typedef void (* sighandler_t)(int) 
 \end{verbatim}
 cioè un puntatore ad una funzione di tipo \type{void} con un parametro di tipo
 \type{int}\footnote{si devono usare le parentesi intorno al nome della
@@ -687,3 +736,10 @@ intercettati).
 \subsection{Funzioni rientranti e default dei segnali}
 \label{sec:sig_reentrant}
 
+
+
+
+
+\subsection{La funzione \func{sigpending}}
+\label{sec:sig_sigpending}
+