Aggiornamento copyright, trattazione degli shared subtree per mount e
[gapil.git] / process.tex
index 5e5fa6e55f8ff76ec56905945a01656994077e57..db45209e4b70f4cf7ab749001fdf846a178958d3 100644 (file)
@@ -1,6 +1,6 @@
 %% process.tex
 %%
-%% Copyright (C) 2000-2011 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2012 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",
@@ -243,10 +243,11 @@ Un esempio di inclusione di questi file, preso da uno dei programmi di
 esempio, è il seguente, e si noti come gli \textit{header file} possano essere
 referenziati con il nome fra parentesi angolari, nel qual caso si indica l'uso
 di quelli installati con il sistema,\footnote{in un sistema GNU/Linux che
-  segue le specifiche del \textit{Filesystem Hierarchy Standard} (per maggiori
-  informazioni si consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto
-  \texttt{/usr/include}.} o fra virgolette, nel qual caso si fa riferimento ad
-una versione locale, da indicare con un pathname relativo:
+  segue le specifiche del \itindex{Filesystem~Hierarchy~Standard~(FHS)}
+  \textit{Filesystem Hierarchy Standard} (per maggiori informazioni si
+  consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto \texttt{/usr/include}.}
+o fra virgolette, nel qual caso si fa riferimento ad una versione locale, da
+indicare con un pathname relativo:
 \includecodesnip{listati/main_include.c}
 
 Si tenga presente che oltre ai nomi riservati a livello generale di cui si è
@@ -378,7 +379,7 @@ standard ANSI C, è quella che deve essere invocata per una terminazione
 La funzione è pensata per eseguire una conclusione pulita di un programma che
 usi la libreria standard del C; essa esegue tutte le funzioni che sono state
 registrate con \func{atexit} e \func{on\_exit} (vedi
-sez.~\ref{sec:proc_atexit}), chiude tutti i \textit{file stream} (vedi
+sez.~\ref{sec:proc_atexit}), chiude tutti gli \textit{stream} (vedi
 sez.~\ref{sec:file_stream}) effettuando il salvataggio dei dati sospesi
 (chiamando \func{fclose}, vedi sez.~\ref{sec:file_fopen}), infine passa il
 controllo al kernel chiamando la \textit{system call} \func{\_exit} (che
@@ -442,8 +443,8 @@ concludendo immediatamente il processo, il suo prototipo è:
 La funzione termina immediatamente il processo e le eventuali funzioni
 registrate con \func{atexit} e \func{on\_exit} non vengono eseguite. La
 funzione chiude tutti i file descriptor appartenenti al processo, cosa che
-però non comporta il salvataggio dei dati eventualmente presenti nei buffer di
-\textit{file stream}, (torneremo sulle due interfacce dei file in
+però non comporta il salvataggio dei dati eventualmente presenti nei buffer
+degli \textit{stream}, (torneremo sulle due interfacce dei file in
 cap.~\ref{cha:files_std_interface} e
 cap.~\ref{cha:file_unix_interface})). Infine fa sì che ogni figlio del
 processo sia adottato da \cmd{init} (vedi sez.~\ref{sec:proc_termination}),
@@ -524,11 +525,11 @@ di esecuzione sarà riferito alla registrazione in quanto tale,
 indipendentemente dalla funzione usata per farla.
 
 Una volta completata l'esecuzione di tutte le funzioni registrate verranno
-chiusi tutti i \textit{file stream} aperti ed infine verrà chiamata
-\func{\_exit} per la terminazione del programma. Questa è la sequenza
-ordinaria, eseguita a meno che una delle funzioni registrate non esegua al suo
-interno \func{\_exit}, nel qual caso la terminazione del programma sarà
-immediata ed anche le successive funzioni registrate non saranno invocate.
+chiusi tutti gli \textit{stream} aperti ed infine verrà chiamata \func{\_exit}
+per la terminazione del programma. Questa è la sequenza ordinaria, eseguita a
+meno che una delle funzioni registrate non esegua al suo interno
+\func{\_exit}, nel qual caso la terminazione del programma sarà immediata ed
+anche le successive funzioni registrate non saranno invocate.
 
 Se invece all'interno di una delle funzioni registrate si chiama un'altra
 volta \func{exit} lo standard POSIX.1-2001 prescrive un comportamento
@@ -1074,11 +1075,10 @@ funzioni di libreria una propria versione (che può essere più o meno
 specializzata per il debugging). Esistono varie librerie che forniscono dei
 sostituti opportuni delle funzioni di allocazione in grado, senza neanche
 ricompilare il programma,\footnote{esempi sono \textit{Dmalloc}
-  \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed
-  \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche
-molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle
-funzionalità di ausilio presenti nella \acr{glibc} in
-sez.~\ref{sec:proc_memory_adv_management}.
+  \url{http://dmalloc.com/} di Gray Watson ed \textit{Electric Fence} di Bruce
+  Perens.} di eseguire diagnostiche anche molto complesse riguardo
+l'allocazione della memoria. Vedremo alcune delle funzionalità di ausilio
+presenti nella \acr{glibc} in sez.~\ref{sec:proc_memory_adv_management}.
 
 Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire
 dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in
@@ -1262,14 +1262,14 @@ il suo prototipo è:
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
 caso \var{errno} assumerà uno dei valori:
 \begin{errlist}
-   \item[\errcode{ENOMEM}] o \param{addr} + \param{length} eccede la dimensione
-     della memoria usata dal processo o l'intervallo di indirizzi specificato
-     non è mappato.
-   \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
-     una pagina.
-   \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
    \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire
      una risposta.
+   \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
+   \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
+     una pagina.
+   \item[\errcode{ENOMEM}] o \param{addr}$+$\param{length} eccede la dimensione
+     della memoria usata dal processo o l'intervallo di indirizzi specificato
+     non è mappato.
 \end{errlist}}
 \end{funcproto}
 
@@ -1393,11 +1393,11 @@ singole sezioni di memoria sono rispettivamente \funcd{mlock} e
 {Entrambe le funzioni ritornano $0$ in caso di successo e $-1$ in caso di
   errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
+  \item[\errcode{EINVAL}] \param{len} non è un valore positivo.
   \item[\errcode{ENOMEM}] alcuni indirizzi dell’intervallo specificato non
     corrispondono allo spazio di indirizzi del processo o si è superato il
     limite di \const{RLIMIT\_MEMLOCK} per un processo non privilegiato (solo
     per kernel a partire dal 2.6.9). 
-  \item[\errcode{EINVAL}] \param{len} non è un valore positivo.
   \item[\errcode{EPERM}] il processo non è privilegiato (per kernel precedenti
     il 2.6.9) o si ha un limite nullo per \const{RLIMIT\_MEMLOCK} e
     il processo non è privilegiato (per kernel a partire dal 2.6.9).
@@ -1521,8 +1521,8 @@ rispettivi prototipi sono:
   caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
   assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
   \item[\errcode{EINVAL}] \param{boundary} non è una potenza di due.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
   \end{errlist}}
 \end{funcproto}
 
@@ -1553,9 +1553,9 @@ prototipo è:
   caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno}
   assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
   \item[\errcode{EINVAL}] \param{alignment} non è potenza di due e multiplo
     di \code{sizeof(void *)}.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
   \end{errlist}}
 \end{funcproto}
 
@@ -1831,7 +1831,7 @@ inoltre inizializza alcune \index{variabili!globali} variabili globali:
 \end{itemize*}
 
 In fig.~\ref{fig:proc_options_code} si è mostrata la sezione del programma
-\file{ForkTest.c}, che useremo nel prossimo capitolo per effettuare dei test
+\file{fork\_test.c}, che useremo nel prossimo capitolo per effettuare dei test
 sulla creazione dei processi, deputata alla decodifica delle opzioni a riga di
 comando da esso supportate.
 
@@ -2116,10 +2116,10 @@ suo prototipo è:
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
   nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
-  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per aggiungere una nuova
-    variabile all'ambiente.
   \item[\errcode{EINVAL}] \param{name} è \val{NULL} o una stringa di lunghezza
   nulla o che contiene il carattere ``\texttt{=}''.
+  \item[\errcode{ENOMEM}] non c'è memoria sufficiente per aggiungere una nuova
+    variabile all'ambiente.
 \end{errlist}}
 \end{funcproto}
 
@@ -2302,12 +2302,14 @@ usando variabili globali o dichiarate come \direct{extern},\footnote{la
 \subsection{Il passaggio di un numero variabile di argomenti}
 \label{sec:proc_variadic}
 
+\index{funzioni!variadic|(}
+
 Come vedremo nei capitoli successivi, non sempre è possibile specificare un
 numero fisso di argomenti per una funzione.  Lo standard ISO C prevede nella
-sua sintassi la possibilità di definire delle \index{variadic}
-\textit{variadic function} che abbiano un numero variabile di argomenti,
-attraverso l'uso nella dichiarazione della funzione dello speciale costrutto
-``\texttt{...}'', che viene chiamato \textit{ellipsis}.
+sua sintassi la possibilità di definire delle \textit{variadic function} che
+abbiano un numero variabile di argomenti, attraverso l'uso nella dichiarazione
+della funzione dello speciale costrutto ``\texttt{...}'', che viene chiamato
+\textit{ellipsis}.
 
 Lo standard però non provvede a livello di linguaggio alcun meccanismo con cui
 dette funzioni possono accedere ai loro argomenti.  L'accesso viene pertanto
@@ -2323,11 +2325,11 @@ adeguati.  L'uso di una \textit{variadic function} prevede quindi tre punti:
   a seguire quelli addizionali.
 \end{itemize*}
 
-Lo standard ISO C prevede che una \index{variadic} \textit{variadic function}
-abbia sempre almeno un argomento fisso. Prima di effettuare la dichiarazione
-deve essere incluso l'apposito \textit{header file} \file{stdarg.h}; un
-esempio di dichiarazione è il prototipo della funzione \func{execl} che
-vedremo in sez.~\ref{sec:proc_exec}:
+Lo standard ISO C prevede che una \textit{variadic function} abbia sempre
+almeno un argomento fisso. Prima di effettuare la dichiarazione deve essere
+incluso l'apposito \textit{header file} \file{stdarg.h}; un esempio di
+dichiarazione è il prototipo della funzione \func{execl} che vedremo in
+sez.~\ref{sec:proc_exec}:
 \includecodesnip{listati/exec_sample.c}
 in questo caso la funzione prende due argomenti fissi ed un numero variabile
 di altri argomenti, che andranno a costituire gli elementi successivi al primo
@@ -2515,6 +2517,7 @@ valore speciale per l'ultimo argomento, come fa ad esempio \func{execl} che
 usa un puntatore \val{NULL} per indicare la fine della lista degli argomenti
 (vedi sez.~\ref{sec:proc_exec}).
 
+\index{funzioni!variadic|)}
 
 \subsection{Il controllo di flusso non locale}
 \label{sec:proc_longjmp}