X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=9e71df19263403dfec12281e20d0a958cb6a41a6;hp=7c104bc36ffa6df64c51f1e217b14b773de7e3b5;hb=b81723c64c1d63b89cd3cec12f2fcccc4a756967;hpb=85e7b3ed7aafdb66a7feda150f68649915a5e85d diff --git a/process.tex b/process.tex index 7c104bc..9e71df1 100644 --- a/process.tex +++ b/process.tex @@ -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 processo; si 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=15 cm]{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