Ulteriori revisioni, finita l'introduzione con vari spostamenti e
[gapil.git] / prochand.tex
index e3aa1e0152cf5cbf79b658f9f78bd5ecad1c940a..7e882abcd86f9ebdc60a8a247c572a1ebe8160e0 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
@@ -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.
 
 
@@ -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 \const{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}
@@ -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}
@@ -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 
@@ -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}
@@ -3307,8 +3455,8 @@ proprietà e caratteristiche particolari dei processi non coperte da esse, per
 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 è
 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 esiete una analoga in
-  IRIX, è stata introdotta con il kernel 2.1.57.}
+  standardizzata ed è specifica di Linux, anche se ne esiste una analoga in
+  IRIX; è stata introdotta con il kernel 2.1.57.}
 \begin{functions}
   \headdecl{sys/prctl.h}
 
 \begin{functions}
   \headdecl{sys/prctl.h}
 
@@ -3345,10 +3493,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   nell'argomento \param{arg2} con una delle costanti di
   tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
   processo. L'operazione richiede i privilegi di amministratore (la capacità
   nell'argomento \param{arg2} con una delle costanti di
   tab.~\ref{tab:proc_capabilities} dal \textit{capabilities bounding set} del
   processo. L'operazione richiede i privilegi di amministratore (la capacità
-  \const{CAP\_SETPCAP}), altrimenti fallisce con un errore di \errval{EPERM};
-  se il valore di \param{arg2} non è valido o se il supporto per le
-  \textit{file capabilities} non è stato compilato nel kernel fallisce con un
-  errore di \errval{EINVAL}. Introdotta a partire dal kernel 2.6.25.
+  \const{CAP\_SETPCAP}), altrimenti la chiamata fallirà con un errore di
+  \errval{EPERM}; se il valore di \param{arg2} non è valido o se il supporto
+  per le \textit{file capabilities} non è stato compilato nel kernel la
+  chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal
+  kernel 2.6.25.
 \item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
   terminazione di un processo a causa di un segnale per il quale è prevista la
   generazione di un file di \itindex{core~dump} \textit{core dump} (vedi
 \item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
   terminazione di un processo a causa di un segnale per il quale è prevista la
   generazione di un file di \itindex{core~dump} \textit{core dump} (vedi
@@ -3389,7 +3538,8 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   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
   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}. Introdotta a partire dal kernel 2.4.18, solo su ia64.
+  \const{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
   da \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
 \item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
   dell'emulazione della virgola mobile, salvato all'indirizzo puntato
   da \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
@@ -3402,10 +3552,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   per gli underflow, \const{PR\_FP\_EXC\_RES} per risultati non esatti,
   \const{PR\_FP\_EXC\_INV} per operazioni invalide,
   \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
   per gli underflow, \const{PR\_FP\_EXC\_RES} per risultati non esatti,
   \const{PR\_FP\_EXC\_INV} per operazioni invalide,
   \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
-  \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccesione
+  \const{PR\_FP\_EXC\_NONRECOV} per utilizzare la modalità di eccezione
   asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la
   asincrona non recuperabile, \const{PR\_FP\_EXC\_ASYNC} per utilizzare la
-  modalità di eccesione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE}
-  per la modalita precisa di eccezione.\footnote{trattasi di gestione
+  modalità di eccezione asincrona recuperabile, \const{PR\_FP\_EXC\_PRECISE}
+  per la modalità precisa di eccezione.\footnote{trattasi di gestione
     specialistica della gestione delle eccezioni dei calcoli in virgola mobile
     che, i cui dettagli al momento vanno al di là dello scopo di questo
     testo.} Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
     specialistica della gestione delle eccezioni dei calcoli in virgola mobile
     che, i cui dettagli al momento vanno al di là dello scopo di questo
     testo.} Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
@@ -3419,10 +3569,10 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
   pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
   per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
   pag.~\pageref{sec:capability-uid-transition}). Un valore nullo (il default)
   per \param{arg2} comporta che vengano cancellate, il valore 1 che vengano
-  manenute, questo valore viene sempre cancellato attraverso una
-  \func{exec}. L'uso di questo flag è stato sostituito, a partire dal kernel
-  2.6.26, dal flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits}
-  \textit{securebits} (vedi \const{PR\_SET\_SECUREBITS}). Introdotta a partire
+  mantenute, questo valore viene sempre cancellato attraverso una \func{exec}.
+  L'uso di questo flag è stato sostituito, a partire dal kernel 2.6.26, dal
+  flag \const{SECURE\_KEEP\_CAPS} dei \itindex{securebits} \textit{securebits}
+  (vedi l'uso di \const{PR\_SET\_SECUREBITS} più avanti). Introdotta a partire
   dal kernel 2.2.18.
 \item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
   il valore del flag di controllo impostato con
   dal kernel 2.2.18.
 \item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
   il valore del flag di controllo impostato con
@@ -3437,11 +3587,11 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   se più corto. Introdotta a partire dal kernel 2.6.9.
 \item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
   segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
   se più corto. Introdotta a partire dal kernel 2.6.9.
 \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.\footnote{in sostanza consente di
-    invertire il ruolo di \const{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.
+  terminazione del proprio processo padre; in sostanza consente di invertire
+  il ruolo di \const{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.
 \item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
   emesso alla terminazione del padre, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
 \item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
   emesso alla terminazione del padre, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
@@ -3453,15 +3603,16 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   processo potrà utilizzare soltanto un insieme estremamente limitato di
   \textit{system call}: \func{read}, \func{write}, \func{\_exit} e
   \func{sigreturn}, ogni altra \textit{system call} porterà all'emissione di
   processo potrà utilizzare soltanto un insieme estremamente limitato di
   \textit{system call}: \func{read}, \func{write}, \func{\_exit} e
   \func{sigreturn}, ogni altra \textit{system call} porterà all'emissione di
-  un \func{SIGKILL}.  Il \textit{secure computing mode} è stato ideato per
-  fornire un supporto per l'esecuzione di codice esterno non fidato e non
-  verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter vendere
-    la capacità di calcolo della proprio macchina ad un qualche servizio di
-    calcolo distribuito senza comprometterne la sicurezza eseguendo codice non
-    sotto il proprio controllo.} in genere i dati vengono letti o scritti
-  grazie ad un socket o una pipe, e per evitare problemi di sicurezza non sono
-  possibili altre operazioni se non quelle citate.  Introdotta a partire dal
-  kernel 2.6.23, disponibile solo se si è abilitato il supporto nel kernel con
+  un \func{SIGKILL} (vedi sez.~\ref{sec:sig_termination}).  Il \textit{secure
+    computing mode} è stato ideato per fornire un supporto per l'esecuzione di
+  codice esterno non fidato e non verificabile a scopo di calcolo;\footnote{lo
+    scopo è quello di poter vendere la capacità di calcolo della proprio
+    macchina ad un qualche servizio di calcolo distribuito senza
+    comprometterne la sicurezza eseguendo codice non sotto il proprio
+    controllo.} in genere i dati vengono letti o scritti grazie ad un socket o
+  una pipe, e per evitare problemi di sicurezza non sono possibili altre
+  operazioni se non quelle citate.  Introdotta a partire dal kernel 2.6.23,
+  disponibile solo se si è abilitato il supporto nel kernel con
   \texttt{CONFIG\_SECCOMP}.
 \item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
   lo stato corrente del \textit{secure computing mode}, al momento attuale la
   \texttt{CONFIG\_SECCOMP}.
 \item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
   lo stato corrente del \textit{secure computing mode}, al momento attuale la
@@ -3470,10 +3621,13 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
   comporterebbe l'emissione di \texttt{SIGKILL}, è stata comunque definita per
   eventuali estensioni future.  Introdotta a partire dal kernel 2.6.23.
 \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits}
   comporterebbe l'emissione di \texttt{SIGKILL}, è stata comunque definita per
   eventuali estensioni future.  Introdotta a partire dal kernel 2.6.23.
 \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits}
-  \textit{securebits} per il processo corrente al valore indicato
-  da \param{arg2}; per i dettagli si veda sez.~\ref{sec:proc_capabilities}, ed
-  in particolare i valori di tab.~\ref{tab:securebits_values} e la relativa
-  trattazione. Introdotta a partire dal kernel 2.6.26.
+  \textit{securebits} per il processo chiamante al valore indicato
+  da \param{arg2}; per i dettagli sul significato dei \textit{securebits} si
+  veda sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
+  tab.~\ref{tab:securebits_values} e la relativa trattazione. L'operazione
+  richiede i privilegi di amministratore (la capacità \const{CAP\_SETPCAP}),
+  altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
+  partire dal kernel 2.6.26.
 \item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
   funzione l'impostazione corrente per i \itindex{securebits}
   \textit{securebits}. Introdotta a partire dal kernel 2.6.26.
 \item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
   funzione l'impostazione corrente per i \itindex{securebits}
   \textit{securebits}. Introdotta a partire dal kernel 2.6.26.
@@ -3487,16 +3641,17 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 \item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
   il metodo di temporizzazione del processo attualmente in uso. Introdotta a
   partire dal kernel 2.6.0-test4.
 \item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
   il metodo di temporizzazione del processo attualmente in uso. Introdotta a
   partire dal kernel 2.6.0-test4.
-\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo può
-  leggere il registro di processore contenente il contatore dei
+\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo
+  chiamante può leggere il registro di processore contenente il contatore dei
   \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}. La lettura viene
-  automaticamente disabilitata se si attiva il \textit{secure computing mode}.
-  Introdotta a partire dal kernel 2.6.26, solo su x86.
+  generazione di un segnale di \const{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.
 \item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
 \item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
-  lettura del contatatore dei \textit{timestamp}, salvato all'indirizzo
+  lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
   partire dal kernel 2.6.26, solo su x86.
 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta a
   partire dal kernel 2.6.26, solo su x86.
 % articoli sul TSC e relativi problemi: http://lwn.net/Articles/209101/,
@@ -3504,17 +3659,64 @@ predefinite del seguente elenco, che illustra quelle disponibili al momento:
 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
 \item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
   a indirizzi di memoria non allineati, che in varie architetture risultano
 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
 \item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
   a indirizzi di memoria non allineati, che in varie architetture risultano
-  illegali, da indicare con il valore di \param{arg2}. Si deve specificare
-  \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati, e
-  \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di \const{SIGBUS} in
-  caso di accesso non allineato.  Introdotta con diverse versioni su diverse
-  architetture.
+  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
+  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
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. 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
   puntato \param{arg2}, che deve essere di tipo \code{(int *)}. Introdotta con
   diverse versioni su diverse architetture.
-\item[\const{PR\_MCE\_KILL}] Introdotta a partire dal kernel 2.6.32.
-\item[\const{PR\_MCE\_KILL\_GET}] Introdotta a partire dal kernel 2.6.32.
+\item[\const{PR\_MCE\_KILL}] Imposta la politica di gestione degli errori
+  dovuti a corruzione della memoria per problemi hardware. Questo tipo di
+  errori vengono riportati dall'hardware di controllo della RAM e vengono
+  gestiti dal kernel,\footnote{la funzionalità è disponibile solo sulle
+    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
+  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
+    riferimento alla trattazione di sez.~\ref{sec:sig_sigaction}.}
+
+  Il comportamento di default prevede che per tutti i processi si applichi la
+  politica generale di sistema definita nel file
+  \procfile{/proc/sys/vm/memory\_failure\_early\_kill}, ma specificando
+  per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare
+  con il contenuto di \param{arg3} una politica specifica del processo
+  chiamante. Si può tornare alla politica di default del sistema utilizzando
+  invece per \param{arg2} il valore \const{PR\_MCE\_KILL\_CLEAR}. In tutti i
+  casi, per compatibilità con eventuali estensioni future, tutti i valori
+  degli argomenti non utilizzati devono essere esplicitamente posti a zero,
+  pena il fallimento della chiamata con un errore di \errval{EINVAL}.
+  
+  In caso di impostazione di una politica specifica del processo con
+  \const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
+  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
+  \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
+  \texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
+    viene immediatamente inviato il segnale a tutti i processi che hanno la
+    memoria corrotta mappata all'interno del loro spazio degli indirizzi, nel
+    secondo caso prima la pagina di memoria viene tolta dallo spazio degli
+    indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
+    processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
+  terzo valore, \const{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
+  per il processo la politica di default.\footnote{si presume la politica di
+    default corrente, in modo da non essere influenzati da un eventuale
+    successivo cambiamento della stessa.} Introdotta a partire dal kernel
+  2.6.32.
+\item[\const{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
+  funzione la politica di gestione degli errori dovuti a corruzione della
+  memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
+  nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
+  partire dal kernel 2.6.32.
 \label{sec:prctl_operation}
 \end{basedescript}
 
 \label{sec:prctl_operation}
 \end{basedescript}
 
@@ -3526,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}
 
@@ -3747,10 +3952,15 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  CONTINUED sources forking Spawned successfully executing exiting
 % LocalWords:  next cat for COMMAND pts bash defunct TRAPPED DUMPED Killable PR
 % LocalWords:  SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
 % LocalWords:  CONTINUED sources forking Spawned successfully executing exiting
 % LocalWords:  next cat for COMMAND pts bash defunct TRAPPED DUMPED Killable PR
 % 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
-% LocalWords:  WNOTHREAD DUMPABLE KEEPCAPS
+% 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 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:  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: 
 %%% mode: latex
  
 %%% Local Variables: 
 %%% mode: latex