Altre indicizzazioni e recupero dei pezzi tagliati per sbaglio
[gapil.git] / signal.tex
index 84c8ac5f00b1ad2ea340877691da1ec0f5db0082..bde6dfcedc1619d500a0a1e99b5f7cd015b7585e 100644 (file)
@@ -115,20 +115,20 @@ gestore non verrebbe eseguita.
 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 \itindex{race~condition} \textit{race condition}
-(si ricordi sez.~\ref{sec:proc_multi_prog}).  Un altro problema è che in
-questa semantica non esiste un modo per bloccare i segnali quando non si vuole
-che arrivino; i processi possono ignorare il segnale, ma non è possibile
-istruire il sistema a non fare nulla in occasione di un segnale, pur
-mantenendo memoria del fatto che è avvenuto.
+sono sempre possibili delle \textit{race condition} (si ricordi
+sez.~\ref{sec:proc_multi_prog}).  Un altro problema è che in questa semantica
+non esiste un modo per bloccare i segnali quando non si vuole che arrivino; i
+processi possono ignorare il segnale, ma non è possibile istruire il sistema a
+non fare nulla in occasione di un segnale, pur mantenendo memoria del fatto
+che è avvenuto.
 
 Nella semantica \textsl{affidabile} (quella utilizzata da Linux e da ogni Unix
 moderno) il gestore una volta installato resta attivo e non si hanno tutti i
 problemi precedenti. In questa semantica i segnali vengono \textsl{generati}
 dal kernel per un processo all'occorrenza dell'evento che causa il segnale. In
 genere questo viene fatto dal kernel impostando un apposito campo della
-\struct{task\_struct} del processo nella \itindex{process~table}
-\textit{process table} (si veda fig.~\ref{fig:proc_task_struct}).
+\struct{task\_struct} del processo nella \textit{process table} (si veda
+fig.~\ref{fig:proc_task_struct}).
 
 Si dice che il segnale viene \textsl{consegnato} al processo (dall'inglese
 \textit{delivered}) quando viene eseguita l'azione per esso prevista, mentre
@@ -258,7 +258,7 @@ sez.~\ref{sec:sig_signal} e 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 alla
-radice possibili \itindex{race~condition} \textit{race condition}.
+radice possibili \textit{race condition}.
 
 Nel caso non sia stata specificata un'azione, viene utilizzata la cosiddetta
 azione predefinita che, come vedremo in sez.~\ref{sec:sig_standard}, è propria
@@ -477,20 +477,20 @@ affrontata nei paragrafi successivi.
 \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 o
-le eccezioni del processore) rileva un qualche errore insanabile nel programma
-in esecuzione. In generale la generazione di questi segnali significa che il
+l'hardware (come per i \textit{page fault} non validi o le eccezioni del
+processore) 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 una operazione aritmetica proibita) e l'esecuzione non
 può essere proseguita.
 
 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 \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
-gestore non ci fosse stato.
+console o eliminare i 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 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
@@ -517,10 +517,10 @@ terminazione.  Questi segnali sono:
   file eseguibile è corrotto o si stanno cercando di eseguire dei dati.
   Quest'ultimo caso può accadere quando si passa un puntatore sbagliato al
   posto di un puntatore a funzione, o si eccede la scrittura di un vettore di
-  una variabile locale, andando a corrompere lo \itindex{stack}
-  \textit{stack}. Lo stesso segnale viene generato in caso di overflow dello
-  \itindex{stack} \textit{stack} o di problemi nell'esecuzione di un gestore.
-  Se il gestore ritorna il comportamento del processo è indefinito.
+  una variabile locale, andando a corrompere lo \textit{stack}. Lo stesso
+  segnale viene generato in caso di overflow dello \textit{stack} o di
+  problemi nell'esecuzione di un gestore.  Se il gestore ritorna il
+  comportamento del processo è indefinito.
 
 \item[\signal{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
   \textit{segment violation}, e significa che il programma sta cercando di
@@ -535,9 +535,9 @@ terminazione.  Questi segnali sono:
   \signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
   dereferenzia un puntatore non inizializzato, la differenza è che
   \signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
-  (al di fuori dallo \itindex{heap} \textit{heap} o dallo \itindex{stack}
-  \textit{stack}), mentre \signal{SIGBUS} indica l'accesso ad un indirizzo non
-  valido, come nel caso di un puntatore non allineato.
+  (al di fuori dallo \textit{heap} o dallo \textit{stack}), mentre
+  \signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso
+  di un puntatore non allineato.
 
 \item[\signal{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
   che il programma stesso ha rilevato un errore che viene riportato chiamando
@@ -860,9 +860,9 @@ stringa passata nell'argomento \param{s}, seguita dal carattere di due punti
 ed una descrizione del segnale indicato dall'argomento \param{sig}. 
 
 Una modalità alternativa per utilizzare le descrizioni restituite da
-\func{strsignal} e \func{psignal} è quello di usare la
-\index{variabili!globali} variabile globale \var{sys\_siglist}, che è definita
-in \headfile{signal.h} e può essere acceduta con la dichiarazione:
+\func{strsignal} e \func{psignal} è quello di usare la variabile globale
+\var{sys\_siglist}, che è definita in \headfile{signal.h} e può essere
+acceduta con la dichiarazione:
 \includecodesnip{listati/siglist.c}
 
 L'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione,
@@ -936,8 +936,7 @@ prima che la \textit{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 \index{file!di~dispositivo} file di dispositivo, i
-  socket o le \textit{pipe});
+  presenti (come per certi file di dispositivo, i socket o le \textit{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
@@ -1676,13 +1675,13 @@ generale dunque, quando non interessa elaborare lo stato di uscita di un
 processo, si può completare la gestione della terminazione installando un
 gestore per \signal{SIGCHLD} il cui unico compito sia quello di chiamare
 \func{waitpid} per completare la procedura di terminazione in modo da evitare
-la formazione di \itindex{zombie} \textit{zombie}.\footnote{si ricordi
-  comunque che dal kernel 2.6 seguendo lo standard POSIX.1-2001 per evitare di
-  dover ricevere gli stati di uscita che non interessano basta impostare come
-  azione predefinita quella di ignorare \signal{SIGCHLD}, nel qual caso viene
-  assunta la semantica di System V, in cui il segnale non viene inviato, il
-  sistema non genera \itindex{zombie} \textit{zombie} e lo stato di
-  terminazione viene scartato senza dover chiamare una \func{wait}.}
+la formazione di \textit{zombie}.\footnote{si ricordi comunque che dal kernel
+  2.6 seguendo lo standard POSIX.1-2001 per evitare di dover ricevere gli
+  stati di uscita che non interessano basta impostare come azione predefinita
+  quella di ignorare \signal{SIGCHLD}, nel qual caso viene assunta la
+  semantica di System V, in cui il segnale non viene inviato, il sistema non
+  genera \textit{zombie} e lo stato di terminazione viene scartato senza dover
+  chiamare una \func{wait}.}
 
 In fig.~\ref{fig:sig_sigchld_handl} è mostrato il codice contenente una
 implementazione generica di una funzione di gestione per \signal{SIGCHLD},
@@ -1690,7 +1689,7 @@ implementazione generica di una funzione di gestione per \signal{SIGCHLD},
 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 \signal{SIGCHLD}) potremo verificare che non si ha
-più la creazione di \itindex{zombie} \textit{zombie}.
+più la creazione di \textit{zombie}.
 
 \begin{figure}[!htbp]
   \footnotesize  \centering
@@ -1731,8 +1730,7 @@ rimosso verrà recapitato un solo segnale.
 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 \itindex{zombie} \textit{zombie} per un tempo
-indefinito.
+resterebbero in stato di \textit{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
@@ -1748,9 +1746,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
-\itindex{race~condition} \textit{race condition} che i segnali possono
-generare e alla natura asincrona degli stessi.
+considerazione le tematiche più complesse, collegate alle varie \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
@@ -1791,13 +1789,13 @@ 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 \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 \signal{SIGALRM}. In questo caso ci si
-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).
+presenta una pericolosa \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 \signal{SIGALRM}. In questo caso ci si troverebbe di fronte ad un
+\textit{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
 SVr2) usando la funzione \func{longjmp} (vedi sez.~\ref{sec:proc_longjmp}) per
@@ -1837,11 +1835,11 @@ da controllare nel corpo principale del programma, con un codice del tipo di
 quello riportato in fig.~\ref{fig:sig_event_wrong}.
 
 La logica del programma è quella di far impostare al gestore (\texttt{\small
-  14--19}) una \index{variabili!globali} variabile globale, preventivamente
-inizializzata nel programma principale, ad un diverso valore. In questo modo
-dal corpo principale del programma si potrà determinare, osservandone il
-contenuto di detta variabile, l'occorrenza o meno del segnale, ed eseguire le
-azioni conseguenti (\texttt{\small 6--11}) relative.
+  14--19}) una variabile globale, preventivamente inizializzata nel programma
+principale, ad un diverso valore. In questo modo dal corpo principale del
+programma si potrà determinare, osservandone il contenuto di detta variabile,
+l'occorrenza o meno del segnale, ed eseguire le azioni conseguenti
+(\texttt{\small 6--11}) relative.
 
 \begin{figure}[!htbp]
   \footnotesize\centering
@@ -1855,12 +1853,12 @@ azioni conseguenti (\texttt{\small 6--11}) relative.
 \end{figure}
 
 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 quindi \var{flag} è già stata impostata ad 1 nel gestore) se un
-altro segnale arriva immediatamente dopo l'esecuzione del controllo
-(\texttt{\small 6}) ma prima della cancellazione di \var{flag} fatta subito
-dopo (\texttt{\small 7}), la sua occorrenza sarà perduta.
+sez.~\ref{sec:proc_race_cond}, in cui si genera una \textit{race
+  condition}. Infatti, in una situazione in cui un segnale è già arrivato (e
+quindi \var{flag} è già stata impostata ad 1 nel gestore) se un altro segnale
+arriva immediatamente dopo l'esecuzione del controllo (\texttt{\small 6}) ma
+prima della cancellazione di \var{flag} fatta subito dopo (\texttt{\small 7}),
+la sua occorrenza sarà perduta.
 
 Questi esempi ci mostrano come per poter eseguire una gestione effettiva dei
 segnali occorrono delle funzioni più sofisticate di quelle finora
@@ -2100,13 +2098,13 @@ tab.~\ref{tab:sig_sa_flag}.
                            quando si imposta un gestore per \signal{SIGCHLD}.\\
     \const{SA\_NOCLDWAIT}& Se il segnale è \signal{SIGCHLD} e si richiede di
                            ignorare il segnale con \const{SIG\_IGN} allora i
-                           processi figli non diventano \itindex{zombie}
-                           \textit{zombie} quando terminano; questa
-                           funzionalità è stata introdotta nel kernel 2.6 e va
-                           a modificare il comportamento di \func{waitpid}
-                           come illustrato in sez.~\ref{sec:proc_wait}, se si
-                           installa un gestore con questo flag attivo il
-                           segnale \signal{SIGCHLD} viene comunque generato.\\ 
+                           processi figli non diventano \textit{zombie} quando
+                           terminano; questa funzionalità è stata introdotta
+                           nel kernel 2.6 e va a modificare il comportamento
+                           di \func{waitpid} come illustrato in
+                           sez.~\ref{sec:proc_wait}, se si installa un gestore
+                           con questo flag attivo il segnale \signal{SIGCHLD}
+                           viene comunque generato.\\
     \const{SA\_NODEFER}  & Evita che il segnale corrente sia bloccato durante
                            l'esecuzione del gestore.\\
     \const{SA\_NOMASK}   & Nome obsoleto e sinonimo non standard di
@@ -2115,9 +2113,8 @@ tab.~\ref{tab:sig_sa_flag}.
     \const{SA\_ONESHOT}  & Nome obsoleto e sinonimo non standard di
                            \const{SA\_RESETHAND}, non deve essere più
                            utilizzato.\\ 
-    \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \itindex{stack} 
-                           \textit{stack} alternativo per l'esecuzione del
-                           gestore (vedi
+    \const{SA\_ONSTACK}  & Stabilisce l'uso di uno \textit{stack} alternativo
+                           per l'esecuzione del gestore (vedi
                            sez.~\ref{sec:sig_specific_features}).\\  
     \const{SA\_RESETHAND}& Ristabilisce l'azione per il segnale al valore 
                            predefinito una volta che il gestore è stato
@@ -2357,12 +2354,11 @@ kernel, dove in certi casi le ottimizzazioni dal compilatore, tarate per l'uso
 in \textit{user space}, non sono sempre adatte.
 
 In tal caso infatti le istruzioni per creare un nuovo frame nello
-\itindex{stack} \textit{stack} per chiamare la funzione costituirebbero una
-parte rilevante del codice, appesantendo inutilmente il programma.
-Originariamente questo comportamento veniva ottenuto con delle macro, ma
-queste hanno tutta una serie di problemi di sintassi nel passaggio degli
-argomenti (si veda ad esempio \cite{PratC}) che in questo modo possono essere
-evitati.
+\textit{stack} per chiamare la funzione costituirebbero una parte rilevante
+del codice, appesantendo inutilmente il programma.  Originariamente questo
+comportamento veniva ottenuto con delle macro, ma queste hanno tutta una serie
+di problemi di sintassi nel passaggio degli argomenti (si veda ad esempio
+\cite{PratC}) che in questo modo possono essere evitati.
 
 
 
@@ -2450,24 +2446,23 @@ 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
-\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ò occorre ricordare
-che qualunque modifica alla maschera dei segnali viene perduta al ritorno
-dallo stesso.
+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.  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ò occorre ricordare che qualunque modifica alla
+maschera dei segnali viene perduta al ritorno dallo stesso.
 
 Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte
-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
-uscire dallo stato di attesa invocato con \func{pause} immediatamente prima
-dell'esecuzione di quest'ultima. Per poter effettuare atomicamente la modifica
-della maschera dei segnali (di solito attivandone uno specifico) insieme alla
-sospensione del processo lo standard POSIX ha previsto la funzione di sistema
+dei casi di \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 uscire dallo stato di
+attesa invocato con \func{pause} immediatamente prima dell'esecuzione di
+quest'ultima. Per poter effettuare atomicamente la modifica della maschera dei
+segnali (di solito attivandone uno specifico) insieme alla sospensione del
+processo lo standard POSIX ha previsto la funzione di sistema
 \funcd{sigsuspend}, il cui prototipo è:
 
 \begin{funcproto}{
@@ -2522,11 +2517,11 @@ fine (\texttt{\small 22}), e al contempo si prepara la maschera dei segnali
 \var{sleep\_mask} per riattivare \signal{SIGALRM} all'esecuzione di
 \func{sigsuspend}.  
 
-In questo modo non sono più possibili \itindex{race~condition} \textit{race
-  condition} dato che \signal{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 \textit{race condition} dato che
+\signal{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};
@@ -2535,9 +2530,8 @@ cui si deve attendere per un segnale, i passi sono sempre i seguenti:
 \item ripristinare la maschera dei segnali originaria.
 \end{enumerate*}
 Per quanto possa sembrare strano bloccare la ricezione di un segnale per poi
-riabilitarla immediatamente dopo, in questo modo si evita il
-\itindex{deadlock} deadlock dovuto all'arrivo del segnale prima
-dell'esecuzione di \func{sigsuspend}.
+riabilitarla immediatamente dopo, in questo modo si evita il \textit{deadlock}
+dovuto all'arrivo del segnale prima dell'esecuzione di \func{sigsuspend}.
 
 \index{maschera dei segnali|)}
 
@@ -2642,11 +2636,10 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}.
 Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
 effettuate all'interno di un gestore di segnali, qualora si debbano compiere
 operazioni complesse è sempre preferibile utilizzare la tecnica in cui si usa
-il gestore per impostare il valore di una qualche \index{variabili!globali}
-variabile globale, e poi si eseguono le operazioni complesse nel programma
-verificando (con tutti gli accorgimenti visti in precedenza) il valore di
-questa variabile tutte le volte che si è rilevata una interruzione dovuta ad
-un segnale.
+il gestore per impostare il valore di una qualche variabile globale, e poi si
+eseguono le operazioni complesse nel programma verificando (con tutti gli
+accorgimenti visti in precedenza) il valore di questa variabile tutte le volte
+che si è rilevata una interruzione dovuta ad un segnale.
 
 
 \section{Funzionalità avanzate}
@@ -3677,13 +3670,14 @@ dato che essa può solo assicurare che un segnale è stato inviato, dato che
 escluderne l'avvenuto invio al momento della chiamata non significa nulla
 rispetto a quanto potrebbe essere in un qualunque momento successivo.
 
+\itindbeg{stack} 
+
 Una delle caratteristiche di BSD, disponibile anche in Linux, è la possibilità
-di usare uno \itindex{stack} \textit{stack} alternativo per i segnali; è cioè
-possibile fare usare al sistema un altro \itindex{stack} \textit{stack}
-(invece di quello relativo al processo, vedi sez.~\ref{sec:proc_mem_layout})
-solo durante l'esecuzione di un gestore.  L'uso di uno \textit{stack}
-alternativo è del tutto trasparente ai gestori, occorre però seguire una certa
-procedura:
+di usare uno \textit{stack} alternativo per i segnali; è cioè possibile fare
+usare al sistema un altro \textit{stack} (invece di quello relativo al
+processo, vedi sez.~\ref{sec:proc_mem_layout}) solo durante l'esecuzione di un
+gestore.  L'uso di uno \textit{stack} alternativo è del tutto trasparente ai
+gestori, occorre però seguire una certa procedura:
 \begin{enumerate*}
 \item allocare un'area di memoria di dimensione sufficiente da usare come
   \textit{stack} alternativo;
@@ -3699,18 +3693,18 @@ In genere il primo passo viene effettuato allocando un'opportuna area di
 memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti,
 \const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per
 allocare una quantità di spazio opportuna, in modo da evitare overflow. La
-prima delle due è la dimensione canonica per uno \itindex{stack}
-\textit{stack} di segnali e di norma è sufficiente per tutti gli usi normali.
+prima delle due è la dimensione canonica per uno \textit{stack} di segnali e
+di norma è sufficiente per tutti gli usi normali.
 
 La seconda è lo spazio che occorre al sistema per essere in grado di lanciare
 il gestore e la dimensione di uno \textit{stack} alternativo deve essere
 sempre maggiore di questo valore. Quando si conosce esattamente quanto è lo
 spazio necessario al gestore gli si può aggiungere questo valore per allocare
-uno \itindex{stack} \textit{stack} di dimensione sufficiente.
+uno \textit{stack} di dimensione sufficiente.
 
-Come accennato, per poter essere usato, lo \itindex{stack} \textit{stack} per
-i segnali deve essere indicato al sistema attraverso la funzione
-\funcd{sigaltstack}; il suo prototipo è:
+Come accennato, per poter essere usato, lo \textit{stack} per i segnali deve
+essere indicato al sistema attraverso la funzione \funcd{sigaltstack}; il suo
+prototipo è:
 
 \begin{funcproto}{
 \fhead{signal.h}
@@ -3736,8 +3730,8 @@ i segnali deve essere indicato al sistema attraverso la funzione
 La funzione prende come argomenti puntatori ad una struttura di tipo
 \var{stack\_t}, definita in fig.~\ref{fig:sig_stack_t}. I due valori
 \param{ss} e \param{oss}, se non nulli, indicano rispettivamente il nuovo
-\itindex{stack} \textit{stack} da installare e quello corrente (che viene
-restituito dalla funzione per un successivo ripristino).
+\textit{stack} da installare e quello corrente (che viene restituito dalla
+funzione per un successivo ripristino).
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -3750,35 +3744,35 @@ restituito dalla funzione per un successivo ripristino).
 \end{figure}
 
 Il campo \var{ss\_sp} di \struct{stack\_t} indica l'indirizzo base dello
-\itindex{stack} \textit{stack}, mentre \var{ss\_size} ne indica la dimensione;
-il campo \var{ss\_flags} invece indica lo stato dello \textit{stack}.
-Nell'indicare un nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e
-\var{ss\_size} rispettivamente al puntatore e alla dimensione della memoria
-allocata, mentre \var{ss\_flags} deve essere nullo.  Se invece si vuole
-disabilitare uno \textit{stack} occorre indicare \const{SS\_DISABLE} come
-valore di \var{ss\_flags} e gli altri valori saranno ignorati.
+\textit{stack}, mentre \var{ss\_size} ne indica la dimensione; il campo
+\var{ss\_flags} invece indica lo stato dello \textit{stack}.  Nell'indicare un
+nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e \var{ss\_size}
+rispettivamente al puntatore e alla dimensione della memoria allocata, mentre
+\var{ss\_flags} deve essere nullo.  Se invece si vuole disabilitare uno
+\textit{stack} occorre indicare \const{SS\_DISABLE} come valore di
+\var{ss\_flags} e gli altri valori saranno ignorati.
 
 Se \param{oss} non è nullo verrà restituito dalla funzione indirizzo e
-dimensione dello \itindex{stack} \textit{stack} corrente nei relativi campi,
-mentre \var{ss\_flags} potrà assumere il valore \const{SS\_ONSTACK} se il
-processo è in esecuzione sullo \textit{stack} alternativo (nel qual caso non è
-possibile cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
-
-In genere si installa uno \itindex{stack} \textit{stack} alternativo per i
-segnali quando si teme di avere problemi di esaurimento dello \textit{stack}
-standard o di superamento di un limite (vedi
-sez.~\ref{sec:sys_resource_limit}) imposto con chiamate del tipo
-\code{setrlimit(RLIMIT\_STACK, \&rlim)}.  In tal caso infatti si avrebbe un
-segnale di \signal{SIGSEGV}, che potrebbe essere gestito soltanto avendo
-abilitato uno \itindex{stack} \textit{stack} alternativo.
+dimensione dello \textit{stack} corrente nei relativi campi, mentre
+\var{ss\_flags} potrà assumere il valore \const{SS\_ONSTACK} se il processo è
+in esecuzione sullo \textit{stack} alternativo (nel qual caso non è possibile
+cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
+
+In genere si installa uno \textit{stack} alternativo per i segnali quando si
+teme di avere problemi di esaurimento dello \textit{stack} standard o di
+superamento di un limite (vedi sez.~\ref{sec:sys_resource_limit}) imposto con
+chiamate del tipo \code{setrlimit(RLIMIT\_STACK, \&rlim)}.  In tal caso
+infatti si avrebbe un segnale di \signal{SIGSEGV}, che potrebbe essere gestito
+soltanto avendo abilitato uno \textit{stack} alternativo.
 
 Si tenga presente che le funzioni chiamate durante l'esecuzione sullo
 \textit{stack} alternativo continueranno ad usare quest'ultimo, che, al
-contrario di quanto avviene per lo \itindex{stack} \textit{stack} ordinario
-dei processi, non si accresce automaticamente (ed infatti eccederne le
-dimensioni può portare a conseguenze imprevedibili).  Si ricordi infine che
-una chiamata ad una funzione della famiglia \func{exec} cancella ogni
-\textit{stack} alternativo.
+contrario di quanto avviene per lo \textit{stack} ordinario dei processi, non
+si accresce automaticamente (ed infatti eccederne le dimensioni può portare a
+conseguenze imprevedibili).  Si ricordi infine che una chiamata ad una
+funzione della famiglia \func{exec} cancella ogni \textit{stack} alternativo.
+
+\itindend{stack} 
 
 Abbiamo visto in fig.~\ref{fig:sig_sleep_incomplete} come si possa usare
 \func{longjmp} per uscire da un gestore rientrando direttamente nel corpo
@@ -3815,19 +3809,17 @@ prototipi sono:
 \end{funcproto}
 
 Le due funzioni prendono come primo argomento la variabile su cui viene
-salvato il contesto dello \itindex{stack} \textit{stack} per permettere il
-\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. 
+salvato il contesto dello \textit{stack} per permettere il 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.
 
 Nel caso di \func{sigsetjmp}, se si specifica un valore di \param{savesigs}
 diverso da zero la maschera dei valori verrà salvata in \param{env} insieme al
-contesto dello \itindex{stack} \textit{stack} usato per il salto non
-locale. Se così si è fatto la maschera dei segnali verrà ripristinata in una
-successiva chiamata a \func{siglongjmp}. Quest'ultima, a parte l'uso di un
-valore di \param{env} di tipo \type{sigjmp\_buf}, è assolutamente identica a
-\func{longjmp}.
+contesto dello \textit{stack} usato per il salto non locale. Se così si è
+fatto la maschera dei segnali verrà ripristinata in una successiva chiamata a
+\func{siglongjmp}. Quest'ultima, a parte l'uso di un valore di \param{env} di
+tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
 
 
 % TODO: se e quando si troverà un argomento adeguato inserire altre funzioni