Sistemata la parte della allocazione della memoria, le variadic
[gapil.git] / prochand.tex
index 78ad88dc6a075976334798c187b67e4d38c74f03..5c526dfec4e17a394d79ef291303a8a759b25b5f 100644 (file)
@@ -136,9 +136,8 @@ struttura delle principali informazioni contenute nella \struct{task\_struct}
 (che in seguito incontreremo a più riprese), è mostrato in
 fig.~\ref{fig:proc_task_struct}.
 
 (che in seguito incontreremo a più riprese), è mostrato in
 fig.~\ref{fig:proc_task_struct}.
 
-\begin{figure}[htb]
-  \centering
-  \includegraphics[width=14cm]{img/task_struct}
+\begin{figure}[!htb]
+  \centering \includegraphics[width=14cm]{img/task_struct}
   \caption{Schema semplificato dell'architettura delle strutture usate dal
     kernel nella gestione dei processi.}
   \label{fig:proc_task_struct}
   \caption{Schema semplificato dell'architettura delle strutture usate dal
     kernel nella gestione dei processi.}
   \label{fig:proc_task_struct}
@@ -310,9 +309,9 @@ affrontato in dettaglio in sez.~\ref{sec:proc_perms}.
 La funzione \funcd{fork} è la funzione fondamentale della gestione dei
 processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
 processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
 La funzione \funcd{fork} è la funzione fondamentale della gestione dei
 processi: come si è detto tradizionalmente l'unico modo di creare un nuovo
 processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
-  system call usata più comunemente da Linux per creare nuovi processi è
-  \func{clone} (vedi \ref{sec:process_clone}) , anche perché a partire dalle
-  \acr{glibc} 2.3.3 non viene più usata la system call originale, ma la stessa
+  \textit{system call} usata da Linux per creare nuovi processi è \func{clone}
+  (vedi \ref{sec:process_clone}), anche perché a partire dalle \acr{glibc}
+  2.3.3 non viene più usata la \textit{system call} originale, ma la stessa
   \func{fork} viene implementata tramite \func{clone}, cosa che consente una
   migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
 centrale tutte le volte che si devono scrivere programmi che usano il
   \func{fork} viene implementata tramite \func{clone}, cosa che consente una
   migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
 centrale tutte le volte che si devono scrivere programmi che usano il
@@ -372,9 +371,9 @@ sempre un solo padre (il cui \acr{pid} può sempre essere ottenuto con
 \func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo,
 che non è il \acr{pid} di nessun processo.
 
 \func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo,
 che non è il \acr{pid} di nessun processo.
 
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
   \footnotesize \centering
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\codesamplewidth}
   \includecodesample{listati/ForkTest.c}
   \end{minipage}
   \normalsize
   \includecodesample{listati/ForkTest.c}
   \end{minipage}
   \normalsize
@@ -672,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;
   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*}
 
   qualora nel padre fosse stato modificato (vedi sez.~\ref{sec:process_clone}). 
 \end{itemize*}
 
@@ -693,8 +692,8 @@ venne introdotta in BSD per migliorare le prestazioni.
 
 Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la
 perdita di prestazioni è assolutamente trascurabile, e l'uso di questa
 
 Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la
 perdita di prestazioni è assolutamente trascurabile, e l'uso di questa
-funzione, che resta un caso speciale della system call \func{clone} (che
-tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per
+funzione, che resta un caso speciale della \textit{system call} \func{clone}
+(che tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per
 questo eviteremo di trattarla ulteriormente.
 
 
 questo eviteremo di trattarla ulteriormente.
 
 
@@ -718,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
 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
 
 Qualunque sia la modalità di conclusione di un processo, il kernel esegue
 comunque una serie di operazioni: chiude tutti i file aperti, rilascia la
@@ -729,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 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
   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
   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*}
 
   (vedi ancora sez.~\ref{sec:sess_ctrl_term}).
 \end{itemize*}
 
@@ -983,9 +982,9 @@ deve essere specificato come maschera binaria dei flag riportati nella prima
 parte in tab.~\ref{tab:proc_waitpid_options} che possono essere combinati fra
 loro con un OR aritmetico. Nella seconda parte della stessa tabella si sono
 riportati anche alcuni valori non standard specifici di Linux, che consentono
 parte in tab.~\ref{tab:proc_waitpid_options} che possono essere combinati fra
 loro con un OR aritmetico. Nella seconda parte della stessa tabella si sono
 riportati anche alcuni valori non standard specifici di Linux, che consentono
-un controllo più dettagliato per i processi creati con la system call generica
-\func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente per la
-gestione della terminazione dei \itindex{thread} \textit{thread} (vedi
+un controllo più dettagliato per i processi creati con la \textit{system call}
+generica \func{clone} (vedi sez.~\ref{sec:process_clone}) usati principalmente
+per la gestione della terminazione dei \itindex{thread} \textit{thread} (vedi
 sez.~\ref{sec:thread_xxx}).
 
 \begin{table}[!htb]
 sez.~\ref{sec:thread_xxx}).
 
 \begin{table}[!htb]
@@ -1002,9 +1001,10 @@ sez.~\ref{sec:thread_xxx}).
     \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
                         fermato ha ripreso l'esecuzione.\footnotemark \\
     \hline
     \const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
                         fermato ha ripreso l'esecuzione.\footnotemark \\
     \hline
-    \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone},
-                        vale a dire processi che non emettono nessun segnale
-                        o emettono un segnale diverso da \const{SIGCHL} alla
+    \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 \signal{SIGCHLD} alla
                         terminazione. \\
     \const{\_\_WALL}  & Attende per qualunque processo figlio. \\
     \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
                         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
   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
 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
 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.
 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}.}
 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
 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
 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
 
 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}.
 
 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
                              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 
     \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
 
 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à.
 
 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\_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},
 \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},
@@ -1455,9 +1455,8 @@ Le altre quattro funzioni si limitano invece a cercare di eseguire il file
 indicato dall'argomento \param{path}, che viene interpretato come il
 \itindex{pathname} \textit{pathname} del programma.
 
 indicato dall'argomento \param{path}, che viene interpretato come il
 \itindex{pathname} \textit{pathname} del programma.
 
-\begin{figure}[htb]
-  \centering
-  \includegraphics[width=12cm]{img/exec_rel}
+\begin{figure}[!htb]
+  \centering \includegraphics[width=12cm]{img/exec_rel}
   \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
   \label{fig:proc_exec_relat}
 \end{figure}
   \caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
   \label{fig:proc_exec_relat}
 \end{figure}
@@ -1522,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
 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
 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
@@ -1549,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;
   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*}
 \item l'ambiente viene reinizializzato impostando le variabili attinenti alla
   localizzazione al valore di default POSIX. 
 \end{itemize*}
@@ -2261,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
                                     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.\\
     \textbf{Zombie}\index{zombie} & \texttt{Z} & Il processo è terminato ma il
                                     suo stato di terminazione non è ancora
                                     stato letto dal padre.\\
@@ -2269,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ò
                                     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}
                                     lo più per NFS).\\ 
     \hline
   \end{tabular}
@@ -2693,9 +2692,9 @@ priorità statica da assegnare al processo; lo standard prevede che questo
 debba essere assegnato all'interno di un intervallo fra un massimo ed un
 minimo che nel caso di Linux sono rispettivamente 1 e 99.  
 
 debba essere assegnato all'interno di un intervallo fra un massimo ed un
 minimo che nel caso di Linux sono rispettivamente 1 e 99.  
 
-\begin{figure}[!bht]
+\begin{figure}[!htbp]
   \footnotesize \centering
   \footnotesize \centering
-  \begin{minipage}[c]{15cm}
+  \begin{minipage}[c]{\textwidth}
     \includestruct{listati/sched_param.c}
   \end{minipage} 
   \normalsize 
     \includestruct{listati/sched_param.c}
   \end{minipage} 
   \normalsize 
@@ -3003,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
 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
   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
@@ -3109,7 +3108,7 @@ di I/O.\footnote{se usate in corrispondenza ad uno scheduler diverso il loro
   utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia
 diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite
 la funzione \func{syscall} (come illustrato in
   utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia
 diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite
 la funzione \func{syscall} (come illustrato in
-sez.~\ref{sec:intro_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
+sez.~\ref{sec:proc_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
 \funcd{ioprio\_set}; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{linux/ioprio.h}
 \funcd{ioprio\_set}; i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{linux/ioprio.h}
@@ -3288,15 +3287,164 @@ Nelle precedenti sezioni si sono trattate la gran parte delle funzioni che
 attengono alla gestione ordinaria dei processi e delle loro proprietà più
 comuni. Tratteremo qui alcune \textit{system call} dedicate alla gestione di
 funzionalità dei processi molto specifiche ed avanzate, il cui uso è in genere
 attengono alla gestione ordinaria dei processi e delle loro proprietà più
 comuni. Tratteremo qui alcune \textit{system call} dedicate alla gestione di
 funzionalità dei processi molto specifiche ed avanzate, il cui uso è in genere
-piuttosto ridotto. Trattandosi di problematiche relativamente complesse, che
-spesso presuppongono la conoscenza di altri argomenti trattati più avanti
-nella guida, si può saltare questa lezione ad una prima lettura, tornando su
+piuttosto ridotto. Trattandosi di problematiche abbastanza complesse, che
+spesso presuppongono la conoscenza di altri argomenti trattati nel seguito
+della guida, si può saltare questa sezione in una prima lettura, tornando su
 di essa in un secondo tempo.
 
 \subsection{La system call \func{clone}}
 \label{sec:process_clone}
 
 di essa in un secondo tempo.
 
 \subsection{La system call \func{clone}}
 \label{sec:process_clone}
 
-Da fare
+La funzione tradizionale con cui creare un nuovo processo in un sistema
+Unix-like, come illustrato in sez.~\ref{sec:proc_fork}, è \func{fork}, ma con
+l'introduzione del supporto del kernel per i \textit{thread} (vedi
+cap.~\ref{cha:threads}), si è avuta la necessità di una interfaccia che
+consentisse un maggiore controllo sulla modalità con cui vengono creati nuovi
+processi, che poi è stata utilizzata anche per fornire supporto per le
+tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container}).
+
+Per questo l'interfaccia per la creazione di un nuovo processo è stata
+delegata ad una nuova \textit{system call}, \func{sys\_clone}, che consente di
+reimplementare anche la tradizionale \func{fork}. In realtà in questo caso più
+che di nuovi processi si può parlare della creazioni di nuovi
+``\textit{task}'' del kernel che possono assumere la veste sia di un processo
+classico come quelli trattati finora, che di un \textit{thread}, come quelli
+che vedremo in sez.~\ref{sec:linux_thread}, in cui la memoria viene condivisa
+fra il processo chiamante ed il nuovo processo creato. Per evitare confusione
+fra \textit{thread} e processi ordinari, abbiamo deciso di usare la
+nomenclatura \textit{task} per indicare la unità di esecuzione generica messa
+a disposizione del kernel che \texttt{sys\_clone} permette di creare.
+
+Oltre a questo la funzione consente, ad uso delle nuove funzionalità di
+virtualizzazione dei processi, di creare nuovi \textit{namespace} per una
+serie di proprietà generali dei processi (come l'elenco dei PID, l'albero dei
+file, dei \textit{mount point}, della rete, ecc.), che consentono di creare
+gruppi di processi che vivono in una sorta di spazio separato dagli altri, che
+costituisce poi quello che viene chiamato un \textit{container}.
+
+La \textit{system call} richiede soltanto due argomenti: il
+primo, \param{flags}, consente di controllare le modalità di creazione del
+nuovo \textit{task}, il secondo, \param{child\_stack}, imposta l'indirizzo
+dello \itindex{stack} \textit{stack} per il nuovo \textit{task}, e deve essere
+indicato quando si intende creare un \textit{thread}. L'esecuzione del
+programma creato da \func{sys\_clone} riprende, come per \func{fork}, da
+dopo l'esecuzione della stessa.
+
+La necessità di avere uno \itindex{stack} \textit{stack} alternativo c'è solo
+quando si intende creare un \textit{thread}, in tal caso infatti il nuovo
+\textit{task} vede esattamente la stessa memoria del \textit{task}
+``\textsl{padre}'',\footnote{in questo caso per padre si intende semplicemente
+  il \textit{task} che ha eseguito \func{sys\_clone} rispetto al \textit{task}
+  da essa creato, senza nessuna delle implicazioni che il concetto ha per i
+  processi.} e nella sua esecuzione alla prima chiamata di una funzione
+andrebbe a scrivere sullo \textit{stack} usato anche dal padre (si ricordi
+quanto visto in sez.~\ref{sec:proc_mem_layout} riguardo all'uso dello
+\textit{stack}).
+
+Per evitare di doversi garantire contro la evidente possibilità di
+\itindex{race~condition} \textit{race condition} che questa situazione
+comporta (vedi sez.~\ref{sec:proc_race_cond} per una spiegazione della
+problematica) è necessario che il chiamante allochi preventivamente un'area di
+memoria.  In genere lo si fa con una \func{malloc} che allochi un buffer che
+la funzione imposterà come \textit{stack} del nuovo processo, avendo
+ovviamente cura di non utilizzarlo direttamente nel processo chiamante. In
+questo modo i due \textit{task} avranno degli \textit{stack} indipendenti e
+non si dovranno affrontare problematiche di \itindex{race~condition}
+\textit{race condition}.  Si tenga presente inoltre che in molte architetture
+di processore lo \textit{stack} cresce verso il basso, pertanto in tal caso
+non si dovrà specificare per \param{child\_stack} il puntatore restituito da
+\func{malloc}, ma un puntatore alla fine del buffer da essa allocato.
+
+Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la
+memoria, la \textit{system call}, a differenza della funzione di libreria che
+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
+  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
+padre.
+
+Dato che l'uso principale della nuova \textit{system call} è quello relativo
+alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di
+libreria con una sintassi diversa, orientata a questo scopo, e la
+\textit{system call} resta accessibile solo se invocata esplicitamente come
+visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
+  \textit{system call} non è disponibile la chiamata veloce con
+  \texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
+\funcd{clone} ed il suo prototipo è:
+\begin{functions}
+  \headdecl{sys/sched.h}
+
+  \funcdecl{int clone(int (*fn)(void *), void *child\_stack, int
+    flags, void *arg, ...  \\
+    /* pid\_t *ptid, struct user\_desc *tls, pid\_t *ctid */)}
+  
+  Crea un nuovo processo o \textit{thread} eseguendo la funzione \param{fn}.
+  
+  \bodydesc{La funzione ritorna al chiamante il \textit{Thread ID} assegnato
+    al nuovo processo in caso di successo e $-1$ in caso di errore, nel qual
+    caso  \var{errno} può assumere i valori:
+    \begin{errlist}
+    \item[\errcode{EAGAIN}] sono già in esecuzione troppi processi.
+    \item[\errcode{EINVAL}] si è usata una combinazione non valida di flag o
+      un valore nullo per \param{child\_stack}.
+    \item[\errcode{ENOMEM}] non c'è memoria sufficiente per creare una nuova
+      \struct{task\_struct} o per copiare le parti del contesto del chiamante
+      necessarie al nuovo \textit{task}.
+    \item[\errcode{EPERM}] non si hanno i privilegi di amministratore
+      richiesti dai flag indicati.
+  \end{errlist} 
+ }
+\end{functions}
+
+La funzione prende come primo argomento il puntatore alla funzione che verrà
+messa in esecuzione nel nuovo processo, che può avere un unico argomento di
+tipo puntatore a \ctyp{void}, il cui valore viene passato dal terzo
+argomento \param{arg}; per quanto il precedente prototipo possa intimidire
+nella sua espressione, in realtà l'uso è molto semplice basterà definire una
+qualunque funzione \param{fn} del tipo indicato, e \code{fn(arg)} sarà
+eseguita in un nuovo processo.
+
+Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
+non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
+di ritorno della funzione (o quello specificato con \func{exit}) verrà
+utilizzato come stato di uscita della funzione.
+
+I tre argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
+presenti solo a partire dal kernel 2.6.
+
+Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
+nuovo processo da essa creato, è controllato dall'argomento \param{flags},
+
+\begin{basedescript}{\desclabelstyle{\pushlabel}}
+
+\item[\const{CLONE\_CHILD\_CLEARTID}]
+\item[\const{CLONE\_CHILD\_SETTID}]
+\item[\const{CLONE\_FILES}]
+\item[\const{CLONE\_FS}]
+\item[\const{CLONE\_IO}]
+\item[\const{CLONE\_NEWIPC}]
+\item[\const{CLONE\_NEWNET}]
+\item[\const{CLONE\_NEWNS}]
+\item[\const{CLONE\_NEWPID}]
+\item[\const{CLONE\_NEWUTS}]
+\item[\const{CLONE\_PARENT}]
+\item[\const{CLONE\_PARENT\_SETTID}]
+\item[\const{CLONE\_PID}]
+\item[\const{CLONE\_PTRACE}]
+\item[\const{CLONE\_SETTLS}]
+\item[\const{CLONE\_SIGHAND}]
+\item[\const{CLONE\_STOPPED}]
+\item[\const{CLONE\_SYSVSEM}]
+\item[\const{CLONE\_THREAD}]
+\item[\const{CLONE\_UNTRACED}]
+\item[\const{CLONE\_VFORK}]
+\item[\const{CLONE\_VM}]
+\end{basedescript}
+
 
 \subsection{La funzione \func{prctl}}
 \label{sec:process_prctl}
 
 \subsection{La funzione \func{prctl}}
 \label{sec:process_prctl}
@@ -3308,7 +3456,7 @@ la cui gestione è stata predisposta una apposita \textit{system call} che
 fornisce una interfaccia generica per tutte le operazioni specialistiche. La
 funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è
   standardizzata ed è specifica di Linux, anche se ne esiste una analoga in
 fornisce una interfaccia generica per tutte le operazioni specialistiche. La
 funzione è \funcd{prctl} ed il suo prototipo è:\footnote{la funzione non è
   standardizzata ed è specifica di Linux, anche se ne esiste una analoga in
-  IRIX, è stata introdotta con il kernel 2.1.57.}
+  IRIX; è stata introdotta con il kernel 2.1.57.}
 \begin{functions}
   \headdecl{sys/prctl.h}
 
 \begin{functions}
   \headdecl{sys/prctl.h}
 
@@ -3383,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
   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
   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
   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
@@ -3440,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
 \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.
   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.
@@ -3498,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
   \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.
   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.
@@ -3514,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
   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
   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
@@ -3527,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
     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
   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
@@ -3549,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
   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
   \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
@@ -3580,6 +3728,9 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 
 Da fare
 
 
 Da fare
 
+% TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
+
+
 \subsection{L'accesso alle porte di I/O}
 \label{sec:process_io_port}
 
 \subsection{L'accesso alle porte di I/O}
 \label{sec:process_io_port}
 
@@ -3730,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
 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
 
 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
@@ -3743,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
 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|)}
 
 
 \index{funzioni!rientranti|)}
 
@@ -3803,12 +3955,12 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
 % LocalWords:  completely fair compat uniform CFQ queuing elevator dev cfq RT
 % LocalWords:  documentation block syscall ioprio IPRIO CLASS class best effort
 % LocalWords:  SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
 % LocalWords:  completely fair compat uniform CFQ queuing elevator dev cfq RT
 % LocalWords:  documentation block syscall ioprio IPRIO CLASS class best effort
-% LocalWords:  refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL big
-% LocalWords:  WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian
-% LocalWords:  little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW
+% LocalWords:  refresh semop dnotify MADV DONTFORK prctl WCLONE WALL big
+% LocalWords:  WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian flags
+% LocalWords:  little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW malloc
 % LocalWords:  exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED
 % LocalWords:  exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED
-% LocalWords:  NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP
-% LocalWords:  secure computing sigreturn TIMING STATISTICAL TSC MCE
+% LocalWords:  NONRECOV ASYNC KEEP securebits NAME NUL PDEATHSIG SECCOMP VM
+% LocalWords:  secure computing sigreturn TIMING STATISTICAL TSC MCE conditions
 % LocalWords:  timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early
  
 %%% Local Variables: 
 % LocalWords:  timestamp Stamp SIGSEGV UNALIGN SIGBUS MCEERR AO failure early
  
 %%% Local Variables: