Ancora revisione
[gapil.git] / prochand.tex
index a16a9ae22e9977b8b81f2ea51e5ab0ea779f57c9..1d8cadb7b573fd9b383d674bc7ade2975034a054 100644 (file)
@@ -1,6 +1,6 @@
 %% prochand.tex
 %%
-%% Copyright (C) 2000-2015 by Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2018 by Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -39,12 +39,12 @@ terminazione dei processi, e per la messa in esecuzione degli altri programmi.
 \subsection{L'architettura della gestione dei processi}
 \label{sec:proc_hierarchy}
 
-A differenza di quanto avviene in altri sistemi, ad esempio nel VMS la
+A differenza di quanto avviene in altri sistemi, ad esempio nel VMS, dove la
 generazione di nuovi processi è un'operazione privilegiata, una delle
 caratteristiche fondanti di Unix, che esamineremo in dettaglio più avanti, è
 che qualunque processo può a sua volta generarne altri. Ogni processo è
 identificato presso il sistema da un numero univoco, il cosiddetto
-\textit{Process ID} o, più brevemente, \ids{PID}, assegnato in forma
+\textit{Process ID}, o più brevemente \ids{PID}, assegnato in forma
 progressiva (vedi sez.~\ref{sec:proc_pid}) quando il processo viene creato.
 
 Una seconda caratteristica di un sistema unix-like è che la generazione di un
@@ -57,16 +57,16 @@ indichiamo nella linea di comando.
 Una terza caratteristica del sistema è che ogni processo è sempre stato
 generato da un altro processo, il processo generato viene chiamato
 \textit{processo figlio} (\textit{child process}) mentre quello che lo ha
-viene chiamato \textsl{processo padre} (\textit{parent process}). Questo vale
-per tutti i processi, con una sola eccezione, dato che ci deve essere un punto
-di partenza esiste un processo speciale (che normalmente è \cmd{/sbin/init}),
-che come abbiamo accennato in sez.~\ref{sec:intro_kern_and_sys} viene lanciato
-dal kernel alla conclusione della fase di avvio. Essendo questo il primo
-processo lanciato dal sistema ha sempre il \ids{PID} uguale a 1 e non è figlio
-di nessun altro processo.
-
-Ovviamente \cmd{init} è un processo speciale che in genere si occupa di far
-partire tutti gli altri processi necessari al funzionamento del sistema,
+generato viene chiamato \textsl{processo padre} (\textit{parent
+  process}). Questo vale per tutti i processi, con una sola eccezione; dato
+che ci deve essere un punto di partenza esiste un processo iniziale (che
+normalmente è \cmd{/sbin/init}), che come accennato in
+sez.~\ref{sec:intro_kern_and_sys} viene lanciato dal kernel alla conclusione
+della fase di avvio. Essendo questo il primo processo lanciato dal sistema ha
+sempre \ids{PID} uguale a 1 e non è figlio di nessun altro processo.
+
+Ovviamente \cmd{init} è un processo particolare che in genere si occupa di
+lanciare tutti gli altri processi necessari al funzionamento del sistema,
 inoltre \cmd{init} è essenziale per svolgere una serie di compiti
 amministrativi nelle operazioni ordinarie del sistema (torneremo su alcuni di
 essi in sez.~\ref{sec:proc_termination}) e non può mai essere terminato. La
@@ -138,15 +138,16 @@ Il kernel mantiene una tabella dei processi attivi, la cosiddetta
 questa tabella, costituita da una struttura \kstruct{task\_struct}, che
 contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture
 usate a questo scopo sono dichiarate nell'\textit{header file}
-\file{linux/sched.h}, ed uno schema semplificato, che riporta la struttura
-delle principali informazioni contenute nella \struct{task\_struct} (che in
-seguito incontreremo a più riprese), è mostrato in
-fig.~\ref{fig:proc_task_struct}.
+\file{linux/sched.h}, ed in fig.~\ref{fig:proc_task_struct} si è riportato uno
+schema semplificato che mostra la struttura delle principali informazioni
+contenute nella \texttt{task\_struct}, che in seguito incontreremo a più
+riprese.
 
 \begin{figure}[!htb]
   \centering \includegraphics[width=14cm]{img/task_struct}
-  \caption{Schema semplificato dell'architettura delle strutture usate dal
-    kernel nella gestione dei processi.}
+  \caption{Schema semplificato dell'architettura delle strutture (
+    \kstructd{task\_struct}, \kstructd{fs\_struct}, \kstructd{file\_struct})
+    usate dal kernel nella gestione dei processi.}
   \label{fig:proc_task_struct}
 \end{figure}
 
@@ -178,7 +179,7 @@ su macchine che non stanno facendo nulla, con un forte risparmio nell'uso
 dell'energia da parte del processore che può essere messo in stato di
 sospensione anche per lunghi periodi di tempo.
 
-Indipendentemente dalle motivazioni per cui questo avviene, ogni volta che
+Ma, indipendentemente dalle motivazioni per cui questo avviene, ogni volta che
 viene eseguito lo \textit{scheduler} effettua il calcolo delle priorità dei
 vari processi attivi (torneremo su questo in sez.~\ref{sec:proc_priority}) e
 stabilisce quale di essi debba essere posto in esecuzione fino alla successiva
@@ -193,7 +194,7 @@ invocazione.
 
 Come accennato nella sezione precedente ogni processo viene identificato dal
 sistema da un numero identificativo univoco, il \textit{process ID} o
-\ids{PID}. Questo è un tipo di dato standard, \type{pid\_t} che in genere è un
+\ids{PID}. Questo è un tipo di dato standard, \type{pid\_t}, che in genere è un
 intero con segno (nel caso di Linux e della \acr{glibc} il tipo usato è
 \ctyp{int}).
 
@@ -206,10 +207,10 @@ tradizionalmente il \ids{PID} un numero positivo memorizzato in un intero a 16
 bit, arriva ad un massimo di 32768.  Oltre questo valore l'assegnazione
 riparte dal numero più basso disponibile a partire da un minimo di
 300,\footnote{questi valori, fino al kernel 2.4.x, erano definiti dalla macro
-  \const{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del
+  \constd{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del
   kernel, con il 2.6.x e la nuova interfaccia per i \textit{thread} anche il
   meccanismo di allocazione dei \ids{PID} è stato modificato ed il valore
-  massimo è impostabile attraverso il file \sysctlfile{kernel/pid\_max} e di
+  massimo è impostabile attraverso il file \sysctlfiled{kernel/pid\_max} e di
   default vale 32768.} che serve a riservare i \ids{PID} più bassi ai processi
 eseguiti direttamente dal kernel.  Per questo motivo, come visto in
 sez.~\ref{sec:proc_hierarchy}, il processo di avvio (\cmd{init}) ha sempre il
@@ -271,7 +272,7 @@ sez.~\ref{sec:proc_perms}.
 \subsection{La funzione \func{fork} e le funzioni di creazione dei processi}
 \label{sec:proc_fork}
 
-La funzione di sistema \funcd{fork} è la funzione fondamentale della gestione
+La funzione di sistema \func{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
   \textit{system call} usata da Linux per creare nuovi processi è \func{clone}
@@ -281,18 +282,19 @@ processo era attraverso l'uso di questa funzione,\footnote{in realtà oggi la
   migliore interazione coi \textit{thread}.} essa quindi riveste un ruolo
 centrale tutte le volte che si devono scrivere programmi che usano il
 multitasking.\footnote{oggi questa rilevanza, con la diffusione dell'uso dei
-  \textit{thread} che tratteremo al cap.~\ref{cha:threads}, è in parte minore,
-  ma \func{fork} resta comunque la funzione principale per la creazione di
-  processi.} Il prototipo della funzione è:
+  \textit{thread}\unavref{ che tratteremo al cap.~\ref{cha:threads}}, è in
+  parte minore, ma \func{fork} resta comunque la funzione principale per la
+  creazione di processi.} Il prototipo di \funcd{fork} è:
 
 \begin{funcproto}{ 
 \fhead{unistd.h}
 \fdecl{pid\_t fork(void)}
 \fdesc{Crea un nuovo processo.} 
 }
-{La funzione ritorna il \ids{PID} del figlio al padre e $0$ al figlio in caso 
-  di successo e $-1$ al padre senza creare il figlio per un errore,
-  nel qual caso \var{errno} assumerà uno dei valori: 
+
+{La funzione ritorna in caso di successo il \ids{PID} del figlio nel padre e
+  $0$ nel figlio mentre ritorna $-1$ nel padre, senza creare il figlio, per un
+  errore, al caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \item[\errcode{EAGAIN}] non ci sono risorse sufficienti per creare un altro
     processo (per allocare la tabella delle pagine e le strutture del task) o
@@ -303,7 +305,7 @@ multitasking.\footnote{oggi questa rilevanza, con la diffusione dell'uso dei
 \end{funcproto}
 
 Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che
-il processo figlio continuano ad essere eseguiti normalmente a partire
+il processo figlio continuano ad essere eseguiti normalmente, a partire
 dall'istruzione successiva alla \func{fork}. Il processo figlio è una copia
 del padre, e riceve una copia dei segmenti di testo, dati e dello
 \textit{stack} (vedi sez.~\ref{sec:proc_mem_layout}), ed esegue esattamente lo
@@ -333,11 +335,11 @@ eseguito dal padre o dal figlio.  Si noti come la funzione \func{fork} ritorni
 due volte, una nel padre e una nel figlio.
 
 La scelta di questi valori di ritorno non è casuale, un processo infatti può
-avere più figli, ed il valore di ritorno di \func{fork} è l'unico modo che gli
-permette di identificare quello appena creato. Al contrario un figlio ha
-sempre un solo padre, il cui \ids{PID} può sempre essere ottenuto con
-\func{getppid}, come spiegato in sez.~\ref{sec:proc_pid}, per cui si usa il
-valore nullo, che non è il \ids{PID} di nessun processo.
+avere più figli, ed il valore di ritorno di \func{fork} è l'unico che gli
+permette di identificare qual è quello appena creato. Al contrario un figlio
+ha sempre un solo padre il cui \ids{PID}, come spiegato in
+sez.~\ref{sec:proc_pid}, può sempre essere ottenuto con \func{getppid}; per
+questo si ritorna un valore nullo, che non è il \ids{PID} di nessun processo.
 
 Normalmente la chiamata a \func{fork} può fallire solo per due ragioni: o ci
 sono già troppi processi nel sistema, il che di solito è sintomo che
@@ -352,7 +354,7 @@ ne esegue un'altra. È il caso tipico dei programmi server (il modello
 \textit{client-server} è illustrato in sez.~\ref{sec:net_cliserv}) in cui il
 padre riceve ed accetta le richieste da parte dei programmi client, per
 ciascuna delle quali pone in esecuzione un figlio che è incaricato di fornire
-il servizio.
+le risposte associate al servizio.
 
 La seconda modalità è quella in cui il processo vuole eseguire un altro
 programma; questo è ad esempio il caso della shell. In questo caso il processo
@@ -392,8 +394,8 @@ degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione
 \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la
 descrizione delle opzioni). Il codice completo, compresa la parte che gestisce
 le opzioni a riga di comando, è disponibile nel file \file{fork\_test.c},
-distribuito insieme agli altri sorgenti degli esempi su
-\url{http://gapil.truelite.it/gapil_source.tgz}.
+distribuito insieme agli altri sorgenti degli esempi della guida su
+\url{http://gapil.gnulinux.it}.
 
 Decifrato il numero di figli da creare, il ciclo principale del programma
 (\texttt{\small 24-40}) esegue in successione la creazione dei processi figli
@@ -459,36 +461,36 @@ In realtà con l'introduzione dei kernel della serie 2.6 lo \textit{scheduler}
   risultati precedenti infatti sono stati ottenuti usando un kernel della
   serie 2.4.}  Questa è una ottimizzazione adottata per evitare che il padre,
 effettuando per primo una operazione di scrittura in memoria, attivasse il
-meccanismo del \textit{copy on write}, operazione inutile qualora il figlio
-venga creato solo per eseguire una \func{exec} su altro programma che scarta
-completamente lo spazio degli indirizzi e rende superflua la copia della
-memoria modificata dal padre. Eseguendo sempre per primo il figlio la
-\func{exec} verrebbe effettuata subito, con la certezza di utilizzare
+meccanismo del \textit{copy on write}, operazione inutile quando il figlio
+viene creato solo per eseguire una \func{exec} per lanciare un altro programma
+che scarta completamente lo spazio degli indirizzi e rende superflua la copia
+della memoria modificata dal padre. Eseguendo sempre per primo il figlio la
+\func{exec} verrebbe effettuata subito, con la certezza di utilizzare il
 \textit{copy on write} solo quando necessario.
 
 Con il kernel 2.6.32 però il comportamento è stato nuovamente cambiato,
 stavolta facendo eseguire per primo sempre il padre. Si è realizzato infatti
-che l'eventualità prospettata per la scelta precedente era comunque molto
-improbabile, mentre l'esecuzione immediata del padre presenta sempre il
+che l'eventualità prospettata per la scelta precedente era comunque poco
+probabile, mentre l'esecuzione immediata del padre presenta sempre il
 vantaggio di poter utilizzare immediatamente tutti i dati che sono nella cache
-della CPU e nella unità di gestione della memoria virtuale senza doverli
+della CPU e nell'unità di gestione della memoria virtuale, senza doverli
 invalidare, cosa che per i processori moderni, che hanno linee di cache
 interne molto profonde, avrebbe un forte impatto sulle prestazioni.
 
 Allora anche se quanto detto in precedenza vale come comportamento effettivo
 dei programmi soltanto per i kernel fino alla serie 2.4, per mantenere la
 portabilità con altri kernel unix-like, e con i diversi comportamenti adottati
-dalle Linux nelle versioni successive, è opportuno non fare affidamento su
-nessun tipo comportamento predefinito e non dare per assunta l'esecuzione
-preventiva del padre o del figlio.
-
-Si noti poi come dopo la \func{fork}, essendo i segmenti di memoria utilizzati
-dai singoli processi completamente indipendenti, le modifiche delle variabili
-nei processi figli, come l'incremento di \var{i} in (\texttt{\small 31}), sono
-visibili solo a loro, (ogni processo vede solo la propria copia della
-memoria), e non hanno alcun effetto sul valore che le stesse variabili hanno
-nel processo padre ed in eventuali altri processi figli che eseguano lo stesso
-codice.
+dalle Linux nella sua evoluzione, è comunque opportuno non fare affidamento su
+nessun tipo di comportamento predefinito e non fare assunzioni sull'ordine di 
+esecuzione di padre e figlio.
+
+Si noti infine come dopo la \func{fork}, essendo i segmenti di memoria
+utilizzati dai singoli processi completamente indipendenti, le modifiche delle
+variabili nei processi figli, come l'incremento di \var{i} in (\texttt{\small
+  31}), sono visibili solo a loro, (ogni processo vede solo la propria copia
+della memoria), e non hanno alcun effetto sul valore che le stesse variabili
+hanno nel processo padre ed in eventuali altri processi figli che eseguano lo
+stesso codice.
 
 Un secondo aspetto molto importante nella creazione dei processi figli è
 quello dell'interazione dei vari processi con i file. Ne parleremo qui anche
@@ -527,15 +529,15 @@ che come si vede è completamente diverso da quanto ottenevamo sul terminale.
 Il comportamento delle varie funzioni di interfaccia con i file è analizzato
 in gran dettaglio in sez.~\ref{sec:file_unix_interface} per l'interfaccia
 nativa Unix ed in sez.~\ref{sec:files_std_interface} per la standardizzazione
-adottata nelle librerie del linguaggio C e valida per qualunque sistema
-operativo. 
+adottata nelle librerie del linguaggio C, valida per qualunque sistema
+operativo.
 
 Qui basta accennare che si sono usate le funzioni standard della libreria del
 C che prevedono l'output bufferizzato. Il punto è che questa bufferizzazione
 (che tratteremo in dettaglio in sez.~\ref{sec:file_buffering}) varia a seconda
 che si tratti di un file su disco, in cui il buffer viene scaricato su disco
 solo quando necessario, o di un terminale, in cui il buffer viene scaricato ad
-ogni carattere di a capo.
+ogni carattere di ``a capo''.
 
 Nel primo esempio allora avevamo che, essendovi un a capo nella stringa
 stampata, ad ogni chiamata a \func{printf} il buffer veniva scaricato, per cui
@@ -565,19 +567,19 @@ viene rediretto come si è fatto nell'esempio, lo stesso avviene anche per
 tutti i figli. La funzione \func{fork} infatti ha la caratteristica di
 duplicare nei processi figli tutti i \textit{file descriptor} (vedi
 sez.~\ref{sec:file_fd}) dei file aperti nel processo padre (allo stesso modo
-in cui lo fa la funzione \func{dup}, trattata in sez.~\ref{sec:file_dup}), il
-che comporta che padre e figli condividono le stesse voci della \textit{file
-  table} (tratteremo in dettaglio questi termini in sez.~\ref{sec:file_fd} e
-sez.~\ref{sec:file_shared_access}) fra cui c'è anche la posizione corrente nel
-file.
-
-In questo modo se un processo scrive su un file aggiornerà la posizione
-corrente sulla \textit{file table}, e tutti gli altri processi, che vedono la
-stessa \textit{file table}, vedranno il nuovo valore. In questo modo si evita,
-in casi come quello appena mostrato in cui diversi processi scrivono sullo
-stesso file, che l'output successivo di un processo vada a sovrapporsi a
-quello dei precedenti: l'output potrà risultare mescolato, ma non ci saranno
-parti perdute per via di una sovrascrittura.
+in cui lo fa la funzione \func{dup}, trattata in sez.~\ref{sec:file_dup}). Ciò
+fa si che padre e figli condividano le stesse voci della \textit{file table}
+(tratteremo in dettaglio questi termini in sez.~\ref{sec:file_fd} e
+sez.~\ref{sec:file_shared_access}) fra le quali c'è anche la posizione
+corrente nel file.
+
+Quando un processo scrive su un file la posizione corrente viene aggiornata
+sulla \textit{file table}, e tutti gli altri processi, che vedono la stessa
+\textit{file table}, vedranno il nuovo valore. In questo modo si evita, in
+casi come quello appena mostrato in cui diversi processi scrivono sullo stesso
+file, che l'output di un processo successivo vada a sovrapporsi a quello dei
+precedenti: l'output potrà risultare mescolato, ma non ci saranno parti
+perdute per via di una sovrascrittura.
 
 Questo tipo di comportamento è essenziale in tutti quei casi in cui il padre
 crea un figlio e attende la sua conclusione per proseguire, ed entrambi
@@ -999,12 +1001,12 @@ sono riportate anche le costanti definite per indicare alcuni di essi.
     $<-1$& --               & Attende per un figlio il cui \textit{process
                               group} (vedi sez.~\ref{sec:sess_proc_group}) è
                               uguale al valore assoluto di \param{pid}.\\ 
-    $-1$&\const{WAIT\_ANY}  & Attende per un figlio qualsiasi, usata in
-                              questa maniera senza specificare nessuna opzione
-                              è equivalente a \func{wait}.\\ 
-    $ 0$&\const{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process
+    $-1$&\constd{WAIT\_ANY}  & Attende per un figlio qualsiasi, usata in
+                               questa maniera senza specificare nessuna opzione
+                               è equivalente a \func{wait}.\\ 
+    $ 0$&\constd{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process
                                group} (vedi sez.~\ref{sec:sess_proc_group}) è
-                              uguale a quello del processo chiamante.\\ 
+                                uguale a quello del processo chiamante.\\ 
     $>0$& --                & Attende per un figlio il cui \ids{PID} è uguale
                               al valore di \param{pid}.\\
     \hline
@@ -1042,17 +1044,17 @@ sez.~\ref{sec:thread_xxx}).
                         fermato ha ripreso l'esecuzione (disponibile solo a
                         partire dal kernel 2.6.10).\\
     \hline
-    \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone} 
+    \constd{\_\_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, il default è attendere soltanto i
                         processi figli ordinari ignorando quelli creati da
                         \func{clone}.\\
-    \const{\_\_WALL}  & Attende per qualunque figlio, sia ordinario che creato
+    \constd{\_\_WALL}  & Attende per qualunque figlio, sia ordinario che creato
                         con  \func{clone}, se specificata insieme a
                         \const{\_\_WCLONE} quest'ultima viene ignorata. \\
-    \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
+    \constd{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
                         dello stesso \textit{thread group}, questo era il
                         comportamento di default del kernel 2.4 che non
                         supportava la possibilità, divenuta il default a
@@ -1065,6 +1067,7 @@ sez.~\ref{sec:thread_xxx}).
   \label{tab:proc_waitpid_options}
 \end{table}
 
+\constbeg{WNOHANG}
 
 L'uso dell'opzione \const{WNOHANG} consente di prevenire il blocco della
 funzione qualora nessun figlio sia uscito o non si siano verificate le altre
@@ -1072,6 +1075,10 @@ condizioni per l'uscita della funzione. in tal caso. In tal caso la funzione,
 invece di restituire il \ids{PID} del processo (che è sempre un intero
 positivo) ritornerà un valore nullo.
 
+\constend{WNOHANG}
+\constbeg{WUNTRACED}
+\constbeg{WCONTINUED}
+
 Le altre due opzioni, \const{WUNTRACED} e \const{WCONTINUED}, consentono
 rispettivamente di tracciare non la terminazione di un processo, ma il fatto
 che esso sia stato fermato, o fatto ripartire, e sono utilizzate per la
@@ -1088,6 +1095,9 @@ mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato
 \signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
 trattato in sez.~\ref{sec:sess_ctrl_term}).
 
+\constend{WUNTRACED}
+\constend{WCONTINUED}
+
 La terminazione di un processo figlio (così come gli altri eventi osservabili
 con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione
 di un programma e può avvenire in un qualunque momento. Per questo motivo,
@@ -1148,40 +1158,40 @@ ecc.\footnote{le definizioni esatte si possono trovare in
     \textbf{Macro} & \textbf{Descrizione}\\
     \hline
     \hline
-    \macro{WIFEXITED}\texttt{(s)}   & Condizione vera (valore non nullo) per
+    \macrod{WIFEXITED}\texttt{(s)}   & Condizione vera (valore non nullo) per
                                       un processo figlio che sia terminato
                                       normalmente. \\ 
-    \macro{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno
+    \macrod{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno
                                       significativi dello stato di uscita del
                                       processo (passato attraverso
                                       \func{\_exit}, \func{exit} o come valore
                                       di ritorno di \code{main}); può essere
                                       valutata solo se \val{WIFEXITED} ha
                                       restituito un valore non nullo.\\ 
-    \macro{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è
+    \macrod{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è
                                       terminato in maniera anomala a causa di
                                       un segnale che non è stato catturato
                                       (vedi sez.~\ref{sec:sig_notification}).\\ 
-    \macro{WTERMSIG}\texttt{(s)}    & Restituisce il numero del segnale che ha
+    \macrod{WTERMSIG}\texttt{(s)}    & Restituisce il numero del segnale che ha
                                       causato la terminazione anomala del
                                       processo; può essere valutata solo se
                                       \val{WIFSIGNALED} ha restituito un
                                       valore non nullo.\\
-    \macro{WCOREDUMP}\texttt{(s)}   & Vera se il processo terminato ha
+    \macrod{WCOREDUMP}\texttt{(s)}   & Vera se il processo terminato ha
                                       generato un file di 
                                       \textit{core dump}; può essere valutata
                                       solo se \val{WIFSIGNALED} ha restituito
                                       un valore non nullo.\footnotemark \\
-    \macro{WIFSTOPPED}\texttt{(s)}  & Vera se il processo che ha causato il
+    \macrod{WIFSTOPPED}\texttt{(s)}  & Vera se il processo che ha causato il
                                       ritorno di \func{waitpid} è bloccato;
                                       l'uso è possibile solo con
                                       \func{waitpid} avendo specificato
                                       l'opzione \const{WUNTRACED}.\\
-    \macro{WSTOPSIG}\texttt{(s)}    & Restituisce il numero del segnale che ha
+    \macrod{WSTOPSIG}\texttt{(s)}    & Restituisce il numero del segnale che ha
                                       bloccato il processo; può essere
                                       valutata solo se \val{WIFSTOPPED} ha
                                       restituito un valore non nullo. \\ 
-    \macro{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il
+    \macrod{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il
                                       ritorno è stato riavviato da un
                                       \signal{SIGCONT} (disponibile solo a
                                       partire dal kernel 2.6.10).\\
@@ -1249,16 +1259,16 @@ primo, quale processo o quale gruppo di processi selezionare.
     \textbf{Valore} & \textbf{Descrizione}\\
     \hline
     \hline
-    \const{P\_PID} & Indica la richiesta di attendere per un processo figlio
-                     il cui \ids{PID} corrisponda al valore dell'argomento
-                     \param{id}.\\
-    \const{P\_PGID}& Indica la richiesta di attendere per un processo figlio
-                     appartenente al \textit{process group} (vedi
-                     sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid}
-                     corrisponda al valore dell'argomento \param{id}.\\
-    \const{P\_ALL} & Indica la richiesta di attendere per un processo figlio
-                     generico, il valore dell'argomento \param{id} viene
-                     ignorato.\\
+    \constd{P\_PID} & Indica la richiesta di attendere per un processo figlio
+                      il cui \ids{PID} corrisponda al valore dell'argomento
+                      \param{id}.\\
+    \constd{P\_PGID}& Indica la richiesta di attendere per un processo figlio
+                      appartenente al \textit{process group} (vedi
+                      sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid}
+                      corrisponda al valore dell'argomento \param{id}.\\
+    \constd{P\_ALL} & Indica la richiesta di attendere per un processo figlio
+                      generico, il valore dell'argomento \param{id} viene
+                      ignorato.\\
     \hline
   \end{tabular}
   \caption{Costanti per i valori dell'argomento \param{idtype} della funzione
@@ -1286,15 +1296,15 @@ nuovo riceverne lo stato.
     \textbf{Valore} & \textbf{Descrizione}\\
     \hline
     \hline
-    \const{WEXITED}   & Ritorna quando un processo figlio è terminato.\\
-    \const{WNOHANG}   & Ritorna immediatamente anche se non c'è niente da
-                        notificare.\\ 
-    \const{WSTOPPED} &  Ritorna quando un processo figlio è stato fermato.\\
-    \const{WCONTINUED}& Ritorna quando un processo figlio che era stato
-                        fermato ha ripreso l'esecuzione.\\
-    \const{WNOWAIT}   & Lascia il processo ancora in attesa di ricezione, così
-                        che una successiva chiamata possa di nuovo riceverne
-                        lo stato.\\
+    \constd{WEXITED}   & Ritorna quando un processo figlio è terminato.\\
+    \constd{WNOHANG}   & Ritorna immediatamente anche se non c'è niente da
+                         notificare.\\ 
+    \constd{WSTOPPED}  & Ritorna quando un processo figlio è stato fermato.\\
+    \const{WCONTINUED} & Ritorna quando un processo figlio che era stato
+                         fermato ha ripreso l'esecuzione.\\
+    \constd{WNOWAIT}   & Lascia il processo ancora in attesa di ricezione, così
+                         che una successiva chiamata possa di nuovo riceverne
+                         lo stato.\\
     \hline
   \end{tabular}
   \caption{Costanti che identificano i bit dell'argomento \param{options}
@@ -1316,7 +1326,7 @@ Tratteremo nei dettagli la struttura \struct{siginfo\_t} ed il significato dei
 suoi vari campi in sez.~\ref{sec:sig_sigaction}, per quanto ci interessa qui
 basta dire che al ritorno di \func{waitid} verranno avvalorati i seguenti
 campi:
-\begin{basedescript}{\desclabelwidth{2.0cm}}
+\begin{basedescript}{\desclabelwidth{1.8cm}}
 \item[\var{si\_pid}] con il \ids{PID} del figlio.
 \item[\var{si\_uid}] con l'\textsl{user-ID reale} (vedi
   sez.~\ref{sec:proc_perms}) del figlio.
@@ -1402,7 +1412,7 @@ prototipo è:
     \cmd{noexec}, o manca  il permesso di attraversamento di una delle
     directory del \textit{pathname}.
   \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento
-    \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un
+    \const{PT\_INTERP}, cioè chiede di essere eseguito da più di un
     interprete.
   \item[\errcode{ELIBBAD}] un interprete ELF non è in un formato
     riconoscibile.
@@ -1664,9 +1674,9 @@ del programma per caricare le librerie necessarie ed effettuare il link
 dell'eseguibile; il formato è ormai in completo disuso, per cui è molto
 probabile che non il relativo supporto non sia disponibile. Se il programma è
 in formato ELF per caricare le librerie dinamiche viene usato l'interprete
-indicato nel segmento \const{PT\_INTERP} previsto dal formato stesso, in
-genere questo è \sysfile{/lib/ld-linux.so.1} per programmi collegati con la
-\acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi collegati con la
+indicato nel segmento \constd{PT\_INTERP} previsto dal formato stesso, in
+genere questo è \sysfiled{/lib/ld-linux.so.1} per programmi collegati con la
+\acr{libc5}, e \sysfiled{/lib/ld-linux.so.2} per programmi collegati con la
 \acr{glibc}.
 
 Infine nel caso il programma che si vuole eseguire sia uno script e non un
@@ -1685,7 +1695,7 @@ lunghezza massima di 127 caratteri e se questa dimensione viene ecceduta la
 stringa viene troncata; altri Unix hanno dimensioni massime diverse, e diversi
 comportamenti, ad esempio FreeBSD esegue la scansione della riga e la divide
 nei vari argomenti e se è troppo lunga restituisce un errore di
-\const{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi
+\errval{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi
 sistemi unix-like si trova su
 \url{http://www.in-ulm.de/~mascheck/various/shebang/}.
 
@@ -1851,7 +1861,7 @@ servano di nuovo.
 
 Questo in Linux viene fatto usando altri due gruppi di identificatori, il
 \textit{saved} ed il \textit{filesystem}. Il primo gruppo è lo stesso usato in
-SVr4, e previsto dallo standard POSIX quando è definita la costante
+SVr4, e previsto dallo standard POSIX quando è definita
 \macro{\_POSIX\_SAVED\_IDS},\footnote{in caso si abbia a cuore la portabilità
   del programma su altri Unix è buona norma controllare sempre la
   disponibilità di queste funzioni controllando se questa costante è
@@ -1922,11 +1932,11 @@ dell'utente che ha lanciato il programma, effettuare il lavoro che non
 necessita di privilegi aggiuntivi, ed eventualmente tornare indietro.
 
 Come esempio per chiarire l'uso di queste funzioni prendiamo quello con cui
-viene gestito l'accesso al file \sysfile{/var/run/utmp}.  In questo file viene
+viene gestito l'accesso al file \sysfiled{/var/run/utmp}.  In questo file viene
 registrato chi sta usando il sistema al momento corrente; chiaramente non può
 essere lasciato aperto in scrittura a qualunque utente, che potrebbe
 falsificare la registrazione. Per questo motivo questo file (e l'analogo
-\sysfile{/var/log/wtmp} su cui vengono registrati login e logout) appartengono
+\sysfiled{/var/log/wtmp} su cui vengono registrati login e logout) appartengono
 ad un gruppo dedicato (in genere \acr{utmp}) ed i programmi che devono
 accedervi (ad esempio tutti i programmi di terminale in X, o il programma
 \cmd{screen} che crea terminali multipli su una console) appartengono a questo
@@ -2133,10 +2143,10 @@ si ottengono i privilegi necessari per accedere ai file, mantenendo quelli
 originari per quanto riguarda tutti gli altri controlli di accesso, così che
 l'utente non possa inviare segnali al server NFS.
 
-Le due funzioni di sistema usate per cambiare questi identificatori sono
-\funcd{setfsuid} e \funcd{setfsgid}, ed ovviamente sono specifiche di Linux e
-non devono essere usate se si intendono scrivere programmi portabili; i loro
-prototipi sono:
+Le due funzioni di sistema usate appositamente per cambiare questi
+identificatori sono \funcd{setfsuid} e \funcd{setfsgid} ovviamente sono
+specifiche di Linux e non devono essere usate se si intendono scrivere
+programmi portabili; i loro prototipi sono:
 
 \begin{funcproto}{ 
 \fhead{sys/fsuid.h}
@@ -2165,7 +2175,7 @@ gruppi supplementari cui un utente può appartenere. Ogni processo può avere
 almeno \const{NGROUPS\_MAX} gruppi supplementari\footnote{il numero massimo di
   gruppi secondari può essere ottenuto con \func{sysconf} (vedi
   sez.~\ref{sec:sys_limits}), leggendo il parametro
-  \texttt{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono
+  \const{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono
 ereditati dal processo padre e possono essere cambiati con queste funzioni.
 
 La funzione di sistema che permette di leggere i gruppi supplementari
@@ -2223,7 +2233,7 @@ dimensioni adeguate.
 Infine per impostare i gruppi supplementari di un processo ci sono due
 funzioni, che possono essere usate solo se si hanno i privilegi di
 amministratore.\footnote{e più precisamente se si ha la \textit{capability}
-  \macro{CAP\_SETGID}.} La prima delle due è la funzione di sistema
+  \const{CAP\_SETGID}.} La prima delle due è la funzione di sistema
 \funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a
   differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per
   poterla utilizzare deve essere definita la macro \macro{\_BSD\_SOURCE}.} ed
@@ -2272,13 +2282,12 @@ caso \var{errno} assumerà uno dei valori:
 La funzione esegue la scansione del database dei gruppi (usualmente
 \conffile{/etc/group}) cercando i gruppi di cui è membro l'utente \param{user}
 (di nuovo specificato per nome e non per \ids{UID}) con cui costruisce una
-lista di gruppi supplementari, a cui aggiunge anche
-\param{group}, infine imposta questa lista per il processo corrente usando
-\func{setgroups}.  Si tenga presente che sia \func{setgroups} che
-\func{initgroups} non sono definite nello standard POSIX.1 e che pertanto non
-è possibile utilizzarle quando si definisce \macro{\_POSIX\_SOURCE} o si
-compila con il flag \cmd{-ansi}, è pertanto meglio evitarle se si vuole
-scrivere codice portabile.
+lista di gruppi supplementari, a cui aggiunge anche \param{group}, infine
+imposta questa lista per il processo corrente usando \func{setgroups}.  Si
+tenga presente che sia \func{setgroups} che \func{initgroups} non sono
+definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle
+quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag
+\cmd{-ansi}, è pertanto meglio evitarle se si vuole scrivere codice portabile.
 
  
 \section{La gestione della priorità dei processi}
@@ -2502,6 +2511,9 @@ processo corrente, il suo prototipo è:
 \end{errlist}}
 \end{funcproto}
 
+\constbeg{PRIO\_MIN}
+\constbeg{PRIO\_MAX}
+
 L'argomento \param{inc} indica l'incremento da effettuare rispetto al valore
 di \textit{nice} corrente, che può assumere valori compresi fra
 \const{PRIO\_MIN} e \const{PRIO\_MAX}; nel caso di Linux sono fra $-20$ e
@@ -2519,6 +2531,9 @@ priorità di un processo, a partire da questa versione è consentito anche agli
 utenti normali alzare (entro certi limiti, che vedremo in
 sez.~\ref{sec:sys_resource_limit}) la priorità dei propri processi.
 
+\constend{PRIO\_MIN}
+\constend{PRIO\_MAX}
+
 Gli standard SUSv2 e POSIX.1 prevedono che la funzione ritorni il nuovo valore
 di \textit{nice} del processo; tuttavia la \textit{system call} di Linux non
 segue questa convenzione e restituisce sempre $0$ in caso di successo e $-1$
@@ -2563,7 +2578,7 @@ La funzione permette, a seconda di quanto specificato
 nell'argomento \param{which}, di leggere il valore di \textit{nice} di un
 processo, di un gruppo di processi (vedi sez.~\ref{sec:sess_proc_group}) o di
 un utente indicato dall'argomento \param{who}. Nelle vecchie versioni può
-essere necessario includere anche \headfile{sys/time.h}, questo non è più
+essere necessario includere anche \headfiled{sys/time.h}, questo non è più
 necessario con versioni recenti delle librerie, ma è comunque utile per
 portabilità.
 
@@ -2582,10 +2597,10 @@ l'utente correnti.
     \param{which} & \param{who} & \textbf{Significato} \\
     \hline
     \hline
-    \const{PRIO\_PROCESS} & \type{pid\_t} & processo  \\
-    \const{PRIO\_PRGR}    & \type{pid\_t} & \textit{process group} (vedi
-                                            sez.~\ref{sec:sess_proc_group})\\
-    \const{PRIO\_USER}    & \type{uid\_t} & utente \\
+    \constd{PRIO\_PROCESS} & \type{pid\_t} & processo  \\
+    \constd{PRIO\_PRGR}    & \type{pid\_t} & \textit{process group} (vedi
+                                             sez.~\ref{sec:sess_proc_group})\\
+    \constd{PRIO\_USER}    & \type{uid\_t} & utente \\
     \hline
   \end{tabular}
   \caption{Legenda del valore dell'argomento \param{which} e del tipo
@@ -2778,17 +2793,17 @@ corrente.
     \textbf{Politica}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{SCHED\_FIFO} & \textit{Scheduling real-time} con politica
-                          \textit{FIFO}. \\
-    \const{SCHED\_RR}   & \textit{Scheduling real-time} con politica
-                          \textit{Round Robin}. \\ 
+    \constd{SCHED\_FIFO} & \textit{Scheduling real-time} con politica
+                           \textit{FIFO}. \\
+    \constd{SCHED\_RR}   & \textit{Scheduling real-time} con politica
+                           \textit{Round Robin}. \\ 
     \hline
-    \const{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\
-    \const{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione
-                          ulteriore di lavoro \textit{CPU
-                            intensive} (dal kernel 2.6.16).\\ 
-    \const{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente
-                          bassa (dal kernel 2.6.23).\\
+    \constd{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\
+    \constd{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione
+                           ulteriore di lavoro \textit{CPU
+                           intensive} (dal kernel 2.6.16).\\ 
+    \constd{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente
+                           bassa (dal kernel 2.6.23).\\
     \hline
   \end{tabular}
   \caption{Valori dell'argomento \param{policy} per la funzione
@@ -2850,8 +2865,8 @@ errore \errcode{EINVAL}, questo valore infatti non ha niente a che vedere con
 la priorità dinamica determinata dal valore di \textit{nice}, che deve essere
 impostato con le funzioni viste in precedenza.
 
-Lo standard POSIX.1b prevede inoltre che l'intervallo dei valori delle
-priorità statiche possa essere ottenuto con le funzioni di sistema
+Lo standard POSIX.1b prevede che l'intervallo dei valori delle priorità
+statiche possa essere ottenuto con le funzioni di sistema
 \funcd{sched\_get\_priority\_max} e \funcd{sched\_get\_priority\_min}, i cui
 prototipi sono:
 
@@ -2949,7 +2964,7 @@ politica ordinaria essa ha senso soltanto per quelli \textit{real-time}, dato
 che per i primi la priorità statica può essere soltanto nulla.  La
 disponibilità di entrambe le funzioni può essere verificata controllando la
 macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header
-  file} \headfile{sched.h}.
+  file} \headfiled{sched.h}.
 
 Se invece si vuole sapere quale è politica di \textit{scheduling} di un
 processo si può usare la funzione di sistema \funcd{sched\_getscheduler}, il
@@ -3043,7 +3058,7 @@ l'introduzione del \textit{Completely Fair Scheduler} questo comportamento è
 cambiato ed un processo che chiama la funzione viene inserito nella lista dei
 processi inattivo, con un tempo molto maggiore.\footnote{è comunque possibile
   ripristinare un comportamento analogo al precedente scrivendo il valore 1
-  nel file \sysctlfile{kernel/sched\_compat\_yield}.}
+  nel file \sysctlfiled{kernel/sched\_compat\_yield}.}
 
 L'uso delle funzione nella programmazione ordinaria può essere utile e
 migliorare le prestazioni generali del sistema quando si è appena rilasciata
@@ -3051,7 +3066,7 @@ una risorsa contesa con altri processi, e si vuole dare agli altri una
 possibilità di approfittarne mettendoli in esecuzione, ma chiamarla senza
 necessità, specie se questo avviene ripetutamente all'interno di un qualche
 ciclo, può avere invece un forte impatto negativo per la generazione di
-\itindex{contest~switch} \textit{contest switch} inutili.
+\textit{context switch} inutili.
 
 
 \subsection{Il controllo dello \textit{scheduler} per i sistemi
@@ -3184,7 +3199,7 @@ conveniente l'uso dell'affinità di processore.
 
 Dato che il numero di processori può variare a seconda delle architetture, per
 semplificare l'uso dell'argomento \param{mask} la \acr{glibc} ha introdotto un
-apposito dato di tipo, \type{cpu\_set\_t},\footnote{questa è una estensione
+apposito dato di tipo, \typed{cpu\_set\_t},\footnote{questa è una estensione
   specifica della \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 riguardo.} che
@@ -3210,14 +3225,17 @@ se esso è già presente in un insieme, sono le seguenti:
 \vspace{3pt}
 \begin{funcbox}{ 
 \fhead{sched.h}
-\fdecl{void \macro{CPU\_ZERO}(cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_ZERO}(cpu\_set\_t *set)}
 \fdesc{Inizializza un insieme di processori vuoto \param{set}.} 
-\fdecl{void \macro{CPU\_SET}(int cpu, cpu\_set\_t *set)}
-\fdesc{Inserisce il processore \param{cpu} nell'insieme di processori \param{set}.} 
-\fdecl{void \macro{CPU\_CLR}(int cpu, cpu\_set\_t *set)}
-\fdesc{Rimuove il processore \param{cpu} nell'insieme di processori \param{set}.} 
-\fdecl{int \macro{CPU\_ISSET}(int cpu, cpu\_set\_t *set)}
-\fdesc{Controlla se il processore \param{cpu} è nell'insieme di processori \param{set}.} 
+\fdecl{void \macrod{CPU\_SET}(int cpu, cpu\_set\_t *set)}
+\fdesc{Inserisce il processore \param{cpu} nell'insieme di
+  processori \param{set}.}  
+\fdecl{void \macrod{CPU\_CLR}(int cpu, cpu\_set\_t *set)}
+\fdesc{Rimuove il processore \param{cpu} nell'insieme di
+  processori \param{set}.}  
+\fdecl{int \macrod{CPU\_ISSET}(int cpu, cpu\_set\_t *set)}
+\fdesc{Controlla se il processore \param{cpu} è nell'insieme di
+  processori \param{set}.}  
 }
 \end{funcbox}}
 
@@ -3246,7 +3264,7 @@ volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo
 
 Le CPU sono numerate da zero (che indica la prima disponibile) fino ad
 un numero massimo che dipende dalla architettura hardware. La costante
-\const{CPU\_SETSIZE} indica il numero massimo di processori che possono far
+\constd{CPU\_SETSIZE} indica il numero massimo di processori che possono far
 parte di un insieme (al momento vale sempre 1024), e costituisce un limite
 massimo al valore dell'argomento \param{cpu}.
 Dalla versione 2.6 della \acr{glibc} alle precedenti macro è stata aggiunta,
@@ -3256,7 +3274,7 @@ per contare il numero di processori in un insieme, l'ulteriore:
 \vspace{3pt}
 \begin{funcbox}{ 
 \fhead{sched.h}
-\fdecl{int \macro{CPU\_COUNT}(cpu\_set\_t *set)}
+\fdecl{int \macrod{CPU\_COUNT}(cpu\_set\_t *set)}
 \fdesc{Conta il numero di processori presenti nell'insieme \param{set}.} 
 }
 \end{funcbox}}
@@ -3269,13 +3287,13 @@ compiere delle operazioni logiche sugli insiemi di processori con:
 \vspace{3pt}
 \begin{funcbox}{ 
 \fhead{sched.h}
-\fdecl{void \macro{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
 \fdesc{Esegue l'AND logico di due insiemi di processori.} 
-\fdecl{void \macro{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
 \fdesc{Esegue l'OR logico di due insiemi di processori.} 
-\fdecl{void \macro{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
 \fdesc{Esegue lo XOR logico di due insiemi di processori.} 
-\fdecl{int \macro{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)}
+\fdecl{int \macrod{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)}
 \fdesc{Verifica se due insiemi di processori sono uguali.} 
 }
 \end{funcbox}}
@@ -3304,11 +3322,11 @@ disallocare ed ottenere la dimensione in byte di un insieme di processori:
 \vspace{3pt}
 \begin{funcbox}{ 
 \fhead{sched.h}
-\fdecl{cpu\_set\_t * \macro{CPU\_ALLOC}(num\_cpus)}
+\fdecl{cpu\_set\_t * \macrod{CPU\_ALLOC}(num\_cpus)}
 \fdesc{Alloca dinamicamente un insieme di processori di dimensione voluta.} 
-\fdecl{void \macro{CPU\_FREE}(cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_FREE}(cpu\_set\_t *set)}
 \fdesc{Disalloca un insieme di processori allocato dinamicamente.} 
-\fdecl{size\_t \macro{CPU\_ALLOC\_SIZE}(num\_cpus)}
+\fdecl{size\_t \macrod{CPU\_ALLOC\_SIZE}(num\_cpus)}
 \fdesc{Ritorna la dimensione di un insieme di processori allocato dinamicamente.} 
 }
 \end{funcbox}}
@@ -3453,9 +3471,9 @@ sez.~\ref{sec:sess_proc_group}) o tutti i processi di un utente.
     \param{which} & \param{who} & \textbf{Significato} \\
     \hline
     \hline
-    \const{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\
-    \const{IPRIO\_WHO\_PRGR}    & \type{pid\_t} & \textit{process group}\\ 
-    \const{IPRIO\_WHO\_USER}    & \type{uid\_t} & utente\\
+    \constd{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\
+    \constd{IPRIO\_WHO\_PRGR}    & \type{pid\_t} & \textit{process group}\\ 
+    \constd{IPRIO\_WHO\_USER}    & \type{uid\_t} & utente\\
     \hline
   \end{tabular}
   \caption{Legenda del valore dell'argomento \param{which} e del tipo
@@ -3472,6 +3490,7 @@ di \textit{scheduling} lo prevede, la priorità del processo all'interno della
 classe stessa. Questo stesso formato viene utilizzato per indicare il valore
 della priorità da impostare con l'argomento \param{ioprio} di
 \func{ioprio\_set}.
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -3480,15 +3499,15 @@ della priorità da impostare con l'argomento \param{ioprio} di
     \textbf{Macro} & \textbf{Significato}\\
     \hline
     \hline
-    \macro{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})}
+    \macrod{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})}
                                 & Dato il valore di una priorità come
                                   restituito da \func{ioprio\_get} estrae il
                                   valore della classe.\\
-    \macro{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})}
+    \macrod{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})}
                                 & Dato il valore di una priorità come
                                   restituito da \func{ioprio\_get} estrae il
                                   valore della priorità.\\
-    \macro{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})}
+    \macrod{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})}
                                 & Dato un valore di priorità ed una classe
                                   ottiene il valore numerico da passare a
                                   \func{ioprio\_set}.\\
@@ -3517,9 +3536,11 @@ argomento di \func{ioprio\_set} per eseguire una impostazione.
     \textbf{Classe}  & \textbf{Significato} \\
     \hline
     \hline
-    \const{IOPRIO\_CLASS\_RT}  & \textit{Scheduling} di I/O \textit{real-time}.\\ 
+    \const{IOPRIO\_CLASS\_RT}  & \textit{Scheduling} di I/O
+                                 \textit{real-time}.\\  
     \const{IOPRIO\_CLASS\_BE}  & \textit{Scheduling} di I/O ordinario.\\ 
-    \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità minima.\\
+    \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità
+                                  minima.\\
     \hline
   \end{tabular}
   \caption{Costanti che identificano le classi di \textit{scheduling} di I/O.}
@@ -3532,7 +3553,7 @@ a quelle già adottate anche nel funzionamento dello \textit{scheduler} del
 processore. Ciascuna di esse è identificata tramite una opportuna costante,
 secondo quanto riportato in tab.~\ref{tab:IOsched_class}.
 
-La classe di priorità più bassa è \const{IOPRIO\_CLASS\_IDLE}; i processi in
+La classe di priorità più bassa è \constd{IOPRIO\_CLASS\_IDLE}; i processi in
 questa classe riescono ad accedere a disco soltanto quando nessun altro
 processo richiede l'accesso. Occorre pertanto usarla con molta attenzione,
 perché un processo in questa classe può venire completamente bloccato quando
@@ -3541,7 +3562,7 @@ accedendo al disco. Quando si usa questa classe non ha senso indicare un
 valore di priorità, dato che in questo caso non esiste nessuna gerarchia e la
 priorità è identica, la minima possibile, per tutti i processi.
 
-La seconda classe di priorità di I/O è \const{IOPRIO\_CLASS\_BE} (il nome sta
+La seconda classe di priorità di I/O è \constd{IOPRIO\_CLASS\_BE} (il nome sta
 per \textit{best-effort}) che è quella usata ordinariamente da tutti
 processi. In questo caso esistono priorità diverse che consentono di
 assegnazione di una maggiore banda passante nell'accesso a disco ad un
@@ -3554,7 +3575,7 @@ priorità maggiore.
 
 
 Infine la classe di priorità di I/O \textit{real-time}
-\const{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un
+\constd{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un
 processo in questa classe ha sempre la precedenza nell'accesso a disco
 rispetto a tutti i processi delle altre classi e di un processo nella stessa
 classe ma con priorità inferiore, ed è pertanto in grado di bloccare
@@ -3629,8 +3650,8 @@ l'operazione, e deve essere specificato con l'uso di una delle costanti
 predefinite del seguente elenco, che illustra quelle disponibili al
 momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
 
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
+\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
   \textit{capability} (vedi sez.~\ref{sec:proc_capabilities}). La funzione
   ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una
   delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel
@@ -3638,7 +3659,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
   se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}.
   Introdotta a partire dal kernel 2.6.25.
 
-\item[\const{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
+\item[\constd{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
   \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e
   da tutti i suoi discendenti. La funzione cancella la capacità specificata
   nell'argomento \param{arg2} con una delle costanti di
@@ -3650,7 +3671,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
   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
+\item[\constd{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 \textit{core dump} (vedi
   sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag
@@ -3671,64 +3692,64 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
   \textit{core dump} appartenente all'amministratore in directory dove
   l'utente avrebbe avuto permessi di accesso.
 
-\item[\const{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
   lo stato corrente del flag che controlla la effettiva generazione dei
   \textit{core dump}. Introdotta a partire dal kernel 2.3.20.
 
-\item[\const{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
+\item[\constd{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
   chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono
-  sono: \const{PR\_ENDIAN\_BIG} (\textit{big endian}),
-  \const{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
-  \const{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
+  sono: \constd{PR\_ENDIAN\_BIG} (\textit{big endian}),
+  \constd{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
+  \constd{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
   PowerPC). Introdotta a partire dal kernel 2.6.18, solo per architettura
   PowerPC.
 
-\item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
+\item[\constd{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
   processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
   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
+\item[\constd{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
+  di \param{arg2}, si deve passare \constd{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
+  \constd{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
   \signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
   dal kernel 2.4.18, solo su architettura ia64.
 
-\item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
+\item[\constd{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 ``\ctyp{int *}''. Introdotta a
   partire dal kernel 2.4.18, solo su architettura ia64.
 
-\item[\const{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
+\item[\constd{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
   mobile (\textit{floating-point exception mode}) al valore di \param{arg2}.
   I valori possibili sono: 
   \begin{itemize*}
-  \item \const{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
-  \item \const{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
-  \item \const{PR\_FP\_EXC\_OVF} per gli overflow,
-  \item \const{PR\_FP\_EXC\_UND} per gli underflow,
-  \item \const{PR\_FP\_EXC\_RES} per risultati non esatti,
-  \item \const{PR\_FP\_EXC\_INV} per operazioni invalide,
-  \item \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
-  \item \const{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
+  \item \constd{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
+  \item \constd{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
+  \item \constd{PR\_FP\_EXC\_OVF} per gli overflow,
+  \item \constd{PR\_FP\_EXC\_UND} per gli underflow,
+  \item \constd{PR\_FP\_EXC\_RES} per risultati non esatti,
+  \item \constd{PR\_FP\_EXC\_INV} per operazioni invalide,
+  \item \constd{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
+  \item \constd{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
     asincrona non recuperabile,
-  \item \const{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
+  \item \constd{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
     asincrona recuperabile,
-  \item \const{PR\_FP\_EXC\_PRECISE} per la modalità precisa di
+  \item \constd{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.}
   \end{itemize*}
 Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 
-\item[\const{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
+\item[\constd{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
   delle operazioni in virgola mobile, salvata all'indirizzo
   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''.  Introdotta
   a partire dal kernel 2.4.21, solo su PowerPC.
 
-\item[\const{PR\_SET\_KEEPCAPS}] Consente di controllare quali
+\item[\constd{PR\_SET\_KEEPCAPS}] Consente di controllare quali
   \textit{capabilities} vengono cancellate quando si esegue un cambiamento di
   \ids{UID} del processo (per i dettagli si veda
   sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
@@ -3740,21 +3761,21 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   sez.~\ref{sec:proc_capabilities} e 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
+\item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
   il valore del flag di controllo delle \textit{capabilities} impostato con
   \const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18.
 
-\item[\const{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
+\item[\constd{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}''. Il
   nome può essere lungo al massimo 16 caratteri, e la stringa deve essere
   terminata da NUL se più corta.  Introdotta a partire dal kernel 2.6.9.
 
-\item[\const{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
+\item[\constd{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
   stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}'';
   si devono allocare per questo almeno 16 byte, e il nome sarà terminato da
   NUL se più corto. Introdotta a partire dal kernel 2.6.9.
 
-\item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
+\item[\constd{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 \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
@@ -3762,13 +3783,13 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   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
+\item[\constd{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 ``\ctyp{int *}''. Introdotta a
   partire dal kernel 2.3.15.
 
 \itindbeg{secure~computing~mode}
-\item[\const{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
+\item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
     mode} per il processo corrente. Prevede come unica possibilità
   che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure
     computing mode} il processo potrà utilizzare soltanto un insieme
@@ -3794,7 +3815,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
 % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
 
-\item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
   lo stato corrente del \textit{secure computing mode}, al momento attuale la
   funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
   che la chiamata di questa funzione in \textit{secure computing mode}
@@ -3802,7 +3823,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
 \itindend{secure~computing~mode}
 
-\item[\const{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
+\item[\constd{PR\_SET\_SECUREBITS}] Imposta i \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
@@ -3811,35 +3832,35 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   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
+\item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
   funzione l'impostazione corrente per i \textit{securebits}. Introdotta a
   partire dal kernel 2.6.26.
 
-\item[\const{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
+\item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
   processo da indicare con il valore di \param{arg2}, attualmente i valori
-  possibili sono due, con \const{PR\_TIMING\_STATISTICAL} si usa il metodo
-  statistico tradizionale, con \const{PR\_TIMING\_TIMESTAMP} il più accurato
+  possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo
+  statistico tradizionale, con \constd{PR\_TIMING\_TIMESTAMP} il più accurato
   basato su dei \textit{timestamp}, quest'ultimo però non è ancora
   implementato ed il suo uso comporta la restituzione di un errore di
   \errval{EINVAL}. Introdotta a partire dal kernel 2.6.0-test4.
 
-\item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
   il metodo di temporizzazione del processo attualmente in uso (uno dei due
   valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel
   2.6.0-test4.
 
-\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo
+\item[\constd{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
+  valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per
+  abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la
   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} (vedi
   \const{PR\_SET\_SECCOMP} più avanti).  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[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
   lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
   puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
   partire dal kernel 2.6.26, solo su x86.
@@ -3847,11 +3868,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 % http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
 % http://en.wikipedia.org/wiki/Time_Stamp_Counter 
 
-\item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
+\item[\constd{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 il
-  valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
-  ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di
+  valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
+  ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di
   \signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
   allineato.  Introdotta con diverse versioni su diverse architetture.
 
@@ -3874,11 +3895,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 
   Il comportamento di default prevede che per tutti i processi si applichi la
   politica generale di sistema definita nel file
-  \sysctlfile{vm/memory\_failure\_early\_kill}, ma specificando
-  per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare
+  \sysctlfiled{vm/memory\_failure\_early\_kill}, ma specificando
+  per \param{arg2} il valore \constd{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
+  invece per \param{arg2} il valore \constd{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}.
@@ -3887,9 +3908,9 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   \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
+  \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
   \signal{SIGBUS} non appena viene rilevato un errore, mentre con
-  \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
+  \constd{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
@@ -3898,18 +3919,18 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
     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
+  terzo valore, \constd{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
+\item[\constd{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.
 \itindbeg{child~reaper}
-\item[\const{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
+\item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
   imposta l'attributo di \textit{child reaper} per il processo, se nullo lo
   cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta
   con il kernel 3.4, che consente di far svolgere al processo che ha questo
@@ -3926,7 +3947,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
   con lo stato di \textit{child reaper} termina prima dei suoi discendenti,
   svolgerà questo ruolo il più prossimo antenato ad avere lo stato di
   \textit{child reaper}, 
-\item[\const{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
+\item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
   lo stato di \textit{child reaper} del processo chiamante, salvata come
   \textit{value result} all'indirizzo puntato da \param{arg2} (da indicare
   come di tipo \code{int *}). Il valore viene letto come valore logico, se
@@ -3947,12 +3968,14 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 % codice e dati, stack, brack pointer ecc. vedi
 % http://git.kernel.org/linus/f606b77f1a9e362451aca8f81d8f36a3a112139e 
 
+% TODO documentare ARCH_SET_CPUID e ARCH_GET_CPUID, introdotte con il kernel
+% 4.12, vedi https://lwn.net/Articles/721182/
+
 
 \label{sec:prctl_operation}
 \end{basedescript}
 
 
-
 \subsection{La \textit{system call} \func{clone}}
 \label{sec:process_clone}
 
@@ -3977,12 +4000,21 @@ 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.
 
+\itindbeg{namespace}
+\itindbeg{container}
+
 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 \ids{PID},
-l'albero dei file, i \textit{mount point}, la 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}.
+virtualizzazione dei processi, di creare nuovi ``\textit{namespace}'' per una
+serie di proprietà generali (come l'elenco dei \ids{PID}, l'albero dei file, i
+\textit{mount point}, la rete, il sistema di IPC, ecc.). L'uso dei
+``\textit{namespace}'' consente creare gruppi di processi che vedono le
+suddette proprietà in maniera indipendente fra loro. I processi di ciascun
+gruppo vengono così eseguiti come in una sorta di spazio separato da quello
+degli altri gruppi, che costituisce poi quello che viene chiamato un
+\textit{container}.
+
+\itindend{namespace}
+\itindend{container}
 
 La \textit{system call} richiede soltanto due argomenti: il
 primo, \param{flags}, consente di controllare le modalità di creazione del
@@ -4053,7 +4085,7 @@ visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
     \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
+      \texttt{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.
@@ -4097,16 +4129,20 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa
   riferimento al momento della stesura di questa sezione, cioè con il kernel
   3.2.}
 
-\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
 
-\item[\const{CLONE\_CHILD\_CLEARTID}] cancella il valore del \ids{TID}
-  all'indirizzo dato dall'argomento \param{ctid}, eseguendo un riattivazione
-  del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a quell'indirizzo; questo
-  flag viene utilizzato dalla librerie di gestione dei \textit{thread}.
-\item[\const{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
+\item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
+    ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un
+  riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a
+  quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei
+  \textit{thread} ed è presente dal kernel 2.5.49.
+
+\item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
   figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene
-  utilizzato dalla librerie di gestione dei \textit{thread}.
-\item[\const{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
+  utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal
+  kernel 2.5.49.
+
+\item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
   padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}),
   questo significa che ogni \textit{file descriptor} aperto da un processo
   verrà visto anche dall'altro e che ogni chiusura o cambiamento dei
@@ -4119,7 +4155,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa
   ordinario di un sistema unix-like e che illustreremo in dettaglio in
   sez.~\ref{sec:file_shared_access}.
 
-\item[\const{CLONE\_FS}] se questo flag viene impostato il nuovo processo
+\item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo
   condividerà con il padre le informazioni relative all'albero dei file, ed in
   particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la
   stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa
@@ -4129,37 +4165,97 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa
   informazioni, che saranno così indipendenti per i due processi, come avviene
   nel comportamento ordinario di un sistema unix-like.
 
-\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}]
+\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
+  processo condividerà con il padre il contesto dell'I/O, altrimenti, come
+  come avviene nel comportamento ordinario con una \func{fork} otterrà un suo
+  contesto dell'I/O. 
+
+  Il contesto dell'I/O viene usato dagli \textit{scheduler} di I/O (visti in
+  sez.~\ref{sec:io_priority}) e se questo è lo stesso per diversi processi
+  questi vengono trattati come se fossero lo stesso, condividendo il tempo per
+  l'accesso al disco, e possono interscambiarsi nell'accesso a disco. L'uso di
+  questo flag consente, quando più \textit{thread} eseguono dell'I/O per conto
+  dello stesso processo (ad esempio con le funzioni di I/O asincrono di
+  sez.~\ref{sec:file_asyncronous_io}), migliori prestazioni.
+
+%TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
+%relativa sezione da creare a parte
+
+% \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
+%   introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo
+%   processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello
+%   di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code
+%   di messaggi POSIX (vedi sez.~\ref{sec:ipc_posix_mq}); si applica cioè a
+%   tutti quegli oggetti che non vegono identificati con un \textit{pathname}
+%   sull'albero dei file.
+
+%   L'uso di questo flag richiede privilegi di amministratore (più precisamente
+%   la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
+%   con \const{CLONE\_SYSVSEM}. 
+
+% \item[\constd{CLONE\_NEWNET}]
+% \item[\constd{CLONE\_NEWNS}]
+% \item[\constd{CLONE\_NEWPID}]
+% \item[\constd{CLONE\_NEWUTS}]
+
+
+% TODO trattare CLONE_NEWCGROUP introdotto con il kernel 4.6, vedi
+% http://lwn.net/Articles/680566/ 
+
+\item[\constd{CLONE\_PARENT}]
+\item[\constd{CLONE\_PARENT\_SETTID}]
+\item[\constd{CLONE\_PID}]
+
+\item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo
+  chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il
+  figlio viene tracciato. 
+
+\item[\constd{CLONE\_SETTLS}]
+\item[\constd{CLONE\_SIGHAND}]
+\item[\constd{CLONE\_STOPPED}]
+\item[\constd{CLONE\_SYSVSEM}]
+\item[\constd{CLONE\_THREAD}]
+
+\item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non
+  può più forzare \const{CLONE\_PTRACE} su questo processo.
+
+\item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene
+  fermato fintato che il figlio appena creato non rilascia la sua memoria
+  virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi
+  replicato il comportamento di \func{vfork}.
+
+\item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo
+  condividerà con il padre la stessa memoria virtuale, e le scritture in
+  memoria fatte da uno qualunque dei processi saranno visibili dall'altro,
+  così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}). 
+
+  Se non viene impostato il processo figlio otterrà una copia dello spazio
+  degli indirizzi e si otterrà il comportamento ordinario di un processo di un
+  sistema unix-like creato con la funzione \func{fork}.
 \end{basedescript}
 
 
+%TODO sezione separata sui namespace 
+
 %TODO trattare unshare, vedi anche http://lwn.net/Articles/532748/
 
+%TODO: trattare la funzione setns e i namespace file descriptors (vedi
+% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
+% informazioni su setns qui: http://lwn.net/Articles/532748/
+% http://lwn.net/Articles/531498/
+
+
+% TODO trattare le funzioni di protezione della memoria pkey_alloc, pkey_free,
+% pkey_mprotect, introdotte con il kernel 4.8, vedi
+% http://lwn.net/Articles/689395/ e Documentation/x86/protection-keys.txt 
 
 %TODO trattare kcmp aggiunta con il kernel 3.5, vedi
 % https://lwn.net/Articles/478111/
 
-\subsection{La funzione \func{ptrace}}
-\label{sec:process_ptrace}
+%\subsection{La funzione \func{ptrace}}
+%\label{sec:process_ptrace}
 
-Da fare
+%Da fare
 
 % TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
 % TODO: trattare PTRACE_O_EXITKILL, aggiunta con il kernel 3.8 (vedi
@@ -4169,18 +4265,18 @@ Da fare
 % TODO: trattare PTRACE_O_SUSPEND_SECCOMP, aggiunta con il kernel 4.3, vedi
 % http://lwn.net/Articles/656675/ 
 
-\subsection{La gestione delle operazioni in virgola mobile}
-\label{sec:process_fenv}
+%\subsection{La gestione delle operazioni in virgola mobile}
+%\label{sec:process_fenv}
 
-Da fare.
+%Da fare.
 
 % TODO eccezioni ed arrotondamenti per la matematica in virgola mobile 
 % consultare la manpage di fenv, math_error, fpclassify, matherr, isgreater,
 % isnan, nan, INFINITY
 
 
-\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}
 
 %
 % TODO l'I/O sulle porte di I/O 
@@ -4188,7 +4284,7 @@ Da fare.
 % non c'entra nulla qui, va trovato un altro posto (altri meccanismi di I/O in
 % fileintro ?)
 
-Da fare
+%Da fare
 
 
 %\subsection{La gestione di architetture a nodi multipli}
@@ -4218,6 +4314,8 @@ Da fare
 %TODO trattare membarrier, introdotta con il kernel 4.3
 % vedi http://lwn.net/Articles/369567/ http://lwn.net/Articles/369640/
 % http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5b25b13ab08f616efd566347d809b4ece54570d1 
+% vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
+% (https://lwn.net/Articles/728795/) 
 
 \section{Problematiche di programmazione multitasking}
 \label{sec:proc_multi_prog}
@@ -4276,14 +4374,14 @@ operazione è messa in discussione, per cui l'assenza di eventuali \textit{race
   condition} (vedi sez.~\ref{sec:proc_race_cond}) deve essere sempre
 verificata nei minimi dettagli.
 
-In questo caso il sistema provvede un tipo di dato, il \type{sig\_atomic\_t},
+In questo caso il sistema provvede un tipo di dato, il \typed{sig\_atomic\_t},
 il cui accesso è assicurato essere atomico.  In pratica comunque si può
 assumere che, in ogni piattaforma su cui è implementato Linux, il tipo
 \ctyp{int}, gli altri interi di dimensione inferiore ed i puntatori sono
 atomici. Non è affatto detto che lo stesso valga per interi di dimensioni
 maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per
 le strutture di dati. In tutti questi casi è anche opportuno marcare come
-\direct{volatile} le variabili che possono essere interessate ad accesso
+\dirct{volatile} le variabili che possono essere interessate ad accesso
 condiviso, onde evitare problemi con le ottimizzazioni del codice.
 
 
@@ -4406,7 +4504,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  nell'header scheduler system interrupt timer HZ asm Hertz clock
 % LocalWords:  l'alpha tick fork wait waitpid exit exec image glibc int pgid ps
 % LocalWords:  sid thread Ingo Molnar ppid getpid getppid sys unistd LD threads
-% LocalWords:  void tempnam pathname sibling cap errno EAGAIN ENOMEM
+% LocalWords:  void tempnam pathname sibling cap errno EAGAIN ENOMEM context
 % LocalWords:  stack read only copy write tab client spawn forktest sleep PATH
 % LocalWords:  source LIBRARY scheduling race condition printf descriptor dup
 % LocalWords:  close group session tms lock vfork execve BSD stream main abort
@@ -4416,7 +4514,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  filesystem noexec EPERM suid sgid root nosuid ENOEXEC ENOENT ELF
 % LocalWords:  ETXTBSY EINVAL ELIBBAD BIG EFAULT EIO ENAMETOOLONG ELOOP ENOTDIR
 % LocalWords:  ENFILE EMFILE argc execl path execv execle execlp execvp vector
-% LocalWords:  list environ NULL umask utime cutime ustime fcntl linker
+% LocalWords:  list environ NULL umask utime cutime ustime fcntl linker Posix
 % LocalWords:  opendir libc interpreter FreeBSD capabilities mandatory access
 % LocalWords:  control MAC SELinux security modules LSM superuser uid gid saved
 % LocalWords:  effective euid egid dell' fsuid fsgid getuid geteuid getgid SVr
@@ -4424,13 +4522,13 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  setreuid setregid FIXME ruid rgid seteuid setegid setresuid size
 % LocalWords:  setresgid getresuid getresgid value result argument setfsuid DAC
 % LocalWords:  setfsgid NGROUPS sysconf getgroups getgrouplist groups ngroups
-% LocalWords:  setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary PF
+% LocalWords:  setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary 
 % LocalWords:  SEARCH chattr sticky NOATIME socket domain immutable append mmap
 % LocalWords:  broadcast multicast multicasting memory locking mlock mlockall
 % LocalWords:  shmctl ioperm iopl chroot ptrace accounting swap reboot hangup
 % LocalWords:  vhangup mknod lease permitted inherited inheritable bounding AND
 % LocalWords:  capability capget capset header ESRCH undef version obj clear PT
-% LocalWords:  pag ssize length proc capgetp preemptive cache runnable  contest
+% LocalWords:  pag ssize length proc capgetp preemptive cache runnable
 % LocalWords:  SIGSTOP soft slice nice niceness counter which SC switch side
 % LocalWords:  getpriority who setpriority RTLinux RTAI Adeos fault FIFO  COUNT
 % LocalWords:  yield Robin setscheduler policy param OTHER priority setparam to
@@ -4462,6 +4560,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso
 % LocalWords:  NEWUTS SETTLS SIGHAND SYSVSEM UNTRACED tls ctid CLEARTID panic
 % LocalWords:  loader EISDIR SIGTRAP uninterrutible killable EQUAL sizeof XOR
 % LocalWords:  destset srcset ALLOC num cpus setsize emacs pager getty TID
+%  LocalWords:  reaper SUBREAPER Library futex
  
 %%% Local Variables: 
 %%% mode: latex