Aggiornamento al 2010 delle note di copyright
[gapil.git] / process.tex
index 7c104bc36ffa6df64c51f1e217b14b773de7e3b5..9e71df19263403dfec12281e20d0a958cb6a41a6 100644 (file)
@@ -1,6 +1,6 @@
 %% process.tex
 %%
-%% Copyright (C) 2000-2009 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2010 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",
@@ -151,13 +151,14 @@ non vengono salvati e le eventuali funzioni registrate con \func{atexit} e
   \bodydesc{La funzione non ritorna. Il processo viene terminato.}
 \end{prototype}
 
-La funzione chiude tutti i file descriptor appartenenti al processo (si tenga
+La funzione chiude tutti i file descriptor appartenenti al processosi tenga
 presente che questo non comporta il salvataggio dei dati bufferizzati degli
-stream), fa sì che ogni figlio del processo sia adottato da \cmd{init} (vedi
-cap.~\ref{cha:process_handling}), manda un segnale \const{SIGCHLD} al processo
-padre (vedi sez.~\ref{sec:sig_job_control}) ed infine ritorna lo stato di
-uscita specificato in \param{status} che può essere raccolto usando la
-funzione \func{wait} (vedi sez.~\ref{sec:proc_wait}).
+stream, (torneremo sulle due interfacce dei file a partire da
+cap.~\ref{cha:file_intro}), fa sì che ogni figlio del processo sia adottato da
+\cmd{init} (vedi cap.~\ref{cha:process_handling}), manda un segnale
+\const{SIGCHLD} al processo padre (vedi sez.~\ref{sec:sig_job_control}) ed
+infine ritorna lo stato di uscita specificato in \param{status} che può essere
+raccolto usando la funzione \func{wait} (vedi sez.~\ref{sec:proc_wait}).
 
 
 \subsection{Le funzioni \func{atexit} e \func{on\_exit}}
@@ -618,12 +619,12 @@ che, quando l'argomento 
 operazione.
 
 Le \acr{glibc} hanno un'implementazione delle funzioni di allocazione che è
-controllabile dall'utente attraverso alcune variabili di ambiente, in
-particolare diventa possibile tracciare questo tipo di errori usando la
-variabile di ambiente \val{MALLOC\_CHECK\_} che quando viene definita mette in
-uso una versione meno efficiente delle funzioni suddette, che però è più
-tollerante nei confronti di piccoli errori come quello di chiamate doppie a
-\func{free}.  In particolare:
+controllabile dall'utente attraverso alcune variabili di ambiente (vedi
+sez.~\ref{sec:proc_environ}), in particolare diventa possibile tracciare
+questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_}
+che quando viene definita mette in uso una versione meno efficiente delle
+funzioni suddette, che però è più tollerante nei confronti di piccoli errori
+come quello di chiamate doppie a \func{free}.  In particolare:
 \begin{itemize}
 \item se la variabile è posta a zero gli errori vengono ignorati;
 \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error}
@@ -692,12 +693,12 @@ molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle
 funzionalità di ausilio presenti nelle \acr{glibc} in
 sez.~\ref{sec:proc_memory_adv_management}. 
 
-Una possibile alternativa all'uso di \func{malloc}, che non soffre dei
-problemi di \itindex{memory~leak} \textit{memory leak} descritti in
-precedenza, è la funzione \funcd{alloca}, che invece di allocare la memoria
-nello \itindex{heap} \textit{heap} usa il segmento di \itindex{stack}
-\textit{stack} della funzione corrente. La sintassi è identica a quella di
-\func{malloc}, il suo prototipo è:
+Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire
+dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in
+precedenza, è di allocare la memoria nel segmento di \itindex{stack}
+\textit{stack} della funzione corrente invece che nello \itindex{heap}
+\textit{heap}, per farlo si può usare la funzione \funcd{alloca}, la cui
+sintassi è identica a quella di \func{malloc}; il suo prototipo è:
 \begin{prototype}{stdlib.h}{void *alloca(size\_t size)}
   Alloca \param{size} byte nello \textit{stack}.
   
@@ -1137,16 +1138,15 @@ oltre le dimensioni della sua allocazione,\footnote{entrambe queste operazioni
 classici \itindex{memory~leak} \textit{memory leak}.
 
 Una prima funzionalità di ausilio nella ricerca di questi errori viene fornita
-dalla \acr{glibc} tramite l'uso della variabile di ambiente (vedi
-sez.~\ref{sec:proc_environ}) \var{MALLOC\_CHECK\_}. Quando questa viene
-definita al posto della versione ordinaria delle funzioni di allocazione
-(\func{malloc}, \func{calloc}, \func{realloc}, e \func{free}) viene usata una
-versione meno efficiente ma in grado di rilevare (e tollerare) alcuni degli
-errori più semplici, come le doppie chiamate a \func{free} o i
-\itindex{buffer~overrun} \textit{buffer overrun} di un byte.\footnote{uno
-  degli errori più comuni, causato ad esempio dalla scrittura di una stringa
-  di dimensione pari a quella del buffer, in cui ci si dimentica dello zero di
-  terminazione finale.} 
+dalla \acr{glibc} tramite l'uso della variabile di ambiente
+\var{MALLOC\_CHECK\_}. Quando questa viene definita al posto della versione
+ordinaria delle funzioni di allocazione (\func{malloc}, \func{calloc},
+\func{realloc}, e \func{free}) viene usata una versione meno efficiente ma in
+grado di rilevare (e tollerare) alcuni degli errori più semplici, come le
+doppie chiamate a \func{free} o i \itindex{buffer~overrun} \textit{buffer
+  overrun} di un byte.\footnote{uno degli errori più comuni, causato ad
+  esempio dalla scrittura di una stringa di dimensione pari a quella del
+  buffer, in cui ci si dimentica dello zero di terminazione finale.}
 
 In questo caso a seconda del valore assegnato a \var{MALLOC\_CHECK\_} si
 avranno diversi comportamenti: con 0 l'errore sarà ignorato, con 1 verrà
@@ -1237,34 +1237,36 @@ controllo non 
 % mtrace, muntrace, mallinfo e gli hook con le glibc 2.10 c'è pure malloc_info
 % a sostituire mallinfo, vedi http://udrepper.livejournal.com/20948.html
 
-\section{Argomenti, opzioni ed ambiente di un processo}
-\label{sec:proc_options}
 
-Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando
-vengono lanciati. Il passaggio degli argomenti è effettuato attraverso gli
-argomenti \param{argc} e \param{argv} della funzione \func{main}, che vengono
-passati al programma dalla shell (o dal processo che esegue la \func{exec},
-secondo le modalità che vedremo in sez.~\ref{sec:proc_exec}) quando questo
-viene messo in esecuzione.
+\section{Argomenti, ambiente ed altre proprietà di un processo}
+\label{sec:proc_options}
 
-Oltre al passaggio degli argomenti, un'altra modalità che permette di passare
-delle informazioni che modifichino il comportamento di un programma è quello
-dell'uso del cosiddetto \textit{environment} (cioè l'uso delle
-\textsl{variabili di ambiente}). In questa sezione esamineremo le funzioni che
-permettono di gestire argomenti ed opzioni, e quelle che consentono di
-manipolare ed utilizzare le variabili di ambiente.
 
+In questa sezione esamineremo le funzioni che permettono di gestire gli
+argomenti e le opzioni, e quelle che consentono di manipolare ed utilizzare le
+variabili di ambiente. Accenneremo infine alle modalità con cui si può gestire
+la localizzazione di un programma modificandone il comportamento a seconda
+della lingua o del paese a cui si vuole faccia riferimento nelle sue
+operazioni. 
 
 \subsection{Il formato degli argomenti}
 \label{sec:proc_par_format}
 
-In genere il passaggio degli argomenti ad un programma viene effettuato dalla
-shell, che si incarica di leggere la linea di comando e di effettuarne la
-scansione (il cosiddetto \textit{parsing}) per individuare le parole che la
-compongono, ciascuna delle quali viene considerata un argomento. Di norma per
-individuare le parole che andranno a costituire la lista degli argomenti viene
-usato come carattere di separazione lo spazio o il tabulatore, ma la cosa
-dipende ovviamente dalle modalità con cui si effettua il lancio.
+Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando
+vengono lanciati. Il passaggio degli argomenti e delle opzioni è effettuato
+attraverso gli argomenti \param{argc} e \param{argv} della funzione
+\func{main}, che vengono passati al programma dalla shell (o dal processo che
+esegue la \func{exec}, secondo le modalità che vedremo in
+sez.~\ref{sec:proc_exec}) quando questo viene messo in esecuzione.
+
+In genere il passaggio di argomenti ed opzioni ad un programma viene
+effettuato dalla shell, che si incarica di leggere la linea di comando e di
+effettuarne la scansione (il cosiddetto \textit{parsing}) per individuare le
+parole che la compongono, ciascuna delle quali potrà essere considerata un
+argomento o un'opzione. Di norma per individuare le parole che andranno a
+costituire la lista degli argomenti viene usato come carattere di separazione
+lo spazio o il tabulatore, ma la cosa dipende ovviamente dalle modalità con
+cui si effettua la scansione.
 
 \begin{figure}[htb]
   \centering
@@ -1276,9 +1278,9 @@ dipende ovviamente dalle modalit
 
 Indipendentemente da come viene eseguita, il risultato della scansione deve
 essere la costruzione del vettore di puntatori \param{argv} in cui si devono
-inserire in successione i puntatori alle stringhe costituenti i vari
-argomenti, e della variabile \param{argc} che deve essere inizializzata al
-numero di argomenti trovati. Nel caso della shell questo comporta che il primo
+inserire in successione i puntatori alle stringhe costituenti i vari argomenti
+ed opzioni, e della variabile \param{argc} che deve essere inizializzata al
+numero di stringhe passate. Nel caso della shell questo comporta che il primo
 argomento sia sempre il nome del programma; un esempio di questo meccanismo è
 mostrato in fig.~\ref{fig:proc_argv_argc}.
 
@@ -1375,31 +1377,41 @@ opzioni sono spostati in coda al vettore. Oltre a questa esistono altre due
 modalità di gestire gli elementi di \param{argv}; se \param{optstring} inizia
 con il carattere \texttt{'+'} (o è impostata la variabile di ambiente
 \macro{POSIXLY\_CORRECT}) la scansione viene fermata non appena si incontra un
-elemento che non è un'opzione. L'ultima modalità, usata quando un programma
-può gestire la mescolanza fra opzioni e argomenti, ma se li aspetta in un
-ordine definito, si attiva quando \param{optstring} inizia con il carattere
-\texttt{'-'}. In questo caso ogni elemento che non è un'opzione viene
-considerato comunque un'opzione e associato ad un valore di ritorno pari ad 1,
-questo permette di identificare gli elementi che non sono opzioni, ma non
-effettua il riordinamento del vettore \param{argv}.
+elemento che non è un'opzione. 
+
+L'ultima modalità, usata quando un programma può gestire la mescolanza fra
+opzioni e argomenti, ma se li aspetta in un ordine definito, si attiva
+quando \param{optstring} inizia con il carattere \texttt{'-'}. In questo caso
+ogni elemento che non è un'opzione viene considerato comunque un'opzione e
+associato ad un valore di ritorno pari ad 1, questo permette di identificare
+gli elementi che non sono opzioni, ma non effettua il riordinamento del
+vettore \param{argv}.
 
 
 \subsection{Le variabili di ambiente}
 \label{sec:proc_environ}
 
-Oltre agli argomenti passati a linea di comando ogni processo riceve dal
-sistema un \textsl{ambiente}, nella forma di una lista di variabili (detta
-\textit{environment list}) messa a disposizione dal processo, e costruita
-nella chiamata alla funzione \func{exec} quando questo viene lanciato.
-
-Come per la lista degli argomenti anche questa lista è un vettore di puntatori
-a caratteri, ciascuno dei quali punta ad una stringa, terminata da un
+Oltre agli argomenti passati a linea di comando esiste un'altra modalità che
+permette di trasferire ad un processo delle informazioni in modo da
+modificarne il comportamento.  Ogni processo infatti riceve dal sistema, oltre
+alle variabili \param{argv} e \param{argc} anche un \textsl{ambiente} (in
+inglese \textit{environment}); questo viene espresso nella forma di una lista
+(chiamata \textit{environment list}) delle cosiddette \textsl{variabili di
+  ambiente}, i valori di queste variabili possono essere poi usati dal
+programma.
+
+Anche in questo caso la lista delle \textsl{variabili di ambiente} deve essere
+costruita ed utilizzata nella chiamata alla funzione \func{exec} (torneremo su
+questo in sez.~\ref{sec:proc_exec}) quando questo viene lanciato. Come per la
+lista degli argomenti anche questa lista è un vettore di puntatori a
+caratteri, ciascuno dei quali punta ad una stringa, terminata da un
 \val{NULL}. A differenza di \code{argv[]} in questo caso non si ha una
 lunghezza del vettore data da un equivalente di \param{argc}, ma la lista è
 terminata da un puntatore nullo.
 
 L'indirizzo della lista delle variabili di ambiente è passato attraverso la
-variabile globale \var{environ}, a cui si può accedere attraverso una semplice
+variabile globale \var{environ}, che viene definita automaticamente per
+cisascun processo, e a cui si può accedere attraverso una semplice
 dichiarazione del tipo:
 \includecodesnip{listati/env_ptr.c}
 un esempio della struttura di questa lista, contenente alcune delle variabili
@@ -1407,19 +1419,20 @@ pi
 fig.~\ref{fig:proc_envirno_list}.
 \begin{figure}[htb]
   \centering
-  \includegraphics[width=13cm]{img/environ_var}
+  \includegraphics[width=1cm]{img/environ_var}
   \caption{Esempio di lista delle variabili di ambiente.}
   \label{fig:proc_envirno_list}
 \end{figure}
 
 Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo
-\textsl{\texttt{nome=valore}}.  Inoltre alcune variabili, come quelle elencate
-in fig.~\ref{fig:proc_envirno_list}, sono definite dal sistema per essere usate
+\textsl{\texttt{nome=valore}} ed in questa forma che le funzioni di gestione
+che vedremo a breve se le aspettano, se pertanto si dovesse costruire
+manualemente un ambiente si abbia cura di rispettare questa convenzione.
+Inoltre alcune variabili, come quelle elencate in
+fig.~\ref{fig:proc_envirno_list}, sono definite dal sistema per essere usate
 da diversi programmi e funzioni: per queste c'è l'ulteriore convenzione di
-usare nomi espressi in caratteri maiuscoli.\footnote{la convenzione vuole che
-  si usino dei nomi maiuscoli per le variabili di ambiente di uso generico, i
-  nomi minuscoli sono in genere riservati alle variabili interne degli script
-  di shell.}
+usare nomi espressi in caratteri maiuscoli.\footnote{ma si tratta solo di una
+  convenzione, niente vieta di usare caratteri minuscoli.}
 
 Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è
 riservata alle applicazioni e ad alcune funzioni di libreria; in genere esse
@@ -1429,19 +1442,27 @@ configurazione. 
 queste variabili al programma messo in esecuzione attraverso un uso opportuno
 delle relative chiamate (si veda sez.~\ref{sec:proc_exec}).
 
-La shell ad esempio ne usa molte per il suo funzionamento (come \texttt{PATH}
-per la ricerca dei comandi, o \texttt{IFS} per la scansione degli argomenti),
-e alcune di esse (come \texttt{HOME}, \texttt{USER}, ecc.) sono definite al
-login (per i dettagli si veda sez.~\ref{sec:sess_login}). In genere è cura
-dell'amministratore definire le opportune variabili di ambiente in uno script
-di avvio. Alcune servono poi come riferimento generico per molti programmi
-(come \texttt{EDITOR} che indica l'editor preferito da invocare in caso di
-necessità).
+La shell ad esempio ne usa molte per il suo funzionamento, come \texttt{PATH}
+per indicare la lista delle directory in cui effettuare la ricerca dei comandi
+o \texttt{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come
+\texttt{HOME}, \texttt{USER}, ecc. sono invece definite al login (per i
+dettagli si veda sez.~\ref{sec:sess_login}), ed in genere è cura della propria
+distribuzione definire le opportune variabili di ambiente in uno script di
+avvio. Alcune servono poi come riferimento generico per molti programmi, come
+\texttt{EDITOR} che indica l'editor preferito da invocare in caso di
+necessità. Una in particolare, \texttt{LANG}, serve a controllare la
+localizzazione del programma (su cui torneremo in
+sez.~\ref{sec:proc_localization}) per adattarlo alla lingua ed alle convezioni
+dei vari paesi.
 
 Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più
 comuni), come riportato in tab.~\ref{tab:proc_env_var}. GNU/Linux le supporta
-tutte e ne definisce anche altre: per una lista più completa si può
-controllare \cmd{man 5 environ}.
+tutte e ne definisce anche altre, in particolare poi alcune funzioni di
+libreria prevedono la presenza di specifiche variabili di ambiente che ne
+modificano il comportamento, come quelle usate per indicare una localizzazione
+e quelle per indicare un fuso orario; una lista più completa che comprende
+queste ed ulteriori variabili si può ottenere con il comando \cmd{man 7
+  environ}.
 
 \begin{table}[htb]
   \centering
@@ -1537,16 +1558,18 @@ ambiente, i loro prototipi sono i seguenti:
   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ per un
     errore, che è sempre \errval{ENOMEM}.}
 \end{functions}
-\noindent la terza, \funcd{unsetenv}, serve a cancellare una variabile di
-ambiente; il suo prototipo è:
+
+La terza funzione della lista, \funcd{unsetenv}, serve a cancellare una
+variabile dall'ambiente, il suo prototipo è:
 \begin{functions}
   \headdecl{stdlib.h}
   
   \funcdecl{void unsetenv(const char *name)} Rimuove la variabile di ambiente
   \param{name}.
 \end{functions}
-\noindent questa funzione elimina ogni occorrenza della variabile specificata;
-se essa non esiste non succede nulla. Non è prevista (dato che la funzione è
+
+\noindent la funzione elimina ogni occorrenza della variabile specificata; se la
+variabile non esiste non succede nulla. Non è prevista (dato che la funzione è
 \ctyp{void}) nessuna segnalazione di errore.
 
 Per modificare o aggiungere una variabile di ambiente si possono usare sia
@@ -1560,34 +1583,37 @@ La seconda funzione prende come argomento una stringa analoga a quella
 restituita da \func{getenv}, e sempre nella forma \code{NOME=valore}. Se la
 variabile specificata non esiste la stringa sarà aggiunta all'ambiente, se
 invece esiste il suo valore sarà impostato a quello specificato da
-\param{string}. Si tenga presente che, seguendo lo standard SUSv2, le
-\acr{glibc} successive alla versione 2.1.2 aggiungono\footnote{il
-  comportamento è lo stesso delle vecchie \acr{libc4} e \acr{libc5}; nelle
-  \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece fatta una copia,
-  seguendo il comportamento di BSD4.4; dato che questo può dar luogo a perdite
-  di memoria e non rispetta lo standard. Il comportamento è stato modificato a
-  partire dalle 2.1.2, eliminando anche, sempre in conformità a SUSv2,
-  l'attributo \direct{const} dal prototipo.} \param{string} alla lista delle
-variabili di ambiente; pertanto ogni cambiamento alla stringa in questione si
-riflette automaticamente sull'ambiente, e quindi si deve evitare di passare a
-questa funzione una variabile automatica (per evitare i problemi esposti in
-sez.~\ref{sec:proc_auto_var}).
-
-Si tenga infine presente che se si passa a \func{putenv} solo il nome di una
-variabile (cioè \param{string} è nella forma \texttt{NAME} e non contiene un
-carattere \texttt{'='}) allora questa viene cancellata dall'ambiente. Infine
-se la chiamata di \func{putenv} comporta la necessità di allocare una nuova
-versione del vettore \var{environ} questo sarà allocato, ma la versione
-corrente sarà deallocata solo se anch'essa è risultante da un'allocazione
-fatta in precedenza da un'altra \func{putenv}. Questo perché il vettore delle
-variabili di ambiente iniziale, creato dalla chiamata ad \func{exec} (vedi
-sez.~\ref{sec:proc_exec}) è piazzato al di sopra dello \itindex{stack} stack,
-(vedi fig.~\ref{fig:proc_mem_layout}) e non nello \itindex{heap} \textit{heap}
-e non può essere deallocato.  Inoltre la memoria associata alle variabili di
-ambiente eliminate non viene liberata.
-
-L'ultima funzione è \funcd{clearenv}, che viene usata per cancellare
-completamente tutto l'ambiente; il suo prototipo è:
+\param{string}. 
+
+Si tenga presente che, seguendo lo standard SUSv2, le \acr{glibc} successive
+alla versione 2.1.2 aggiungono \param{string} alla lista delle variabili di
+ambiente;\footnote{il comportamento è lo stesso delle vecchie \acr{libc4} e
+  \acr{libc5}; nelle \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece
+  fatta una copia, seguendo il comportamento di BSD4.4; dato che questo può
+  dar luogo a perdite di memoria e non rispetta lo standard. Il comportamento
+  è stato modificato a partire dalle 2.1.2, eliminando anche, sempre in
+  conformità a SUSv2, l'attributo \direct{const} dal prototipo.} pertanto ogni
+cambiamento alla stringa in questione si riflette automaticamente
+sull'ambiente, e quindi si deve evitare di passare a questa funzione una
+variabile automatica (per evitare i problemi esposti in
+sez.~\ref{sec:proc_auto_var}). Si tenga infine presente che se si passa a
+\func{putenv} solo il nome di una variabile (cioè \param{string} è nella forma
+\texttt{NAME} e non contiene un carattere \texttt{'='}) allora questa viene
+cancellata dall'ambiente.
+
+Infine quando chiamata a \func{putenv} comporta la necessità di creare una
+nuova versione del vettore \var{environ} questo sarà allocato automaticamente,
+ma la versione corrente sarà deallocata solo se anch'essa è risultante da
+un'allocazione fatta in precedenza da un'altra \func{putenv}. Questo avviene
+perché il vettore delle variabili di ambiente iniziale, creato dalla chiamata
+ad \func{exec} (vedi sez.~\ref{sec:proc_exec}) è piazzato nella memoria al di
+sopra dello \itindex{stack} stack, (vedi fig.~\ref{fig:proc_mem_layout}) e non
+nello \itindex{heap} \textit{heap} e quindi non può essere deallocato.
+Inoltre la memoria associata alle variabili di ambiente eliminate non viene
+liberata.
+
+L'ultima funzione per la gestione dell'ambiente è \funcd{clearenv}, che viene
+usata per cancellare completamente tutto l'ambiente; il suo prototipo è:
 \begin{functions}
   \headdecl{stdlib.h}
   
@@ -1604,6 +1630,26 @@ ambiente che pu
 alla cancellazione di tutto l'ambiente per costruirne una versione
 ``\textsl{sicura}'' da zero.
 
+\subsection{La localizzazione}
+\label{sec:proc_localization}
+
+Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente
+\texttt{LANG} sia usata per indicare ai processi il valore della cosiddetta
+\textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie
+di sistema\footnote{prenderemo in esame soltanto il caso delle \acr{glibc}.}
+che consente di gestire in maniera automatica sia la lingua in cui vengono
+stampati i vari messaggi (come i messaggi associati agli errori che vedremo in
+sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una
+serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti
+alfabetici, le espressioni della valute, ecc.
+
+La localizzazione di un programma si può selezionare con la 
+
+
+In realtà perché un programma sia effettivamente localizzato non è sufficiente 
+
+% TODO trattare, quando ci sarà tempo, setlocale ed il resto
+
 
 %\subsection{Opzioni in formato esteso}
 %\label{sec:proc_opt_extended}
@@ -1685,7 +1731,7 @@ dette funzioni possono accedere ai loro argomenti.  L'accesso viene pertanto
 realizzato a livello delle librerie standard del C che provvedono gli
 strumenti adeguati.  L'uso di una \textit{variadic function} prevede quindi
 tre punti:
-\begin{itemize}
+\begin{itemize*}
 \item \textsl{Dichiarare} la funzione come \textit{variadic} usando un
   prototipo che contenga una \textit{ellipsis}.
 \item \textsl{Definire} la funzione come \textit{variadic} usando la stessa
@@ -1693,7 +1739,7 @@ tre punti:
   gestione di un numero variabile di argomenti.
 \item \textsl{Invocare} la funzione specificando prima gli argomenti fissi, ed
   a seguire quelli addizionali.
-\end{itemize}
+\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
@@ -1723,7 +1769,7 @@ L'unica modalit
 sequenziale; essi verranno estratti dallo \itindex{stack} \textit{stack}
 secondo l'ordine in cui sono stati scritti. Per fare questo in \file{stdarg.h}
 sono definite delle apposite macro; la procedura da seguire è la seguente:
-\begin{enumerate}
+\begin{enumerate*}
 \item Inizializzare un puntatore alla lista degli argomenti di tipo
   \macro{va\_list} attraverso la macro \macro{va\_start}.
 \item Accedere ai vari argomenti opzionali con chiamate successive alla macro
@@ -1731,7 +1777,7 @@ sono definite delle apposite macro; la procedura da seguire 
   il secondo e così via.
 \item Dichiarare la conclusione dell'estrazione degli argomenti invocando la
   macro \macro{va\_end}.
-\end{enumerate}
+\end{enumerate*}
 In generale è perfettamente legittimo richiedere meno argomenti di quelli che
 potrebbero essere stati effettivamente forniti, e nella esecuzione delle
 \macro{va\_arg} ci si può fermare in qualunque momento ed i restanti argomenti
@@ -1819,7 +1865,7 @@ Esistono varie modalit
 immediate è quella di specificare il numero degli argomenti opzionali come uno
 degli argomenti fissi. Una variazione di questo metodo è l'uso di un argomento
 per specificare anche il tipo degli argomenti (come fa la stringa di formato
-per \func{printf}).
+per \func{printf}). 
 
 Una modalità diversa, che può essere applicata solo quando il tipo degli
 argomenti lo rende possibile, è quella che prevede di usare un valore speciale