Sistemata la parte della allocazione della memoria, le variadic
[gapil.git] / prochand.tex
index 7e882abcd86f9ebdc60a8a247c572a1ebe8160e0..5c526dfec4e17a394d79ef291303a8a759b25b5f 100644 (file)
@@ -671,7 +671,7 @@ Le differenze fra padre e figlio dopo la \func{fork} invece sono:\footnote{a
   sez.~\ref{sec:file_memory_map}) che non vengono ereditate dal figlio;
 \item l'impostazione con \func{prctl} (vedi sez.~\ref{sec:process_prctl}) che
   notifica al figlio la terminazione del padre viene cancellata;
-\item il segnale di terminazione del figlio è sempre \const{SIGCHLD} anche
+\item il segnale di terminazione del figlio è sempre \signal{SIGCHLD} anche
   qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}). 
 \end{itemize*}
 
@@ -717,7 +717,7 @@ modalità di conclusione anomala; queste sono in sostanza due: il programma può
 chiamare la funzione \func{abort} per invocare una chiusura anomala, o essere
 terminato da un segnale (torneremo sui segnali in cap.~\ref{cha:signals}).  In
 realtà anche la prima modalità si riconduce alla seconda, dato che
-\func{abort} si limita a generare il segnale \const{SIGABRT}.
+\func{abort} si limita a generare il segnale \signal{SIGABRT}.
 
 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
@@ -728,15 +728,15 @@ eseguite alla chiusura di un processo è il seguente:
 \item viene memorizzato lo stato di terminazione del processo;
 \item ad ogni processo figlio viene assegnato un nuovo padre (in genere
   \cmd{init});
-\item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi
+\item viene inviato il segnale \signal{SIGCHLD} al processo padre (vedi
   sez.~\ref{sec:sig_sigchld});
 \item se il processo è un leader di sessione ed il suo terminale di controllo
-  è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i
+  è quello della sessione viene mandato un segnale di \signal{SIGHUP} a tutti i
   processi del gruppo di \textit{foreground} e il terminale di controllo viene
   disconnesso (vedi sez.~\ref{sec:sess_ctrl_term});
 \item se la conclusione di un processo rende orfano un \textit{process
     group} ciascun membro del gruppo viene bloccato, e poi gli vengono
-  inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT}
+  inviati in successione i segnali \signal{SIGHUP} e \signal{SIGCONT}
   (vedi ancora sez.~\ref{sec:sess_ctrl_term}).
 \end{itemize*}
 
@@ -1004,7 +1004,7 @@ sez.~\ref{sec:thread_xxx}).
     \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} 
                         (vedi sez.~\ref{sec:process_clone}), vale a dire
                         processi che non emettono nessun segnale 
-                        o emettono un segnale diverso da \const{SIGCHLD} alla
+                        o emettono un segnale diverso da \signal{SIGCHLD} alla
                         terminazione. \\
     \const{\_\_WALL}  & Attende per qualunque processo figlio. \\
     \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
@@ -1038,7 +1038,7 @@ quando un processo figlio entra nello stato \textit{stopped}\footnote{in
   sez.~\ref{sec:process_ptrace}).} (vedi tab.~\ref{tab:proc_proc_states}),
 mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato
 \textit{stopped} riprende l'esecuzione per la ricezione del segnale
-\const{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
+\signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
 dettagliato in sez.~\ref{sec:sess_ctrl_term}).
 
 La terminazione di un processo figlio (così come gli altri eventi osservabili
@@ -1046,7 +1046,7 @@ con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione
 di un programma e può avvenire in un qualunque momento. Per questo motivo,
 come accennato nella sezione precedente, una delle azioni prese dal kernel
 alla conclusione di un processo è quella di mandare un segnale di
-\const{SIGCHLD} al padre. L'azione predefinita (si veda
+\signal{SIGCHLD} al padre. L'azione predefinita (si veda
 sez.~\ref{sec:sig_base}) per questo segnale è di essere ignorato, ma la sua
 generazione costituisce il meccanismo di comunicazione asincrona con cui il
 kernel avverte il processo padre che uno dei suoi figli è terminato.
@@ -1055,7 +1055,7 @@ Il comportamento delle funzioni è però cambiato nel passaggio dal kernel 2.4
 al kernel 2.6, quest'ultimo infatti si è adeguato alle prescrizioni dello
 standard POSIX.1-2001,\footnote{una revisione del 2001 dello standard POSIX.1
   che ha aggiunto dei requisiti e delle nuove funzioni, come \func{waitid}.}
-e come da esso richiesto se \const{SIGCHLD} viene ignorato, o se si imposta il
+e come da esso richiesto se \signal{SIGCHLD} viene ignorato, o se si imposta il
 flag di \const{SA\_NOCLDSTOP} nella ricezione dello stesso (si veda
 sez.~\ref{sec:sig_sigaction}) i processi figli che terminano non diventano
 \textit{zombie} e sia \func{wait} che \func{waitpid} si bloccano fintanto che
@@ -1063,13 +1063,13 @@ tutti i processi figli non sono terminati, dopo di che falliscono con un
 errore di \errcode{ENOCHLD}.\footnote{questo è anche il motivo per cui le
   opzioni \const{WUNTRACED} e \const{WCONTINUED} sono utilizzabili soltanto
   qualora non si sia impostato il flag di \const{SA\_NOCLDSTOP} per il segnale
-  \const{SIGCHLD}.}
+  \signal{SIGCHLD}.}
 
 Con i kernel della serie 2.4 e tutti i kernel delle serie precedenti entrambe
 le funzioni di attesa ignorano questa prescrizione\footnote{lo standard POSIX.1
   originale infatti lascia indefinito il comportamento di queste funzioni
-  quando \const{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso
-modo, indipendentemente dal fatto \const{SIGCHLD} sia ignorato o meno:
+  quando \signal{SIGCHLD} viene ignorato.} e si comportano sempre nello stesso
+modo, indipendentemente dal fatto \signal{SIGCHLD} sia ignorato o meno:
 attendono la terminazione di un processo figlio e ritornano il relativo
 \acr{pid} e lo stato di terminazione nell'argomento \param{status}.
 
@@ -1112,7 +1112,7 @@ attendono la terminazione di un processo figlio e ritornano il relativo
                              nullo. \\ 
     \macro{WIFCONTINUED(s)}& Vera se il processo che ha causato il ritorno è
                              stato riavviato da un
-                             \const{SIGCONT}.\footnotemark  \\ 
+                             \signal{SIGCONT}.\footnotemark  \\ 
     \hline
   \end{tabular}
   \caption{Descrizione delle varie macro di preprocessore utilizzabili per 
@@ -1134,7 +1134,7 @@ la presenza di \index{zombie} \textit{zombie}).
 
 Per questo la modalità più comune di chiamare queste funzioni è quella di
 utilizzarle all'interno di un \textit{signal handler} (vedremo un esempio di
-come gestire \const{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In
+come gestire \signal{SIGCHLD} con i segnali in sez.~\ref{sec:sig_example}). In
 questo caso infatti, dato che il segnale è generato dalla terminazione di un
 figlio, avremo la certezza che la chiamata a \func{waitpid} non si bloccherà.
 
@@ -1276,7 +1276,7 @@ campi:
 \item[\var{si\_pid}] con il \acr{pid} del figlio.
 \item[\var{si\_uid}] con l'user-ID reale (vedi sez.~\ref{sec:proc_perms}) del
   figlio.
-\item[\var{si\_signo}] con \const{SIGCHLD}.
+\item[\var{si\_signo}] con \signal{SIGCHLD}.
 \item[\var{si\_status}] con lo stato di uscita del figlio o con il segnale che
   lo ha terminato, fermato o riavviato.
 \item[\var{si\_code}] con uno fra \const{CLD\_EXITED}, \const{CLD\_KILLED},
@@ -1521,7 +1521,7 @@ I segnali che sono stati impostati per essere ignorati nel processo chiamante
 mantengono la stessa impostazione pure nel nuovo programma, ma tutti gli altri
 segnali, ed in particolare quelli per i quali è stato installato un gestore
 vengono impostati alla loro azione predefinita (vedi
-sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \const{SIGCHLD}
+sez.~\ref{sec:sig_gen_beha}). Un caso speciale è il segnale \signal{SIGCHLD}
 che, quando impostato a \const{SIG\_IGN}, potrebbe anche essere reimpostato a
 \const{SIG\_DFL}, anche se questo con Linux non avviene.\footnote{lo standard
   POSIX.1-2001 prevede che questo comportamento sia deciso dalla singola
@@ -1548,7 +1548,7 @@ nell'esecuzione della funzione \func{exec}, queste sono:
   sez.~\ref{sec:process_prctl}) viene cancellato;
 \item il nome del processo viene impostato al nome del file contenente il
   programma messo in esecuzione;
-\item il segnale di terminazione viene reimpostato a \const{SIGCHLD};
+\item il segnale di terminazione viene reimpostato a \signal{SIGCHLD};
 \item l'ambiente viene reinizializzato impostando le variabili attinenti alla
   localizzazione al valore di default POSIX. 
 \end{itemize*}
@@ -2260,7 +2260,7 @@ fintanto che esso si trova in uno qualunque degli altri stati.
                                     genere per I/O), e non può essere
                                     interrotto in nessuna circostanza.\\
     \textbf{Stopped} & \texttt{T} & Il processo è stato fermato con un
-                                    \const{SIGSTOP}, o è tracciato.\\
+                                    \signal{SIGSTOP}, o è tracciato.\\
     \textbf{Zombie}\index{zombie} & \texttt{Z} & Il processo è terminato ma il
                                     suo stato di terminazione non è ancora
                                     stato letto dal padre.\\
@@ -2268,7 +2268,7 @@ fintanto che esso si trova in uno qualunque degli altri stati.
                                     2.6.25, sostanzialmente identico
                                     all'\textbf{Uninterrutible Sleep} con la
                                     sola differenza che il processo può
-                                    terminato con \const{SIGKILL} (usato per
+                                    terminato con \signal{SIGKILL} (usato per
                                     lo più per NFS).\\ 
     \hline
   \end{tabular}
@@ -3002,7 +3002,7 @@ nell'evitare la perdita della cache da rendere conveniente l'uso dell'affinità
 di processore.
 
 Per facilitare l'uso dell'argomento \param{cpuset} le \acr{glibc} hanno
-introdotto un apposito dato di tipo, \ctyp{cpu\_set\_t},\footnote{questa è una
+introdotto un apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una
   estensione specifica delle \acr{glibc}, da attivare definendo la macro
   \macro{\_GNU\_SOURCE}, non esiste infatti una standardizzazione per
   questo tipo di interfaccia e POSIX al momento non prevede nulla al
@@ -3361,7 +3361,7 @@ vedremo a breve, consente anche di passare per \param{child\_stack} il valore
 \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un
 processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è
   sottinteso cioè che non si stia usando il flag \const{CLONE\_VM}.} ed in
-questo caso si applica la semantica del \itindex{copy-on-write} \textit{copy
+questo caso si applica la semantica del \itindex{copy~on~write} \textit{copy
   on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le pagine dello
 \textit{stack} verranno automaticamente copiate come le altre e il nuovo
 processo avrà un suo \textit{stack} totalmente indipendente da quello del
@@ -3531,14 +3531,14 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   PowerPC.
 \item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianess} del
   processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
-  essere passata come di tipo \type{(int *)}. Introdotta a partire dal kernel
+  essere passata come di tipo \ctyp{(int *)}. Introdotta a partire dal kernel
   2.6.18, solo su PowerPC.
 \item[\const{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione
   della virgola mobile su architettura ia64, secondo il valore
   di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in
   maniera trasparente l'accesso alle operazioni in virgola mobile, o
   \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
-  \const{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
+  \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
   dal kernel 2.4.18, solo su ia64.
 \item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
   dell'emulazione della virgola mobile, salvato all'indirizzo puntato
@@ -3588,7 +3588,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 \item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
   segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
   terminazione del proprio processo padre; in sostanza consente di invertire
-  il ruolo di \const{SIGCHLD}. Il valore di \param{arg2} deve indicare il
+  il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
   numero del segnale, o 0 per disabilitare l'emissione. Il valore viene
   automaticamente cancellato per un processo figlio creato con \func{fork}.
   Introdotta a partire dal kernel 2.1.57.
@@ -3646,7 +3646,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   \textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
   valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per
   abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la
-  generazione di un segnale di \const{SIGSEGV} (vedi
+  generazione di un segnale di \signal{SIGSEGV} (vedi
   sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
   disabilitata se si attiva il \textit{secure computing mode}.  Introdotta a
   partire dal kernel 2.6.26, solo su x86.
@@ -3662,7 +3662,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
   valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
   ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di
-  \const{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
+  \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
   allineato.  Introdotta con diverse versioni su diverse architetture.
 \item[\const{PR\_GET\_UNALIGN}] Ottiene il valore della modalità di controllo
   per l'accesso a indirizzi di memoria non allineati, salvato all'indirizzo
@@ -3675,7 +3675,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
     piattaforme più avanzate che hanno il supporto hardware per questo tipo di
     controlli.} ma devono essere opportunamente riportati ai processi che
   usano quella parte di RAM che presenta errori; nel caso specifico questo
-  avviene attraverso l'emissione di un segnale di \const{SIGBUS} (vedi
+  avviene attraverso l'emissione di un segnale di \signal{SIGBUS} (vedi
   sez.~\ref{sec:sig_prog_error}).\footnote{in particolare viene anche
     impostato il valore di \var{si\_code} in \struct{siginfo\_t} a
     \const{BUS\_MCEERR\_AO}; per il significato di tutto questo si faccia
@@ -3697,7 +3697,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   due, che corrispondono anche al valore che si trova nell'impostazione
   generale di sistema di \texttt{memory\_failure\_early\_kill}, con
   \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
-  \const{SIGBUS} non appena viene rilevato un errore, mentre con
+  \signal{SIGBUS} non appena viene rilevato un errore, mentre con
   \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
   tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
   rispettivamente ai valori 1 e 0 di
@@ -3881,7 +3881,8 @@ queste infatti vengono allocate nello \itindex{stack} \textit{stack}, ed
 un'altra invocazione non fa altro che allocarne un'altra copia. Una funzione
 può non essere rientrante quando opera su memoria che non è nello
 \itindex{stack} \textit{stack}.  Ad esempio una funzione non è mai rientrante
-se usa una variabile globale o statica.
+se usa una \index{variabili!globali} variabile globale o
+\index{variabili!statiche} statica.
 
 Nel caso invece la funzione operi su un oggetto allocato dinamicamente, la
 cosa viene a dipendere da come avvengono le operazioni: se l'oggetto è creato
@@ -3894,12 +3895,12 @@ se viene passato lo stesso oggetto; in tutti questi casi occorre molta cura da
 parte del programmatore.
 
 In genere le funzioni di libreria non sono rientranti, molte di esse ad
-esempio utilizzano variabili statiche, le \acr{glibc} però mettono a
-disposizione due macro di compilatore,\footnote{si ricordi quanto illustrato
-  in sez.~\ref{sec:intro_gcc_glibc_std}.} \macro{\_REENTRANT} e
-\macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di
-varie funzioni di libreria, che sono identificate aggiungendo il suffisso
-\code{\_r} al nome della versione normale.
+esempio utilizzano \index{variabili!statiche} variabili statiche, le
+\acr{glibc} però mettono a disposizione due macro di compilatore,\footnote{si
+  ricordi quanto illustrato in sez.~\ref{sec:intro_gcc_glibc_std}.}
+\macro{\_REENTRANT} e \macro{\_THREAD\_SAFE}, la cui definizione attiva le
+versioni rientranti di varie funzioni di libreria, che sono identificate
+aggiungendo il suffisso \code{\_r} al nome della versione normale.
 
 \index{funzioni!rientranti|)}