Aggiornamenti del copyright all'anno nuovo, e risistemazione delle
[gapil.git] / signal.tex
index aa47a4dc18514364b4fc05abe80f633cf14761f4..edbc674a269a802be44392f4542287b56a155fbe 100644 (file)
@@ -1,6 +1,6 @@
 %% signal.tex
 %%
-%% Copyright (C) 2000-2005 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2007 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -8,6 +8,7 @@
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %%
+
 \chapter{I segnali}
 \label{cha:signals}
 
@@ -68,7 +69,7 @@ dall'utente o da un altro processo) comporta l'intervento diretto da parte del
 kernel che causa la generazione di un particolare tipo di segnale.
 
 Quando un processo riceve un segnale, invece del normale corso del programma,
-viene eseguita una azione predefinita o una apposita routine di gestione
+viene eseguita una azione predefinita o una apposita funzione di gestione
 (quello che da qui in avanti chiameremo il \textsl{gestore} del segnale,
 dall'inglese \textit{signal handler}) che può essere stata specificata
 dall'utente (nel qual caso si dice che si \textsl{intercetta} il segnale).
@@ -85,7 +86,7 @@ individuare due tipologie fondamentali di comportamento dei segnali (dette
 \textit{unreliable}).
 
 Nella \textsl{semantica inaffidabile} (quella implementata dalle prime
-versioni di Unix) la routine di gestione del segnale specificata dall'utente
+versioni di Unix) la funzione di gestione del segnale specificata dall'utente
 non resta attiva una volta che è stata eseguita; è perciò compito dell'utente
 stesso ripetere l'installazione all'interno del \textsl{gestore} del segnale,
 in tutti quei casi in cui si vuole che esso resti attivo.
@@ -116,7 +117,7 @@ verr
 Questa è la ragione per cui l'implementazione dei segnali secondo questa
 semantica viene chiamata \textsl{inaffidabile}; infatti la ricezione del
 segnale e la reinstallazione del suo gestore non sono operazioni atomiche, e
-sono sempre possibili delle \textit{race condition}\itindex{race~condition}
+sono sempre possibili delle \itindex{race~condition} \textit{race condition}
 (sull'argomento vedi quanto detto in sez.~\ref{sec:proc_multi_prog}).
 
 Un altro problema è che in questa semantica non esiste un modo per bloccare i
@@ -136,7 +137,7 @@ Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
 per tutto il tempo che passa fra la generazione del segnale e la sua consegna
 esso è detto \textsl{pendente} (o \textit{pending}). In genere questa
-procedura viene effettuata dallo scheduler\itindex{scheduler} quando,
+procedura viene effettuata dallo \itindex{scheduler} scheduler quando,
 riprendendo l'esecuzione del processo in questione, verifica la presenza del
 segnale nella \struct{task\_struct} e mette in esecuzione il gestore.
 
@@ -209,7 +210,7 @@ ignorarlo).
 
 Normalmente l'invio al processo che deve ricevere il segnale è immediato ed
 avviene non appena questo viene rimesso in esecuzione dallo
-scheduler\itindex{scheduler} che esegue l'azione specificata. Questo a meno
+\itindex{scheduler} scheduler che esegue l'azione specificata. Questo a meno
 che il segnale in questione non sia stato bloccato prima della notifica, nel
 qual caso l'invio non avviene ed il segnale resta \textsl{pendente}
 indefinitamente. Quando lo si sblocca il segnale \textsl{pendente} sarà subito
@@ -244,8 +245,8 @@ Un programma pu
 sez.~\ref{sec:sig_sigaction}). Se si è installato un gestore sarà quest'ultimo
 ad essere eseguito alla notifica del segnale.  Inoltre il sistema farà si che
 mentre viene eseguito il gestore di un segnale, quest'ultimo venga
-automaticamente bloccato (così si possono evitare \textit{race
-  condition}\itindex{race~condition}).
+automaticamente bloccato (così si possono evitare \itindex{race~condition}
+\textit{race condition}).
 
 Nel caso non sia stata specificata un'azione, viene utilizzata l'azione
 standard che (come vedremo in sez.~\ref{sec:sig_standard}) è propria di ciascun
@@ -260,7 +261,7 @@ un eventuale messaggio di errore.
 
 I segnali che rappresentano errori del programma (divisione per zero o
 violazioni di accesso) hanno anche la caratteristica di scrivere un file di
-\itindex{core~dump}\textit{core dump} che registra lo stato del processo (ed
+\itindex{core~dump} \textit{core dump} che registra lo stato del processo (ed
 in particolare della memoria e dello \itindex{stack} stack) prima della
 terminazione.  Questo può essere esaminato in seguito con un debugger per
 investigare sulla causa dell'errore.  Lo stesso avviene se i suddetti segnali
@@ -305,8 +306,8 @@ definiti in vari standard.
     \hline
     A & L'azione predefinita è terminare il processo. \\
     B & L'azione predefinita è ignorare il segnale. \\
-    C & L'azione predefinita è terminare il processo e scrivere un \textit{core
-        dump}. \\
+    C & L'azione predefinita è terminare il processo e scrivere un 
+        \itindex{core~dump} \textit{core dump}. \\
     D & L'azione predefinita è fermare il processo. \\
     E & Il segnale non può essere intercettato. \\
     F & Il segnale non può essere ignorato.\\
@@ -347,7 +348,7 @@ colonna standard sono stati indicati anche gli standard in cui ciascun segnale
 In alcuni casi alla terminazione del processo è associata la creazione di un
 file (posto nella directory corrente del processo e chiamato \file{core}) su
 cui viene salvata un'immagine della memoria del processo (il cosiddetto
-\itindex{core~dump}\textit{core dump}), che può essere usata da un debugger
+\itindex{core~dump} \textit{core dump}), che può essere usata da un debugger
 per esaminare lo stato dello \itindex{stack} stack e delle variabili al
 momento della ricezione del segnale.
 
@@ -360,49 +361,50 @@ momento della ricezione del segnale.
     \hline
     \hline
     \const{SIGHUP}   &PL & A & Hangup o terminazione del processo di 
-                               controllo                                     \\
-    \const{SIGINT}   &PL & A & Interrupt da tastiera (\cmd{C-c})             \\
-    \const{SIGQUIT}  &PL & C & Quit da tastiera (\cmd{C-y})                  \\
-    \const{SIGILL}   &PL & C & Istruzione illecita                           \\
-    \const{SIGABRT}  &PL & C & Segnale di abort da \func{abort}              \\
-    \const{SIGFPE}   &PL & C & Errore aritmetico                             \\
-    \const{SIGKILL}  &PL &AEF& Segnale di terminazione forzata               \\
-    \const{SIGSEGV}  &PL & C & Errore di accesso in memoria                  \\
-    \const{SIGPIPE}  &PL & A & Pipe spezzata                                 \\
-    \const{SIGALRM}  &PL & A & Segnale del timer da \func{alarm}             \\
-    \const{SIGTERM}  &PL & A & Segnale di terminazione \verb|C-\|            \\
-    \const{SIGUSR1}  &PL & A & Segnale utente numero 1                       \\
-    \const{SIGUSR2}  &PL & A & Segnale utente numero 2                       \\
-    \const{SIGCHLD}  &PL & B & Figlio terminato o fermato                    \\
-    \const{SIGCONT}  &PL &   & Continua se fermato                           \\
-    \const{SIGSTOP}  &PL &DEF& Ferma il processo                             \\
-    \const{SIGTSTP}  &PL & D & Pressione del tasto di stop sul terminale     \\
+                               controllo.                                    \\
+    \const{SIGINT}   &PL & A & Interrupt da tastiera (\cmd{C-c}).            \\
+    \const{SIGQUIT}  &PL & C & Quit da tastiera (\cmd{C-y}).                 \\
+    \const{SIGILL}   &PL & C & Istruzione illecita.                          \\
+    \const{SIGABRT}  &PL & C & Segnale di abort da \func{abort}.             \\
+    \const{SIGFPE}   &PL & C & Errore aritmetico.                            \\
+    \const{SIGKILL}  &PL &AEF& Segnale di terminazione forzata.              \\
+    \const{SIGSEGV}  &PL & C & Errore di accesso in memoria.                 \\
+    \const{SIGPIPE}  &PL & A & Pipe spezzata.                                \\
+    \const{SIGALRM}  &PL & A & Segnale del timer da \func{alarm}.            \\
+    \const{SIGTERM}  &PL & A & Segnale di terminazione \texttt{C-\bslash}.   \\
+    \const{SIGUSR1}  &PL & A & Segnale utente numero 1.                      \\
+    \const{SIGUSR2}  &PL & A & Segnale utente numero 2.                      \\
+    \const{SIGCHLD}  &PL & B & Figlio terminato o fermato.                   \\
+    \const{SIGCONT}  &PL &   & Continua se fermato.                          \\
+    \const{SIGSTOP}  &PL &DEF& Ferma il processo.                            \\
+    \const{SIGTSTP}  &PL & D & Pressione del tasto di stop sul terminale.    \\
     \const{SIGTTIN}  &PL & D & Input sul terminale per un processo 
-                               in background                                 \\
+                               in background.                                \\
     \const{SIGTTOU}  &PL & D & Output sul terminale per un processo          
-                               in background                                 \\
-    \const{SIGBUS}   &SL & C & Errore sul bus (bad memory access)            \\
-    \const{SIGPOLL}  &SL & A & \textit{Pollable event} (Sys V).  
-                               Sinonimo di \const{SIGIO}                     \\
-    \const{SIGPROF}  &SL & A & Timer del profiling scaduto                   \\
-    \const{SIGSYS}   &SL & C & Argomento sbagliato per una subroutine (SVID) \\
-    \const{SIGTRAP}  &SL & C & Trappole per un Trace/breakpoint              \\
+                               in background.                                \\
+    \const{SIGBUS}   &SL & C & Errore sul bus (bad memory access).           \\
+    \const{SIGPOLL}  &SL & A & \textit{Pollable event} (Sys V);  
+                               Sinonimo di \const{SIGIO}.                    \\
+    \const{SIGPROF}  &SL & A & Timer del profiling scaduto.                  \\
+    \const{SIGSYS}   &SL & C & Argomento sbagliato per una subroutine (SVID).\\
+    \const{SIGTRAP}  &SL & C & Trappole per un Trace/breakpoint.             \\
     \const{SIGURG}   &SLB& B & Ricezione di una \textit{urgent condition} su 
-                               un socket\index{socket}\\
-    \const{SIGVTALRM}&SLB& A & Virtual alarm clock                           \\
-    \const{SIGXCPU}  &SLB& C & Ecceduto il limite sul CPU time               \\
-    \const{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file  \\
-    \const{SIGIOT}   &L  & C & IOT trap. Sinonimo di \const{SIGABRT}         \\
+                               un socket\\
+    \const{SIGVTALRM}&SLB& A & Virtual alarm clock.                          \\
+    \const{SIGXCPU}  &SLB& C & Ecceduto il limite sul tempo di CPU.          \\
+    \const{SIGXFSZ}  &SLB& C & Ecceduto il limite sulla dimensione dei file. \\
+    \const{SIGIOT}   &L  & C & IOT trap. Sinonimo di \const{SIGABRT}.        \\
     \const{SIGEMT}   &L  &   &                                               \\
-    \const{SIGSTKFLT}&L  & A & Errore sullo stack del coprocessore           \\
-    \const{SIGIO}    &LB & A & L'I/O è possibile (4.2 BSD)                   \\
-    \const{SIGCLD}   &L  &   & Sinonimo di \const{SIGCHLD}                   \\
-    \const{SIGPWR}   &L  & A & Fallimento dell'alimentazione                 \\
-    \const{SIGINFO}  &L  &   & Sinonimo di \const{SIGPWR}                    \\
-    \const{SIGLOST}  &L  & A & Perso un lock sul file (per NFS)              \\
-    \const{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun)        \\
+% TODO che roba e` SIGEMT
+    \const{SIGSTKFLT}&L  & A & Errore sullo stack del coprocessore.          \\
+    \const{SIGIO}    &LB & A & L'I/O è possibile (4.2 BSD).                  \\
+    \const{SIGCLD}   &L  &   & Sinonimo di \const{SIGCHLD}.                  \\
+    \const{SIGPWR}   &L  & A & Fallimento dell'alimentazione.                \\
+    \const{SIGINFO}  &L  &   & Sinonimo di \const{SIGPWR}.                   \\
+    \const{SIGLOST}  &L  & A & Perso un lock sul file (per NFS).             \\
+    \const{SIGWINCH} &LB & B & Finestra ridimensionata (4.3 BSD, Sun).       \\
     \const{SIGUNUSED}&L  & A & Segnale inutilizzato (diventerà 
-                               \const{SIGSYS})                               \\
+                               \const{SIGSYS}).                              \\
     \hline
   \end{tabular}
   \caption{Lista dei segnali in Linux.}
@@ -417,7 +419,7 @@ tipologia, verr
 \label{sec:sig_prog_error}
 
 Questi segnali sono generati quando il sistema, o in certi casi direttamente
-l'hardware (come per i \itindex{page~fault}\textit{page fault} non validi)
+l'hardware (come per i \itindex{page~fault} \textit{page fault} non validi)
 rileva un qualche errore insanabile nel programma in esecuzione. In generale
 la generazione di questi segnali significa che il programma ha dei gravi
 problemi (ad esempio ha dereferenziato un puntatore non valido o ha eseguito
@@ -425,7 +427,7 @@ una operazione aritmetica proibita) e l'esecuzione non pu
 
 In genere si intercettano questi segnali per permettere al programma di
 terminare in maniera pulita, ad esempio per ripristinare le impostazioni della
-console o eliminare i file di lock\index{file!di lock} prima dell'uscita.  In
+console o eliminare i \index{file!di lock} file di lock prima dell'uscita.  In
 questo caso il gestore deve concludersi ripristinando l'azione predefinita e
 rialzando il segnale, in questo modo il programma si concluderà senza effetti
 spiacevoli, ma riportando lo stesso stato di uscita che avrebbe avuto se il
@@ -433,7 +435,7 @@ gestore non ci fosse stato.
 
 L'azione predefinita 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 \itindex{core~dump}\textit{core dump}
+la registrazione su disco di un file di \itindex{core~dump} \textit{core dump}
 che viene scritto 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:
@@ -511,22 +513,26 @@ segnali sono:
   \const{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo si
   usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
   concludersi.
+
 \item[\const{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 \cmd{C-c}).
+
 \item[\const{SIGQUIT}] È analogo a \const{SIGINT} con la differenza che è
   controllato da un altro carattere di controllo, QUIT, corrispondente alla
-  sequenza \verb|C-\|. A differenza del precedente l'azione predefinita, oltre
-  alla terminazione del processo, comporta anche la creazione di un
-  \itindex{core~dump}\textit{core dump}.
-
-  In genere lo si può pensare come corrispondente ad una condizione di
-  errore del programma rilevata dall'utente. Per questo motivo non è opportuno
-  fare eseguire al gestore di questo segnale le operazioni di pulizia
-  normalmente previste (tipo la cancellazione di file temporanei), dato che in
-  certi casi esse possono eliminare informazioni utili nell'esame dei core
-  dump. 
+  sequenza \texttt{C-\bslash}. A differenza del precedente l'azione
+  predefinita, oltre alla terminazione del processo, comporta anche la
+  creazione di un \itindex{core~dump} \textit{core dump}.
+
+  In genere lo si può pensare come corrispondente ad una condizione di errore
+  del programma rilevata dall'utente. Per questo motivo non è opportuno fare
+  eseguire al gestore di questo segnale le operazioni di pulizia normalmente
+  previste (tipo la cancellazione di file temporanei), dato che in certi casi
+  esse possono eliminare informazioni utili nell'esame dei \itindex{core~dump}
+  \textit{core dump}.
+  
+
 \item[\const{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.
@@ -541,6 +547,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 un gestore.
+
 \item[\const{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
@@ -564,9 +571,11 @@ sempre la necessit
 \item[\const{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[\const{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[\const{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
@@ -585,12 +594,15 @@ segnali sono:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\const{SIGIO}] Questo segnale viene inviato quando un file descriptor è
   pronto per eseguire dell'input/output. In molti sistemi solo i
-  socket\index{socket} e i terminali possono generare questo segnale, in Linux
+  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[\const{SIGURG}] Questo segnale è inviato quando arrivano dei dati
-  urgenti o \textit{out-of-band} su di un socket\index{socket}; per maggiori
-  dettagli al proposito si veda sez.~\ref{sec:TCP_urgent_data}.
+  urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
+  socket; per maggiori dettagli al proposito si veda
+  sez.~\ref{sec:TCP_urgent_data}.
+
 \item[\const{SIGPOLL}] Questo segnale è equivalente a \const{SIGIO}, è
   definito solo per compatibilità con i sistemi System V.
 \end{basedescript}
@@ -606,8 +618,10 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
 \item[\const{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
   figlio termina o viene fermato. L'azione predefinita è di ignorare il
   segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
+
 \item[\const{SIGCLD}] Per Linux questo è solo un segnale identico al
   precedente, il nome è obsoleto e andrebbe evitato. 
+
 \item[\const{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
   usato per fare ripartire un programma precedentemente fermato da
   \const{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
@@ -625,6 +639,7 @@ in cui si trattano gli argomenti relativi.  Questi segnali sono:
 \item[\const{SIGSTOP}] Il segnale ferma un processo (lo porta cioè in uno
   stato di sleep, vedi sez.~\ref{sec:proc_sched}); il segnale non può essere né
   intercettato, né ignorato, né bloccato.
+
 \item[\const{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
   ferma il processo interattivamente, ed è generato dal carattere SUSP
   (prodotto dalla combinazione \cmd{C-z}), ed al contrario di
@@ -633,12 +648,14 @@ in 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 gestore
   per riabilitarlo prima di fermarsi.
+
 \item[\const{SIGTTIN}] Un processo non può leggere dal terminale se esegue una
   sessione di lavoro in \textit{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 predefinita è di fermare il
   processo.  L'argomento è trattato in
   sez.~\ref{sec:sess_job_control_overview}.
+
 \item[\const{SIGTTOU}] Segnale analogo al precedente \const{SIGTTIN}, ma
   generato quando si tenta di scrivere o modificare uno dei modi del
   terminale. L'azione predefinita è di fermare il processo, l'argomento è
@@ -690,7 +707,7 @@ classificabili in maniera omogenea. Questi segnali sono:
   possono essere utili per implementare una comunicazione elementare fra
   processi diversi, o per eseguire a richiesta una operazione utilizzando un
   gestore. L'azione predefinita è di terminare il processo.
-\item[\const{SIGUSR2}] È il secondo segnale a dispozione degli utenti. Vedi
+\item[\const{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Vedi
   quanto appena detto per \const{SIGUSR1}.
 \item[\const{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
   generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
@@ -789,7 +806,7 @@ programmi eseguiti in background, che altrimenti sarebbero interrotti da una
 successiva pressione di \texttt{C-c} o \texttt{C-y}.
 
 Per quanto riguarda il comportamento di tutte le altre system call si danno
-sostanzialmente due casi, a seconda che esse siano\index{system~call~lente}
+sostanzialmente due casi, a seconda che esse siano \index{system~call~lente}
 \textsl{lente} (\textit{slow}) o \textsl{veloci} (\textit{fast}). La gran
 parte di esse appartiene a quest'ultima categoria, che non è influenzata
 dall'arrivo di un segnale. Esse sono dette \textsl{veloci} in quanto la loro
@@ -805,8 +822,8 @@ eseguito prima che la system call sia ritornata.  Un elenco dei casi in cui si
 presenta questa situazione è il seguente:
 \begin{itemize*}
 \item la lettura da file che possono bloccarsi in attesa di dati non ancora
-  presenti (come per certi file di dispositivo\index{file!di~dispositivo}, i
-  socket\index{socket} o le pipe);
+  presenti (come per certi \index{file!di~dispositivo} file di dispositivo, i
+  socket o le pipe);
 \item la scrittura sugli stessi file, nel caso in cui dati non possano essere
   accettati immediatamente (di nuovo comune per i socket);
 \item l'apertura di un file di dispositivo che richiede operazioni non
@@ -924,7 +941,7 @@ comportamento della versione originale della funzione, il cui uso 
 per i motivi visti in sez.~\ref{sec:sig_semantics}, può essere ottenuto
 chiamando \func{sysv\_signal}, una volta che si sia definita la macro
 \macro{\_XOPEN\_SOURCE}.  In generale, per evitare questi problemi, l'uso di
-\func{signal} (ed ogni eventuale ridefinizine della stessa) è da evitare;
+\func{signal} (ed ogni eventuale ridefinizione della stessa) è da evitare;
 tutti i nuovi programmi dovrebbero usare \func{sigaction}.
 
 È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
@@ -1360,16 +1377,17 @@ Chiaramente, anche se il tempo pu
 nanosecondo, la precisione di \func{nanosleep} è determinata dalla risoluzione
 temporale del timer di sistema. Perciò la funzione attenderà comunque il tempo
 specificato, ma prima che il processo possa tornare ad essere eseguito
-occorrerà almeno attendere il successivo giro di scheduler\itindex{scheduler}
+occorrerà almeno attendere il successivo giro di \itindex{scheduler} scheduler
 e cioè un tempo che a seconda dei casi può arrivare fino a 1/\const{HZ},
 (sempre che il sistema sia scarico ed il processa venga immediatamente rimesso
 in esecuzione); per questo motivo il valore restituito in \param{rem} è sempre
 arrotondato al multiplo successivo di 1/\const{HZ}.
 
 In realtà è possibile ottenere anche pause più precise del centesimo di
-secondo usando politiche di scheduling real-time come \const{SCHED\_FIFO} o
-\const{SCHED\_RR}; in tal caso infatti il meccanismo di scheduling ordinario
-viene evitato, e si raggiungono pause fino ai 2~ms con precisioni del $\mu$s.
+secondo usando politiche di \itindex{scheduler} scheduling real-time come
+\const{SCHED\_FIFO} o \const{SCHED\_RR}; in tal caso infatti il meccanismo di
+\itindex{scheduler} scheduling ordinario viene evitato, e si raggiungono pause
+fino ai 2~ms con precisioni del $\mu$s.
 
 
 
@@ -1383,24 +1401,24 @@ conclusione di un processo 
 padre.\footnote{in realtà in SVr4 eredita la semantica di System V, in cui il
   segnale si chiama \const{SIGCLD} e viene trattato in maniera speciale; in
   System V infatti se si imposta esplicitamente l'azione a \const{SIG\_IGN} il
-  segnale non viene generato ed il sistema non genera zombie\index{zombie} (lo
-  stato di terminazione viene scartato senza dover chiamare una \func{wait}).
-  L'azione predefinita è sempre quella di ignorare il segnale, ma non attiva
-  questo comportamento. Linux, come BSD e POSIX, non supporta questa semantica
-  ed usa il nome di \const{SIGCLD} come sinonimo di \const{SIGCHLD}.} In
-generale dunque, quando non interessa elaborare lo stato di uscita di un
-processo, si può completare la gestione della terminazione installando un
-gestore per \const{SIGCHLD} il cui unico compito sia quello di chiamare
-\func{waitpid} per completare la procedura di terminazione in modo da evitare
-la formazione di zombie\index{zombie}.
+  segnale non viene generato ed il sistema non genera \index{zombie} zombie
+  (lo stato di terminazione viene scartato senza dover chiamare una
+  \func{wait}).  L'azione predefinita è sempre quella di ignorare il segnale,
+  ma non attiva questo comportamento. Linux, come BSD e POSIX, non supporta
+  questa semantica ed usa il nome di \const{SIGCLD} come sinonimo di
+  \const{SIGCHLD}.} In generale dunque, quando non interessa elaborare lo
+stato di uscita di un processo, si può completare la gestione della
+terminazione installando un gestore per \const{SIGCHLD} il cui unico compito
+sia quello di chiamare \func{waitpid} per completare la procedura di
+terminazione in modo da evitare la formazione di \index{zombie} zombie.
 
 In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una
-implementazione generica di una routine di gestione per \const{SIGCHLD}, (che
+implementazione generica di una funzione di gestione per \const{SIGCHLD}, (che
 si trova nei sorgenti allegati nel file \file{SigHand.c}); se ripetiamo i test
 di sez.~\ref{sec:proc_termination}, invocando \cmd{forktest} con l'opzione
 \cmd{-s} (che si limita ad effettuare l'installazione di questa funzione come
 gestore di \const{SIGCHLD}) potremo verificare che non si ha più la creazione
-di zombie\index{zombie}.
+di \index{zombie} zombie.
 
 \begin{figure}[!htb]
   \footnotesize  \centering
@@ -1440,7 +1458,7 @@ rimosso verr
 Allora, nel caso della terminazione dei processi figli, se si chiamasse
 \func{waitpid} una sola volta, essa leggerebbe lo stato di terminazione per un
 solo processo, anche se i processi terminati sono più di uno, e gli altri
-resterebbero in stato di zombie\index{zombie} per un tempo indefinito.
+resterebbero in stato di \index{zombie} zombie per un tempo indefinito.
 
 Per questo occorre ripetere la chiamata di \func{waitpid} fino a che essa non
 ritorni un valore nullo, segno che non resta nessun processo di cui si debba
@@ -1456,9 +1474,9 @@ tutti gli stati di terminazione sono stati ricevuti.
 
 Le funzioni esaminate finora fanno riferimento alle modalità più elementari
 della gestione dei segnali; non si sono pertanto ancora prese in
-considerazione le tematiche più complesse, collegate alle varie \textit{race
-  condition}\itindex{race~condition} che i segnali possono generare e alla
-natura asincrona degli stessi.
+considerazione le tematiche più complesse, collegate alle varie
+\itindex{race~condition} \textit{race condition} che i segnali possono
+generare e alla natura asincrona degli stessi.
 
 Affronteremo queste problematiche in questa sezione, partendo da un esempio
 che le evidenzi, per poi prendere in esame le varie funzioni che permettono di
@@ -1499,12 +1517,12 @@ l'interruzione di \func{pause} venisse causata da un altro segnale.
 
 Questo codice però, a parte il non gestire il caso in cui si è avuta una
 precedente chiamata a \func{alarm} (che si è tralasciato per brevità),
-presenta una pericolosa \textit{race condition}\itindex{race~condition}.
+presenta una pericolosa \itindex{race~condition} \textit{race condition}.
 Infatti, se il processo viene interrotto fra la chiamata di \func{alarm} e
 \func{pause}, può capitare (ad esempio se il sistema è molto carico) che il
 tempo di attesa scada prima dell'esecuzione di quest'ultima, cosicché essa
 sarebbe eseguita dopo l'arrivo di \const{SIGALRM}. In questo caso ci si
-troverebbe di fronte ad un deadlock\itindex{deadlock}, in quanto \func{pause}
+troverebbe di fronte ad un \itindex{deadlock} deadlock, in quanto \func{pause}
 non verrebbe mai più interrotta (se non in caso di un altro segnale).
 
 Questo problema può essere risolto (ed è la modalità con cui veniva fatto in
@@ -1561,18 +1579,18 @@ quale potr
 segnale, e prendere le relative azioni conseguenti (\texttt{\small 6-11}).
 
 Questo è il tipico esempio di caso, già citato in
-sez.~\ref{sec:proc_race_cond}, in cui si genera una
-\itindex{race~condition}\textit{race condition}; infatti, in una situazione in
-cui un segnale è già arrivato (e \var{flag} è già ad 1) se un altro segnale
-segnale arriva immediatamente dopo l'esecuzione del controllo (\texttt{\small
-  6}) ma prima della cancellazione del flag (\texttt{\small 7}), la sua
-occorrenza sarà perduta.
+sez.~\ref{sec:proc_race_cond}, in cui si genera una \itindex{race~condition}
+\textit{race condition}; infatti, in una situazione in cui un segnale è già
+arrivato (e \var{flag} è già ad 1) se un altro segnale segnale arriva
+immediatamente dopo l'esecuzione del controllo (\texttt{\small 6}) ma prima
+della cancellazione del flag (\texttt{\small 7}), la sua occorrenza sarà
+perduta.
 
 Questi esempi ci mostrano che per una gestione effettiva dei segnali occorrono
-funzioni più sofisticate di quelle illustrate finora, che hanno origine dalla
-interfaccia semplice, ma poco sofisticata, dei primi sistemi Unix, in modo da
-consentire la gestione di tutti i possibili aspetti con cui un processo deve
-reagire alla ricezione di un segnale.
+delle funzioni più sofisticate di quelle finora illustrate, queste hanno la
+loro origine nella semplice interfaccia dei primi sistemi Unix, ma con esse
+non è possibile gestire in maniera adeguata di tutti i possibili aspetti con
+cui un processo deve reagire alla ricezione di un segnale.
 
 
 
@@ -1820,8 +1838,8 @@ al processo che ha emesso il segnale, \const{SIGILL}, \const{SIGFPE},
 \const{SIGSEGV} e \const{SIGBUS} avvalorano \var{si\_addr} con l'indirizzo in
 cui è avvenuto l'errore, \const{SIGIO} (vedi
 sez.~\ref{sec:file_asyncronous_io}) avvalora \var{si\_fd} con il numero del
-file descriptor e \var{si\_band} per i dati urgenti su un
-socket\index{socket}.
+file descriptor e \var{si\_band} per i \itindex{out-of-band} dati urgenti (vedi
+sez.~\ref{sec:TCP_urgent_data}) su un socket.
 
 Benché sia possibile usare nello stesso programma sia \func{sigaction} che
 \func{signal} occorre molta attenzione, in quanto le due funzioni possono
@@ -1899,9 +1917,9 @@ che essi siano eseguite senza interruzioni.
 
 Le operazioni più semplici, come l'assegnazione o il controllo di una
 variabile (per essere sicuri si può usare il tipo \type{sig\_atomic\_t}) di
-norma sono atomiche, quando occorrono operazioni più complesse si può invece
-usare la funzione \funcd{sigprocmask} che permette di bloccare uno o più
-segnali; il suo prototipo è:
+norma sono atomiche; quando si devono eseguire operazioni più complesse si può
+invece usare la funzione \funcd{sigprocmask} che permette di bloccare uno o
+più segnali; il suo prototipo è:
 \begin{prototype}{signal.h}
 {int sigprocmask(int how, const sigset\_t *set, sigset\_t *oldset)} 
   
@@ -1945,10 +1963,10 @@ quell'indirizzo.
 \end{table}
 
 In questo modo diventa possibile proteggere delle sezioni di codice bloccando
-l'insieme di segnali voluto per poi riabilitarli alla fine della sezione
-critica. La funzione permette di risolvere problemi come quelli mostrati in
-fig.~\ref{fig:sig_event_wrong}, proteggendo la sezione fra il controllo del
-flag e la sua cancellazione.
+l'insieme di segnali voluto per poi riabilitarli alla fine della
+\index{sezione~critica} sezione critica. La funzione permette di risolvere
+problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong}, proteggendo
+la sezione fra il controllo del flag e la sua cancellazione.
 
 La funzione può essere usata anche all'interno di un gestore, ad esempio
 per riabilitare la consegna del segnale che l'ha invocato, in questo caso però
@@ -1956,7 +1974,7 @@ occorre ricordare che qualunque modifica alla maschera dei segnali viene
 perduta alla conclusione del terminatore. 
 
 Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte
-dei casi di \textit{race condition}\itindex{race~condition} restano aperte
+dei casi di \itindex{race~condition} \textit{race condition} restano aperte
 alcune possibilità legate all'uso di \func{pause}; il caso è simile a quello
 del problema illustrato nell'esempio di fig.~\ref{fig:sig_sleep_incomplete}, e
 cioè la possibilità che il processo riceva il segnale che si intende usare per
@@ -2015,12 +2033,11 @@ fine (\texttt{\small 22}), e al contempo si prepara la maschera dei segnali
 \var{sleep\_mask} per riattivare \const{SIGALRM} all'esecuzione di
 \func{sigsuspend}.  
 
-In questo modo non sono più possibili \textit{race
-  condition}\itindex{race~condition} dato che \const{SIGALRM} viene
-disabilitato con \func{sigprocmask} fino alla chiamata di \func{sigsuspend}.
-Questo metodo è assolutamente generale e può essere applicato a qualunque
-altra situazione in cui si deve attendere per un segnale, i passi sono sempre
-i seguenti:
+In questo modo non sono più possibili \itindex{race~condition} \textit{race
+  condition} dato che \const{SIGALRM} viene disabilitato con
+\func{sigprocmask} fino alla chiamata di \func{sigsuspend}.  Questo metodo è
+assolutamente generale e può essere applicato a qualunque altra situazione in
+cui si deve attendere per un segnale, i passi sono sempre i seguenti:
 \begin{enumerate*}
 \item Leggere la maschera dei segnali corrente e bloccare il segnale voluto
   con \func{sigprocmask};
@@ -2030,8 +2047,8 @@ i seguenti:
 \end{enumerate*}
 Per quanto possa sembrare strano bloccare la ricezione di un segnale per poi
 riabilitarla immediatamente dopo, in questo modo si evita il
-deadlock\itindex{deadlock} dovuto all'arrivo del segnale prima dell'esecuzione
-di \func{sigsuspend}.  
+\itindex{deadlock} deadlock dovuto all'arrivo del segnale prima
+dell'esecuzione di \func{sigsuspend}.
 
 \itindend{signal~mask}
 
@@ -2183,7 +2200,7 @@ due comportamenti il programma deve assumere; i loro prototipi sono:
   \headdecl{setjmp.h} 
   
   \funcdecl{int sigsetjmp(sigjmp\_buf env, int savesigs)} Salva il contesto
-  dello stack per un salto non-locale\index{salto~non-locale}.
+  dello stack per un \index{salto~non-locale} salto non-locale.
  
   \funcdecl{void siglongjmp(sigjmp\_buf env, int val)} Esegue un salto
   non-locale su un precedente contesto.
@@ -2195,7 +2212,7 @@ due comportamenti il programma deve assumere; i loro prototipi sono:
 
 Le due funzioni prendono come primo argomento la variabile su cui viene
 salvato il contesto dello \itindex{stack} stack per permettere il
-\index{salto~non-locale}salto non-locale; nel caso specifico essa è di tipo
+\index{salto~non-locale} salto non-locale; nel caso specifico essa è di tipo
 \type{sigjmp\_buf}, e non \type{jmp\_buf} come per le analoghe di
 sez.~\ref{sec:proc_longjmp} in quanto in questo caso viene salvata anche la
 maschera dei segnali.
@@ -2435,7 +2452,7 @@ immediatamente; in questo modo si pu
 dover essere bloccati qualora esso non sia presente.
 
 L'uso di queste funzioni è principalmente associato alla gestione dei segnali
-com i thread. In genere esse vengono chiamate dal thread incaricato della
+con i thread. In genere esse vengono chiamate dal thread incaricato della
 gestione, che al ritorno della funzione esegue il codice che usualmente
 sarebbe messo nel gestore, per poi ripetere la chiamata per mettersi in attesa
 del segnale successivo. Questo ovviamente comporta che non devono essere
@@ -2449,3 +2466,36 @@ dedicato alla gestione, che potrebbe riceverlo fra due chiamate successive.
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+
+% LocalWords:  kernel POSIX timer shell control ctrl kill raise signal handler
+% LocalWords:  reliable unreliable fig race condition sez struct process table
+% LocalWords:  delivered pending scheduler sigpending l'I suspend SIGKILL wait
+% LocalWords:  SIGSTOP sigaction waitpid dump stack debugger nell'header NSIG
+% LocalWords:  tab BSD SUSv SIGHUP PL Hangup SIGINT Interrupt SIGQUIT Quit AEF
+% LocalWords:  SIGILL SIGABRT abort SIGFPE SIGSEGV SIGPIPE SIGALRM alarm SIGUSR
+% LocalWords:  SIGTERM SIGCHLD SIGCONT SIGTSTP SIGTTIN SIGTTOU SIGBUS bad SL of
+% LocalWords:  memory access SIGPOLL Pollable event Sys SIGIO SIGPROF profiling
+% LocalWords:  SIGSYS SVID SIGTRAP breakpoint SIGURG urgent socket Virtual IOT
+% LocalWords:  clock SIGXCPU SIGXFSZ SIGIOT trap SIGEMT SIGSTKFLT SIGCLD SIGPWR
+% LocalWords:  SIGINFO SIGLOST lock NFS SIGWINCH Sun SIGUNUSED fault point heap
+% LocalWords:  exception l'overflow illegal instruction overflow segment error
+% LocalWords:  violation system call interrupt INTR hang SIGVTALRM virtual SUSP
+% LocalWords:  profilazione fcntl descriptor sleep interactive Broken FIFO lost
+% LocalWords:  EPIPE Resource advisory client limit exceeded size window change
+% LocalWords:  strsignal psignal SOURCE strerror string char int signum perror
+% LocalWords:  void sig const sys siglist L'array decr fork exec DFL IGN ioctl
+% LocalWords:  EINTR glibc TEMP FAILURE RETRY expr multitasking SVr sighandler
+% LocalWords:  ERR libc bsd sysv XOPEN EINVAL pid errno ESRCH EPERM getpid init
+% LocalWords:  killpg pidgrp group unistd unsigned seconds all' setitimer which
+% LocalWords:  itimerval value ovalue EFAULT ITIMER it interval timeval ms VIRT
+% LocalWords:  getitimer stdlib stream atexit exit usleep long usec nanosleep
+% LocalWords:  timespec req rem HZ scheduling SCHED RR SigHand forktest WNOHANG
+% LocalWords:  deadlock longjmp setjmp sigset sigemptyset sigfillset sigaddset
+% LocalWords:  sigdelset sigismember act oldact restorer mask NOCLDSTOP ONESHOT
+% LocalWords:  RESETHAND RESTART NOMASK NODEFER ONSTACK sigcontext union signo
+% LocalWords:  siginfo bits uid addr fd inline like blocked atomic sigprocmask
+% LocalWords:  how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
+% LocalWords:  SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
+% LocalWords:  RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
+% LocalWords:  SIGRTMIN SIGRTMAX sigval sival sigevent sigqueue EAGAIN sysctl
+% LocalWords:  QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB