Modifiche minimali
[gapil.git] / process.tex
1 \chapter{L'interfaccia base con i processi}
2 \label{cha:process_interface}
3
4 Come accennato nell'introduzione il processo è l'unità di base con cui un
5 sistema unix-like alloca ed utilizza le risorse.  Questo capitolo tratterà
6 l'interfaccia base fra il sistema e i processi, come vengono passati i
7 parametri, come viene gestita e allocata la memoria, come un processo può
8 richiedere servizi al sistema e cosa deve fare quando ha finito la sua
9 esecuzione. Nella sezione finale accenneremo ad alcune problematiche generiche
10 di programmazione.
11
12 In genere un programma viene eseguito quando un processo lo fa partire
13 eseguendo una funzione della famiglia \func{exec}; torneremo su questo e
14 sulla creazione e gestione dei processi nel prossimo capitolo. In questo
15 affronteremo l'avvio e il funzionamento di un singolo processo partendo dal
16 punto di vista del programma  che viene messo in esecuzione.
17
18
19 \section{Esecuzione e conclusione di un programma}
20
21 Uno dei concetti base di Unix è che un processo esegue sempre uno ed un solo
22 programma: si possono avere più processi che eseguono lo stesso programma ma
23 ciascun processo vedrà la sua copia del codice (in realtà il kernel fa si che
24 tutte le parti uguali siano condivise), avrà un suo spazio di indirizzi,
25 variabili proprie e sarà eseguito in maniera completamente indipendente da
26 tutti gli altri\footnote{questo non è del tutto vero nel caso di un programma
27   \textit{multi-thread}, ma sulla gestione dei \textit{thread} in Linux
28   torneremo più avanti}.
29
30
31 \subsection{La funzione \func{main}} 
32 \label{sec:proc_main}
33
34 Quando un programma viene lanciato il kernel esegue una opportuna routine di
35 avvio, usando il programma \cmd{ld-linux.so}.  Questo programma prima carica
36 le librerie condivise che servono al programma, poi effettua il link dinamico
37 del codice e alla fine lo esegue. Infatti, a meno di non aver specificato il
38 flag \texttt{-static} durante la compilazione, tutti i programmi in Linux sono
39 incompleti e necessitano di essere linkati alle librerie condivise quando
40 vengono avviati.  La procedura è controllata da alcune variabili di ambiente e
41 dal contenuto di \file{/etc/ld.so.conf}. I dettagli sono riportati nella man
42 page di \cmd{ld.so}.
43
44 Il sistema fa partire qualunque programma chiamando la funzione \func{main};
45 sta al programmatore chiamare così la funzione principale del programma da cui
46 si suppone iniziale l'esecuzione; in ogni caso senza questa funzione lo stesso
47 linker darebbe luogo ad errori.
48
49 Lo standard ISO C specifica che la funzione \func{main} può non avere 
50 argomenti o prendere due argomenti che rappresentano gli argomenti passati da
51 linea di comando, in sostanza un prototipo che va sempre bene è il seguente:
52 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
53      int main (int argc, char *argv[])
54 \end{lstlisting}
55
56 In realtà nei sistemi unix esiste un'altro modo per definire la funzione
57 \func{main}, che prevede la presenza di un terzo parametro, \var{char
58   *envp[]}, che fornisce l'\textsl{ambiente} (vedi \secref{sec:proc_environ})
59 del programma; questa forma però non è prevista dallo standard POSIX.1 per cui
60 se si vogliono scrivere programmi portabili è meglio evitarla.
61
62
63 \subsection{Come chiudere un programma}
64 \label{sec:proc_conclusion}
65
66 Normalmente un programma finisce è quando la funzione \func{main} ritorna, una
67 modalità equivalente di chiudere il programma è quella di chiamare
68 direttamente la funzione \func{exit} (che viene comunque chiamata
69 automaticamente quando \func{main} ritorna).  Una forma alternativa è quella
70 di chiamare direttamente la system call \func{\_exit}, che restituisce il
71 controllo direttamente alla routine di conclusione dei processi del kernel.
72
73 Oltre alla conclusione ``normale'' esiste anche la possibilità di una
74 conclusione ``anomala'' del programma a causa della ricezione di un segnale
75 (si veda \capref{cha:signals}) o della chiamata alla funzione \func{abort};
76 torneremo su questo in \secref{sec:proc_termination}.
77
78 Il valore di ritorno della funzione \func{main}, o quello usato nelle chiamate
79 ad \func{exit} e \func{\_exit}, viene chiamato \textsl{stato di uscita} (o
80 \textit{exit status}) e passato al processo che aveva lanciato il programma
81 (in genere la shell). In generale si usa questo valore per fornire
82 informazioni sulla riuscita o il fallimento del programma; l'informazione è
83 necessariamente generica, ed il valore deve essere compreso fra 0 e 255.
84
85 La convenzione in uso pressoché universale è quella di restituire 0 in caso di
86 successo e 1 in caso di fallimento; l'unica eccezione è per i programmi che
87 effettuano dei confronti (come \cmd{diff}), che usano 0 per indicare la
88 corrispondenza, 1 per indicare la non corrispondenza e 2 per indicare
89 l'incapacità di effettuare il confronto. È opportuno adottare una di queste
90 convenzioni a seconda dei casi.  Si tenga presente che se si raggiunge la fine
91 della funzione \func{main} senza ritornare esplicitamente si ha un valore di
92 uscita indefinito, è pertanto consigliabile di concludere sempre in maniera
93 esplicita detta funzione.
94
95 Una altra convenzione riserva i valori da 128 a 256 per usi speciali: ad
96 esempio 128 viene usato per indicare l'incapacità di eseguire un altro
97 programma in un sottoprocesso. Benché questa convenzione non sia
98 universalmente seguita è una buona idea tenerne conto.
99
100 Si tenga presente inoltre che non è una buona idea usare il codice di errore
101 restituito dalla variabile \var{errno} (per i dettagli si veda
102 \secref{sec:sys_errors}) come stato di uscita. In generale infatti una shell
103 non si cura del valore se non per vedere se è diverso da zero; inoltre il
104 valore dello stato di uscita è sempre troncato ad 8 bit, per cui si potrebbe
105 incorrere nel caso in cui restituendo un codice di errore 256, si otterrebbe
106 uno stato di uscita uguale a zero, che verrebbe interpretato come un successo.
107
108 In \file{stdlib.h} sono definite, seguendo lo standard POSIX, le due macro
109 \macro{EXIT\_SUCCESS} e \macro{EXIT\_FAILURE}, da usare sempre per specificare
110 lo stato di uscita di un processo. In Linux esse sono poste rispettivamente ai
111 valori di tipo \type{int} 0 e 1.
112
113
114 \subsection{Le funzioni \func{exit} e \func{\_exit}}
115 \label{sec:proc_exit}
116
117 Come accennato le funzioni usate per effettuare una uscita ``normale'' da un
118 programma sono due, la prima è la funzione \func{exit} che è definita dallo
119 standard ANSI C; ed il cui prototipo è:
120 \begin{prototype}{stdlib.h}{void exit(int status)}
121   Causa la conclusione ordinaria del programma restituendo il valore
122   \var{status} al processo padre.
123
124   \bodydesc{La funzione non ritorna. Il processo viene terminato.}
125 \end{prototype}
126
127 La funzione \func{exit} è pensata per eseguire una conclusione pulita di un
128 programma che usi le librerie standard del C; essa esegue tutte le funzioni
129 che sono state registrate con \func{atexit} e \func{on\_exit} (vedi
130 \secref{sec:proc_atexit}), e chiude tutti gli stream effettuando il
131 salvataggio dei dati sospesi (chiamando \func{fclose}, vedi
132 \secref{sec:file_fopen}), infine passa il controllo al kernel chiamando
133 \func{\_exit} e passando \param{status} come stato di uscita.
134
135 La system call \func{\_exit} restituisce direttamente il controllo al kernel,
136 concludendo immediatamente il processo; i dati sospesi nei buffer degli stream
137 non vengono salvati e le eventuali funzioni registrate con \func{atexit} e
138 \func{on\_exit} non vengono eseguite. Il prototipo della funzione è:
139 \begin{prototype}{unistd.h}{void \_exit(int status)}
140   Causa la conclusione immediata del programma restituendo \param{status} al
141   processo padre come stato di uscita.
142
143   \bodydesc{La funzione non ritorna. Il processo viene terminato.}
144 \end{prototype}
145
146 La funzione chiude tutti i file descriptor appartenenti al processo (si tenga
147 presente che questo non comporta il salvataggio dei dati bufferizzati degli
148 stream), fa si che ogni figlio del processo sia ereditato da \cmd{init} (vedi
149 \secref{cha:process_handling}), manda un segnale \macro{SIGCHLD} al processo
150 padre (vedi \secref{sec:sig_job_control}) ed infine ritorna lo stato di uscita
151 specificato in \param{status} che può essere raccolto usando la funzione
152 \func{wait} (vedi \secref{sec:proc_wait}).
153
154
155 \subsection{Le funzioni \func{atexit} e \func{on\_exit}}
156 \label{sec:proc_atexit}
157
158 Una esigenza comune che si incontra nella programmazione è quella di dover
159 effettuare una serie di operazioni di pulizia (ad esempio salvare dei dati,
160 ripristinare dei settaggi, eliminare dei file temporanei, ecc.) prima della
161 conclusione di un programma. In genere queste operazioni vengono fatte in una
162 apposita sezione del programma, ma quando si realizza una libreria diventa
163 antipatico dover richiedere una chiamata esplicita ad una funzione di pulizia
164 al programmatore che la utilizza.
165
166 È invece molto meno soggetto ad errori, e completamente trasparente
167 all'utente, avere la possibilità di effettuare automaticamente la chiamata ad
168 una funzione che effettui tali operazioni all'uscita dal programma. A questo
169 scopo lo standard ANSI C prevede la possibilità di registrare un certo numero
170 funzioni che verranno eseguite all'uscita dal programma (sia per la chiamata
171 ad \func{exit} che per il ritorno di \func{main}). La prima funzione che si
172 può utilizzare a tal fine è:
173 \begin{prototype}{stdlib.h}{void atexit(void (*function)(void))}
174   Registra la funzione \param{function} per essere chiamata all'uscita dal
175   programma. 
176   
177   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
178     fallimento, \var{errno} non viene settata.}
179 \end{prototype}
180 \noindent la funzione richiede come argomento l'indirizzo della opportuna
181 funzione di pulizia da chiamare all'uscita, che non deve prendere argomenti e
182 non deve ritornare niente (deve essere essere cioè definita come \code{void
183   function(void)}).
184
185 Una estensione di \func{atexit} è la funzione \func{on\_exit}, che le
186 \acr{glibc} includono per compatibilità con SunOS, ma che non è detto sia
187 definita su altri sistemi; il suo prototipo è:
188 \begin{prototype}{stdlib.h}
189 {void on\_exit(void (*function)(int status, void *arg), void *arg)}
190   Registra la funzione \param{function} per essere chiamata all'uscita dal
191   programma. Tutte le funzioni registrate vengono chiamate in ordine inverso
192   rispetto a quello di registrazione.
193   
194   \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
195     fallimento, \var{errno} non viene settata.}
196 \end{prototype}
197
198 In questo caso la funzione da chiamare prende due parametri, il primo dei
199 quali sarà inizializzato allo stato di uscita con cui è stata chiamata
200 \func{exit} ed il secondo al puntatore generico specificato come secondo
201 argomento nella chiamata di \func{on\_exit}. Così diventa possibile passare
202 dei dati alla funzione di chiusura.
203
204 Nella sequenza di chiusura tutte le funzioni registrate verranno chiamate in
205 ordine inverso rispetto a quello di registrazione (ed una stessa funzione
206 registrata più volte sarà chiamata più volte); poi verranno chiusi tutti gli
207 stream aperti, infine verrà chiamata \func{\_exit}.
208
209
210 \subsection{Conclusioni}
211 \label{sec:proc_term_conclusion}
212
213 Data l'importanza dell'argomento è opportuno sottolineare ancora una volta che
214 in un sistema unix l'unico modo in cui un programma può essere eseguito dal
215 kernel è attraverso la chiamata alla system call \func{execve} (o attraverso
216 una delle funzioni della famiglia \func{exec} che vedremo in
217 \secref{sec:proc_exec}).
218
219 Allo stesso modo l'unico modo in cui un programma può concludere
220 volontariamente la sua esecuzione è attraverso una chiamata alla system call
221 \func{\_exit}, o esplicitamente, o in maniera indiretta attraverso l'uso di
222 \func{exit} o il ritorno di \func{main}.
223
224 Uno schema riassuntivo che illustra le modalità con cui si avvia e conclude
225 normalmente un programma è riportato in \nfig.
226
227 \begin{figure}[htb]
228   \centering
229   \includegraphics[width=12cm]{img/proc_beginend}
230   \caption{Schema dell'avvio e della conclusione di un programma.}
231   \label{fig:proc_prog_start_stop}
232 \end{figure}
233
234 Si ricordi infine che un programma può anche essere interrotto dall'esterno
235 attraverso l'uso di un segnale (modalità di conclusione non mostrata in
236 \curfig); torneremo su questo aspetto in \capref{cha:signals}.
237
238
239
240 \section{I processi e l'uso della memoria}
241 \label{sec:proc_memory}
242
243 Una delle risorse base che ciascun processo ha a disposizione è la memoria, e
244 la gestione della memoria è appunto uno degli aspetti più complessi di un
245 sistema unix-like. In questa sezione, dopo una breve introduzione ai concetti
246 base, esamineremo come la memoria viene vista da parte di un programma in
247 esecuzione, e le varie funzioni utilizzabili per la sua gestione.
248
249
250 \subsection{I concetti generali}
251 \label{sec:proc_mem_gen}
252
253 Ci sono vari modi in cui i vari sistemi organizzano la memoria (ed i dettagli
254 di basso livello dipendono spesso in maniera diretta dall'architettura
255 dell'hardware), ma quello più tipico, usato dai sistemi unix-like come Linux è
256 la cosiddetta \textsl{memoria virtuale}m che consiste nell'assegnare ad ogni
257 processo uno spazio virtuale di indirizzamento lineare, in cui gli indirizzi
258 vanno da zero ad un qualche valore massimo\footnote{nel caso di Linux fino al
259   kernel 2.2 detto massimo era, per macchine a 32bit, di 2Gb, con il kernel
260   2.4 ed il supporto per la \textit{high-memory} il limite è stato esteso}.
261
262 Come accennato in \capref{cha:intro_unix} questo spazio di indirizzi è
263 virtuale e non corrisponde all'effettiva posizione dei dati nella RAM del
264 computer; in genere detto spazio non è neppure continuo (cioè non tutti gli
265 indirizzi possibili sono utilizzabili, e quelli usabili non sono
266 necessariamente adiacenti).
267
268 Per la gestione da parte del kernel la memoria virtuale viene divisa in pagine
269 di dimensione fissa (che ad esempio sono di 4kb su macchine a 32 bit e 8kb
270 sulle alpha, valori strettamente connessi all'hardware di gestione della
271 memoria), e ciascuna pagina della memoria virtuale è associata ad un supporto
272 che può essere una pagina di memoria reale o ad un dispositivo di stoccaggio
273 secondario (in genere lo spazio disco riservato alla swap, o i file che
274 contengono il codice).
275
276 Lo stesso pezzo di memoria reale (o di spazio disco) può fare da supporto a
277 diverse pagine di memoria virtuale appartenenti a processi diversi (come
278 accade in genere per le pagine che contengono il codice delle librerie
279 condivise). Ad esempio il codice della funzione \func{printf} starà su una
280 sola pagina di memoria reale che farà da supporto a tutte le pagine di memoria
281 virtuale di tutti i processi hanno detta funzione nel loro codice. 
282
283 La corrispondenza fra le pagine della memoria virtuale e quelle della memoria
284 fisica della macchina viene gestita in maniera trasparente dall'hardware di
285 gestione della memoria (la \textit{Memory Management Unit} del processore).
286 Poiché in genere quest'ultima è solo una piccola frazione della memoria
287 virtuale, è necessario un meccanismo che permetta di trasferire le pagine che
288 servono dal supporto su cui si trovano in memoria, eliminando quelle che non
289 servono. Questo meccanismo è detto \textit{paging}, ed è uno dei compiti
290 principali del kernel.
291
292 Quando un processo cerca di accedere ad una pagina che non è nella memoria
293 reale, avviene quello che viene chiamato un \textit{page fault}; l'hardware di
294 gestione della memoria genera una interruzione e passa il controllo al kernel
295 il quale sospende il processo e si incarica di mettere in RAM la pagina
296 richiesta (effettuando tutte le operazioni necessarie per reperire lo spazio
297 necessario), per poi restituire il controllo al processo.
298
299 Dal punto di vista di un processo questo meccanismo è completamente
300 trasparente, e tutto avviene come se tutte le pagine fossero sempre
301 disponibili in memoria.  L'unica differenza avvertibile è quella dei tempi di
302 esecuzione, che passano dai pochi nanosecondi necessari per l'accesso in RAM,
303 a tempi molto più lunghi, dovuti all'intervento del kernel. 
304
305 Normalmente questo è il prezzo da pagare per avere un multitasking reale, ed
306 in genere il sistema è molto efficiente in questo lavoro; quando però ci siano
307 esigenze specifiche di prestazioni è possibile usare delle funzioni che
308 permettono di bloccare il meccanismo del paging e mantenere fisse delle pagine
309 in memoria (vedi \ref{sec:proc_mem_lock}).
310
311
312 \subsection{La struttura della memoria di un processo}
313 \label{sec:proc_mem_layout}
314
315 Benché lo spazio di indirizzi virtuali copra un intervallo molto ampio, solo
316 una parte di essi è effettivamente allocato ed utilizzabile dal processo; il
317 tentativo di accedere ad un indirizzo non allocato è un tipico errore che si
318 commette quando si è manipolato male un puntatore e genera quello che viene
319 chiamato un \textit{segmentation fault}. Se si tenta cioè di leggere o
320 scrivere da un indirizzo per il quale non esiste una associazione della pagina
321 virtuale il kernel risponde al relativo \textit{page fault}, mandando un
322 segnale \macro{SIGSEGV} al processo, che normalmente ne causa la terminazione
323 immediata.
324
325 È pertanto importante capire come viene strutturata la memoria virtuale di un
326 processo. Essa viene divisa in \textsl{segmenti}, cioè un insieme contiguo di
327 indirizzi virtuali ai quali il processo può accedere. Solitamente un
328 programma C viene suddiviso nei seguenti segmenti:
329
330 \begin{enumerate}
331 \item Il segmento di testo o \textit{text segment}. Contiene il codice del
332   programma, delle funzioni di librerie da esso utilizzate, e le costanti.
333   Normalmente viene condiviso fra tutti i processi che eseguono lo stesso
334   programma (e anche da processi che eseguono altri programmi nel caso delle
335   librerie).  Viene marcato in sola lettura per evitare sovrascritture
336   accidentali (o maliziose) che ne modifichino le istruzioni.
337   
338   Viene allocato da \func{exec} all'avvio del programma e resta invariato
339   per tutto il tempo dell'esecuzione.
340   
341 \item Il segmento dei dati o \textit{data segment}. Contiene le variabili
342   globali (cioè quelle definite al di fuori di tutte le funzioni che
343   compongono il programma) e le variabili statiche (cioè quelle dichiarate con
344   l'attributo \type{static}). Di norma è diviso in due parti.
345   
346   La prima parte è il segmento dei dati inizializzati, che contiene le
347   variabili il cui valore è stato assegnato esplicitamente. Ad esempio
348   se si definisce:
349   \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
350     double pi = 3.14;
351   \end{lstlisting}
352   questo valore sarà immagazzinato in questo segmento. La memoria di questo
353   segmento viene preallocata all'avvio del programma e inizializzata ai valori
354   specificati.
355   
356   La seconda parte è il segmento dei dati non inizializzati, che contiene le
357   variabili il cui valore è stato non è assegnato esplicitamente. Ad esempio
358   se si definisce:
359   \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
360     int vect[100];
361   \end{lstlisting}
362   questo valore sarà immagazzinato in questo segmento. Anch'esso viene
363   allocato all'avvio, e tutte le variabili vengono inizializzate a
364   zero (ed i puntatori a \macro{NULL}). 
365   
366   Storicamente questo segmento viene chiamato BBS (da \textit{block started by
367     symbol}). La sua dimensione è fissa.
368   
369 \item Lo \textit{heap}. Tecnicamente lo si può considerare l'estensione del
370   segmento dati, a cui di solito è posto giusto di seguito. È qui che avviene
371   l'allocazione dinamica della memoria; può essere ridimensionato allocando e
372   disallocando la memoria dinamica con le apposite funzioni (vedi
373   \secref{sec:proc_mem_alloc}), ma il suo limite inferiore (quello adiacente
374   al segmento dati) ha una posizione fissa.
375   
376 \item Il segmento di \textit{stack}, che contiene lo \textit{stack} del
377   programma.  Tutte le volte che si effettua una chiamata ad una funzione è
378   qui che viene salvato l'indirizzo di ritorno e le informazioni dello stato
379   del chiamante (tipo il contenuto di alcuni registri della CPU). Poi la
380   funzione chiamata alloca qui lo spazio per le sue variabili locali: in
381   questo modo le funzioni possono essere chiamate ricorsivamente. Al ritorno
382   della funzione lo spazio è automaticamente rilasciato.
383   
384   La dimensione di questo segmento aumenta seguendo la crescita dello stack
385   del programma, ma non viene ridotta quando quest'ultimo si restringe.
386 \end{enumerate}
387
388 \begin{figure}[htb]
389   \centering
390   \includegraphics[width=5cm]{img/memory_layout}
391   \caption{Disposizione tipica dei segmenti di memoria di un processo}
392   \label{fig:proc_mem_layout}
393 \end{figure}
394
395 Una disposizione tipica di questi segmenti è riportata in
396 \figref{fig:proc_mem_layout}. Usando il comando \cmd{size} su un programma se
397 ne può stampare le dimensioni dei segmenti di testo e di dati (inizializzati e
398 BSS); si tenga presente però che il BSS non è mai salvato sul file che
399 contiene l'eseguibile, dato che viene sempre inizializzato a zero al
400 caricamento del programma.
401
402
403 \subsection{Allocazione della memoria per i programmi C}
404 \label{sec:proc_mem_alloc}
405
406 Il C supporta, a livello di linguaggio, soltanto due modalità di allocazione
407 della memoria: l'\textsl{allocazione statica} e l'\textsl{allocazione
408   automatica}.
409
410 L'\textsl{allocazione statica} è quella con cui sono memorizzate le variabili
411 globali e le variabili statiche, cioè le variabili il cui valore deve essere
412 mantenuto per tutta la durata del programma. Come accennato queste variabili
413 vengono allocate nel segmento dei dati all'avvio del programma (come parte
414 delle operazioni svolte da \func{exec}) e lo spazio da loro occupato non viene
415 liberato fino alla sua conclusione.
416
417 L'\textsl{allocazione automatica} è quella che avviene per gli argomenti di
418 una funzione e per le sue variabili locali (le cosiddette \textsl{variabili
419   automatiche}), che esistono solo per la durata della funzione.  Lo spazio
420 per queste variabili viene allocato nello stack quando viene eseguita la
421 funzione e liberato quando si esce dalla medesima.
422
423 Esiste però un terzo tipo di allocazione, l'\textsl{allocazione dinamica della
424   memoria}, che non è prevista direttamente all'interno del linguaggio C, ma
425 che è necessaria quando il quantitativo di memoria che serve è determinabile
426 solo durante il corso dell'esecuzione del programma.
427
428 Il C non consente di usare variabili allocate dinamicamente, non è possibile
429 cioè definire in fase di programmazione una variabile le cui dimensioni
430 possano essere modificate durante l'esecuzione del programma. Per questo le
431 librerie del C forniscono una serie opportuna di funzioni per eseguire
432 l'allocazione dinamica di memoria (in genere nello heap). Le variabili il
433 cui contenuto è allocato in questo modo non potranno essere usate direttamente
434 come le altre, ma l'accesso sarà possibile solo in maniera indiretta,
435 attraverso dei puntatori.
436
437
438 \subsection{Le funzioni \func{malloc}, \func{calloc}, \func{realloc} e
439   \func{free}}
440 \label{sec:proc_mem_malloc}
441
442 Le funzioni previste dallo standard ANSI C per la gestione della memoria sono
443 quattro: \func{malloc}, \func{calloc}, \func{realloc} e \func{free}, i loro
444 prototipi sono i seguenti:
445 \begin{functions}
446 \headdecl{stdlib.h}
447 \funcdecl{void *calloc(size\_t size)}
448   Alloca \var{size} byte nello heap. La memoria viene inizializzata a 0.
449   
450   La funzione restituisce il puntatore alla zona di memoria allocata in caso
451   di successo e \macro{NULL} in caso di fallimento, nel qual caso
452   \var{errno} viene settata a \macro{ENOMEM}.
453 \funcdecl{void *malloc(size\_t size)}
454   Alloca \var{size} byte nello heap. La memoria non viene inizializzata.
455
456   La funzione restituisce il puntatore alla zona di memoria allocata in caso
457   di successo e \macro{NULL} in caso di fallimento, nel qual caso
458   \var{errno} viene settata a \macro{ENOMEM}.
459 \funcdecl{void *realloc(void *ptr, size\_t size)}
460   Cambia la dimensione del blocco allocato all'indirizzo \var{ptr}
461   portandola a \var{size}.
462
463   La funzione restituisce il puntatore alla zona di memoria allocata in caso
464   di successo e \macro{NULL} in caso di fallimento, nel qual caso
465   \var{errno} viene settata a \macro{ENOMEM}.
466 \funcdecl{void free(void *ptr)}
467   Disalloca lo spazio di memoria puntato da \var{ptr}.
468
469   La funzione non ritorna nulla e non riporta errori.
470 \end{functions}
471 Il puntatore ritornato dalle funzioni di allocazione è garantito essere sempre
472 allineato correttamente per tutti i tipi di dati; ad esempio sulle macchine a
473 32 bit in genere è allineato a multipli di 4 byte e sulle macchine a 64 bit a
474 multipli di 8 byte.
475
476 In genere su usano le funzioni \func{malloc} e \func{calloc} per allocare
477 dinamicamente la memoria necessaria al programma, e siccome i puntatori
478 ritornati sono di tipo generico non è necessario effettuare un cast per
479 assegnarli a puntatori al tipo di variabile per la quale si effettua la
480 allocazione.
481
482 La memoria allocata dinamicamente deve essere esplicitamente rilasciata usando
483 \func{free}\footnote{le glibc provvedono anche una funzione \func{cfree}
484   definita per compatibilità con SunOS, che è deprecata.} una volta che non
485 sia più necessaria. Questa funzione vuole come parametro un puntatore
486 restituito da una precedente chiamata a una qualunque delle funzioni di
487 allocazione che non sia già stato liberato da un'altra chiamata a \func{free},
488 in caso contrario il comportamento della funzione è indefinito.
489
490 La funzione \func{realloc} si usa invece per cambiare (in genere aumentare) la
491 dimensione di un'area di memoria precedentemente allocata, la funzione vuole
492 in ingresso il puntatore restituito dalla precedente chiamata ad una
493 \func{malloc} (se è passato un valore \macro{NULL} allora la funzione si
494 comporta come \func{malloc}\footnote{questo è vero per Linux e
495   l'implementazione secondo lo standard ANSI C, ma non è vero per alcune
496   vecchie implementazioni, inoltre alcune versioni delle librerie del C
497   consentivano di usare \func{realloc} anche per un puntatore liberato con
498   \func{free} purché non ci fossero state nel frattempo altre chiamate a
499   funzioni di allocazione, questa funzionalità è totalmente deprecata e non è
500   consentita sotto Linux.}), ad esempio quando si deve far crescere la
501 dimensione di un vettore. In questo caso se è disponibile dello spazio
502 adiacente al precedente la funzione lo utilizza, altrimenti rialloca altrove
503 un blocco della dimensione voluta, copiandoci automaticamente il contenuto; lo
504 spazio aggiunto non viene inizializzato.
505
506 Si deve sempre avere ben presente il fatto che il blocco di memoria restituito
507 da \func{realloc} può non essere una estensione di quello che gli si è passato
508 in ingresso; per questo si dovrà \emph{sempre} eseguire la riassegnazione di
509 \var{ptr} al valore di ritorno della funzione, e reinizializzare o provvedere
510 ad un adeguato aggiornamento di tutti gli altri puntatori all'interno del
511 blocco di dati ridimensionato.
512
513 Un errore abbastanza frequente (specie se si ha a che fare con array di
514 puntatori) è quello di chiamare \func{free} più di una volta sullo stesso
515 puntatore; per evitare questo problema una soluzione di ripiego è quella di
516 assegnare sempre a \macro{NULL} ogni puntatore liberato con \func{free}, dato
517 che, quando il parametro è un puntatore nullo, \func{free} non esegue nessuna
518 operazione.
519
520 Le \acr{glibc} hanno una implementazione delle routine di allocazione che è
521 controllabile dall'utente attraverso alcune variabili di ambiente, in
522 particolare diventa possibile tracciare questo tipo di errori usando la
523 variabile \macro{MALLOC\_CHECK\_} che quando viene definita mette in uso una
524 versione meno efficiente delle funzioni, che però è più tollerante nei
525 confronti di piccoli errori come quello di chiamate doppie a \func{free}; in
526 particolare:
527 \begin{itemize*}
528 \item se la variabile è posta a zero gli errori vengono ignorati.
529 \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error}
530   (vedi \secref{sec:file_std_stream}).
531 \item se è posta a 2 viene chiamata \func{abort}, che in genere causa
532   l'immediata conclusione del programma.
533 \end{itemize*}
534
535 Il problema più comune e più difficile da risolvere che si incontra con le
536 routine di allocazione è quando non viene opportunamente liberata la memoria
537 non più utilizzata, quello che in inglese viene chiamato \textit{memory-leak},
538 (cioè \textsl{perdita di memoria}).
539
540 Un caso tipico che illustra il problema è quello in cui l'allocazione di una
541 variabile viene fatta da una subroutine per un uso locale, ma la memoria non
542 viene liberata; la funzione esce e la memoria resta allocata.  Chiamate
543 ripetute alla stessa subroutine continueranno ad allocarne ancora, causando a
544 lungo andare un esaurimento della memoria disponibile e l'impossibilità di
545 proseguire il programma. Il problema è che l'esaurimento che può avvenire in
546 qualunque momento, e senza nessuna relazione con la subroutine che contiene
547 l'errore, per questo motivo è sempre complesso trovare un \textit{memory
548   leak}.
549
550 Per ovviare a questi problemi l'implementazione delle routine di allocazione
551 delle \acr{glibc} mette a disposizione una serie di funzionalità (su cui
552 torneremo in \secref{sec:xxx_advanced}) che permettono di tracciare le
553 allocazioni e le disallocazione, e definisce anche una serie di possibili
554 \textsl{ganci} che permettono di sostituire alle funzioni di libreria una
555 propria versione (che può essere più o meno specializzata per il debugging).
556
557
558 \subsection{La funzione \func{alloca}}  
559 \label{sec:proc_mem_alloca}
560
561 Una alternativa possibile all'uso di \func{malloc}, che non soffre dei di
562 problemi di memory leak descritti in precedenza, è la funzione \func{alloca},
563 che invece di allocare la memoria nello heap usa il segmento di stack della
564 funzione corrente. La sintassi è identica a quella di \func{malloc}, il suo
565 prototipo è:
566 \begin{prototype}{stdlib.h}{void *alloca(size\_t size)}
567   Alloca \var{size} byte nel segmento di stack della funzione chiamante.
568   La memoria non viene inizializzata.
569
570   La funzione restituisce il puntatore alla zona di memoria allocata in caso
571   di successo e \macro{NULL} in caso di fallimento, nel qual caso
572   \var{errno} viene settata a \macro{ENOMEM}.
573 \end{prototype}
574 \noindent ma in questo caso non è più necessario liberare la memoria (e quindi
575 non esiste un analogo della \func{free}) in quanto essa viene rilasciata 
576 automaticamente al ritorno della funzione.
577
578 Come è evidente questa funzione ha molti vantaggi, anzitutto permette di
579 evitare alla radice i problemi di memory leak, dato che non serve più la
580 deallocazione esplicita; inoltre la deallocazione automatica funziona anche
581 quando si usa \func{longjmp} per uscire da una subroutine con un salto non
582 locale da una funzione (vedi \secref{sec:proc_longjmp}).
583
584 Un altro vantaggio è che in Linux la funzione è molto più veloce di
585 \func{malloc} e non viene sprecato spazio, infatti non è necessario gestire un
586 pool di memoria da riservare e si evitano così anche i problemi di
587 frammentazione di quest'ultimo, che comportano inefficienze sia
588 nella allocazione della memoria che nella esecuzione della allocazione.
589
590 Gli svantaggi sono che questa funzione non è disponibile su tutti gli Unix, e
591 non è inserita né nello standard POSIX né in SUSv3 (ma è presente in BSD), il
592 suo utilizzo quindi limita la portabilità dei programmi. Inoltre la funzione
593 non può essere usata nella lista degli argomenti di una funzione, perché lo
594 spazio verrebbe allocato nel mezzo degli stessi.
595
596 % Questo è riportato solo dal manuale delle glibc, nelle man page non c'è 
597 % traccia di tutto ciò
598 %
599 %Inoltre se si
600 %cerca di allocare troppa memoria non si ottiene un messaggio di errore, ma un
601 %segnale di \textit{segment violation} analogo a quello che si avrebbe da una
602 %ricorsione infinita.
603
604 Inoltre non è chiaramente possibile usare \func{alloca} per allocare memoria
605 che deve poi essere usata anche al di fuori della funzione in cui essa viene
606 chiamata, dato che all'uscita dalla funzione lo spazio allocato diventerebbe
607 libero, e potrebbe essere sovrascritto all'invocazione di nuove funzioni.
608 Questo è lo stesso problema che si può avere con le variabili automatiche, su
609 cui torneremo in \secref{sec:proc_auto_var}.
610
611
612 \subsection{Le funzioni \func{brk} e \func{sbrk}}  
613 \label{sec:proc_mem_sbrk}
614
615 L'uso di queste funzioni è necessario solo quando si voglia accedere alle
616 analoghe system call a cui fanno da interfaccia. I loro prototipi sono:
617 \begin{functions}
618   \headdecl{unistd.h}
619   \funcdecl{int brk(void *end\_data\_segment)}
620   Sposta la fine del segmento dei dati all'indirizzo specificato da
621   \var{end\_data\_segment}.
622   
623   La funzione restituisce 0 in caso di successo e -1 in caso di
624     fallimento, nel qual caso \var{errno} viene settata a \macro{ENOMEM}.
625
626   \funcdecl{void *sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un
627   programma di \var{increment}. Un valore zero restituisce l'attuale posizione
628   della fine del segmento dati.
629   
630   La funzione restituisce il puntatore all'inizio della nuova zona di memoria
631   allocata in caso di successo e \macro{NULL} in caso di fallimento, nel qual
632   caso \macro{errno} viene settata a \macro{ENOMEM}.
633 \end{functions}
634 \noindent in genere si usa \func{sbrk} con un valore zero per ottenere
635 l'attuale posizione della fine del segmento dati.
636
637 Queste funzioni sono state deliberatamente escluse dallo standard POSIX.1 e
638 per i programmi normali è sempre opportuno usare le funzioni di allocazione
639 standard descritte in precedenza, che sono costruite su di esse.  L'uso di
640 queste funzione è ristretto alle specifiche necessità di chi debba
641 implementare una sua versione delle routine di allocazione.  
642
643
644 % \subsection{La personalizzazione delle funzioni di allocazione} 
645 % \label{sec:proc_mem_malloc_custom}
646
647
648 \subsection{Il controllo della memoria virtuale}  
649 \label{sec:proc_mem_lock}
650
651 Come spiegato in \secref{sec:proc_mem_gen} il kernel gestisce la memoria in
652 maniera trasparente ai processi, decidendo quando rimuovere pagine dalla
653 memoria per metterle nello swap, sulla base dell'utilizzo corrente da parte
654 dei vari processi.
655
656 Nell'uso comune un processo non deve preoccuparsi di tutto ciò, in quanto il
657 meccanismo della paginazione riporta in RAM, ed in maniera trasparente, tutte
658 le pagine che gli occorrono; esistono però esigenze particolari in cui non si
659 vuole che questo meccanismo si attivi. In generale i motivi per cui si possono
660 avere di queste necessità sono due:
661 \begin{itemize}
662 \item \textsl{La velocità}. Il processo della paginazione è trasparente solo
663   se il programma in esecuzione se non è sensibile al tempo che occorre a
664   riportare la pagina in memoria; per questo motivi processi critici che hanno
665   esigenze di tempo reale o tolleranze critiche nella risposte (ad esempio
666   processi che trattano campionamenti sonori) possono non essere in grado di
667   sopportare le variazioni della velocità di accesso dovuta alla paginazione.
668
669   In certi casi poi un programmatore può conoscere meglio dell'algoritmo di
670   allocazione delle pagine le esigenze specifiche del suo programma e decidere
671   quali pagine di memoria è opportuno che restino in memoria per un aumento
672   delle prestazioni. In genere queste sono esigenze particolari e richiedono
673   anche un aumento delle priorità in esecuzione (vedi \secref{sec:xxx_xxx}).
674   
675 \item \textsl{La sicurezza}. Se si hanno password o chiavi segrete in chiaro
676   in memoria queste possono essere portate su disco dal meccanismo della
677   paginazione. Questo rende più lungo il periodo di tempo in cui detti segreti
678   sono presenti in chiaro e più complessa la loro cancellazione (ad un
679   processo è possibile cancellare la memoria su cui scrive le sue variabili,
680   ma non può toccare lo spazio disco su cui una pagina di memoria può essere
681   stata salvata). Per questo motivo di solito i programmi di crittografia
682   richiedono il blocco di alcune pagine di memoria.
683 \end{itemize}
684
685 Il meccanismo che previene la paginazione di parte della memoria virtuale di
686 un processo è chiamato \textit{memory locking} (o \textsl{blocco della
687   memoria}). Il blocco è sempre associato alle pagine della memoria virtuale
688 del processo, e non al segmento reale di RAM su cui essa viene mantenuta.
689
690 La regola è che se un segmento di RAM fa da supporto ad almeno una pagina
691 bloccata allora esso viene escluso dal meccanismo della paginazione. I blocchi
692 non si accumulano, se si blocca due volte la stessa pagina non è necessario
693 sbloccarla due volte, una pagina o è bloccata oppure no.
694
695 Il \textit{memory lock} persiste fintanto che il processo che detiene la
696 memoria bloccata non la sblocca. Chiaramente la terminazione del processo
697 comporta anche la fine dell'uso della sua memoria virtuale, e quindi anche di
698 tutti i suoi \textit{memory lock}.
699
700 I \textit{memory lock} non sono ereditati dai processi figli\footnote{ma
701   siccome Linux usa il copy on write gli indirizzi virtuali del figlio sono
702   mantenuti sullo stesso segmento di RAM del padre, quindi fintanto che un
703   figlio non scrive su un segmento, può usufruire dei memory lock del padre}.
704 Siccome la presenza di un \textit{memory lock} riduce la memoria disponibile
705 al sistema, con un impatto su tutti gli altri processi, solo l'amministratore
706 ha la capacità di bloccare una pagina. Ogni processo può però sbloccare le sue
707 pagine.
708
709 Il sistema pone dei limiti all'ammontare di memoria di un processo che può
710 essere bloccata e al totale di memoria fisica che può dedicare a questo, lo
711 standard POSIX.1 richiede che sia definita in \file{unistd.h} la costante
712 \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il
713 \textit{memory locking} e la costante \macro{PAGESIZE} in \file{limits.h} per
714 indicare la dimensione di una pagina in byte.
715
716 Le funzioni per bloccare e sbloccare singole sezioni di memoria sono
717 \func{mlock} e \func{munlock}; i loro prototipi sono:
718 \begin{functions}
719   \headdecl{sys/mman.h} 
720
721   \funcdecl{int mlock(const void *addr, size\_t len)}
722   Blocca la paginazione per l'intervallo di memoria da \var{addr} per
723   \var{len} byte. Tutte le pagine che contengono una parte dell'intervallo
724   sono mantenute in RAM per tutta la durata del blocco.
725
726   \funcdecl{int munlock(const void *addr, size\_t len)}
727   Sblocca l'intervallo di memoria da \var{addr} per \var{len} byte.  
728
729   
730   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in
731     caso di errore, nel qual caso \var{errno} è settata ad uno dei
732     valori seguenti:
733   \begin{errlist}
734   \item[\macro{ENOMEM}] alcuni indirizzi dell'intervallo specificato non
735     corrispondono allo spazio di indirizzi del processo o si è ecceduto
736     il numero massimo consentito di pagine bloccate.
737   \item[\macro{EINVAL}] \var{len} non è un valore positivo.
738   \end{errlist}
739   e, per \func{mlock}, anche \macro{EPERM} quando il processo non ha i
740   privilegi richiesti per l'operazione.}
741 \end{functions}
742
743 Altre due funzioni, \func{mlockall} e \func{munlockall}, consentono di
744 bloccare genericamente lo spazio di indirizzi di un processo.  I prototipi di
745 queste funzioni sono:
746
747 \begin{functions}
748   \headdecl{sys/mman.h} 
749
750   \funcdecl{int mlockall(int flags)}
751   Blocca la paginazione per lo spazio di indirizzi del processo corrente. 
752   
753   \funcdecl{int munlockall(void)}
754   Sblocca la paginazione per lo spazio di indirizzi del processo corrente. 
755   
756   \bodydesc{Codici di ritorno ed errori sono gli stessi di \func{mlock}
757     e \func{munlock}.}
758 \end{functions}
759
760 Il parametro \var{flags} di \func{mlockall} permette di controllarne il
761 comportamento; esso può essere specificato come l'OR aritmetico delle due
762 costanti: 
763 \begin{basedescript}{\desclabelwidth{2.5cm}}
764 \item[\macro{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello
765   spazio di indirizzi del processo.
766 \item[\macro{MCL\_FUTURE}] blocca tutte le pagine che saranno mappate nello
767   spazio di indirizzi del processo.
768 \end{basedescript}
769
770 Con \func{mlockall} si può bloccare tutte le pagine mappate nello spazio di
771 indirizzi del processo, sia che comprendano il segmento di testo, di dati, lo
772 stack, lo heap e pure le funzioni di libreria chiamate, i file mappati in
773 memoria, i dati del kernel mappati in user space, la memoria condivisa.  L'uso
774 dei flag permette di selezionare con maggior finezza le pagine da bloccare, ad
775 esempio limitandosi a tutte le pagine allocate a partire da un certo momento.
776
777 In ogni caso un processo real-time che deve entrare in una sezione critica
778 deve provvedere a riservare memoria sufficiente prima dell'ingresso, per
779 scongiurare in partenza un eventuale page fault causato dal meccanismo di copy
780 on write.  In genere questo si fa chiamando una funzione che ha allocato una
781 quantità sufficiente ampia di variabili automatiche, in modo che esse vengano
782 mappate in RAM dallo stack, e poi ci scrive sopra.
783
784
785
786 \section{Parametri, opzioni ed ambiente di un processo}
787 \label{sec:proc_options}
788
789 Tutti i programmi hanno la possibilità di ricevere parametri e opzioni quando
790 vengono lanciati. Il passaggio dei parametri è effettuato attraverso gli
791 argomenti \var{argc} e \var{argv} della funzione \func{main}, che vengono
792 passati al programma dalla shell (o dal processo che esegue la \func{exec},
793 secondo le modalità che vedremo in \secref{sec:proc_exec}) quando questo viene
794 messo in esecuzione. 
795
796 Oltre al passaggio dei parametri, un'altra modalità che permette di passare
797 delle informazioni che modifichino il comportamento di un programma è quello
798 dell'uso del cosiddetto \textit{environment} (cioè l'uso delle
799 \textsl{variabili di ambiente}). In questa sezione esamineremo le funzioni che
800 permettono di gestire parametri e opzioni, e quelle che consentono di
801 manipolare ed utilizzare le variabili di ambiente.
802
803
804 \subsection{Il formato dei parametri}
805 \label{sec:proc_par_format}
806 In genere passaggio dei parametri al programma viene effettuato dalla shell,
807 che si incarica di leggere la linea di comando e di effettuarne la scansione
808 (il cosiddetto \textit{parsing}) per individuare le parole che la compongono,
809 ciascuna delle quali viene considerata un parametro. Di norma per individuare
810 le parole viene usato come carattere di separazione lo spazio o il tabulatore,
811 ma il comportamento è modificabile attraverso il settaggio della variabile di
812 ambiente \cmd{IFS}.
813
814 \begin{figure}[htb]
815   \centering
816   \includegraphics[width=11cm]{img/argv_argc}
817   \caption{Esempio dei valori di \var{argv} e \var{argc} generati nella 
818     scansione di una riga di comando.}
819   \label{fig:proc_argv_argc}
820 \end{figure}
821
822 Nella scansione viene costruito il vettore di puntatori \var{argv} inserendo
823 in successione il puntatore alla stringa costituente l'$n$-simo parametro; la
824 variabile \var{argc} viene inizializzata al numero di parametri trovati, in
825 questo modo il primo parametro è sempre il nome del programma; un esempio di
826 questo meccanismo è mostrato in \curfig.
827
828
829 \subsection{La gestione delle opzioni}
830 \label{sec:proc_opt_handling}
831
832 In generale un programma unix riceve da linea di comando sia gli argomenti che
833 le opzioni, queste ultime sono standardizzate per essere riconosciute come
834 tali: un elemento di \var{argv} che inizia con \texttt{-} e che non sia un
835 singolo \texttt{-} o un \texttt{--} viene considerato un'opzione.  In genere
836 le opzioni sono costituite da una lettera singola (preceduta dal \cmd{-}) e
837 possono avere o no un parametro associato; un comando tipico può essere quello
838 mostrato in \figref{fig:proc_argv_argc}. In quel caso le opzioni sono \cmd{-r}
839 ed \cmd{-m} e la prima vuole un parametro mentre la seconda no
840 (\cmd{questofile.txt} è un argomento del programma, non un parametro di
841 \cmd{-m}).
842
843 Per gestire le opzioni all'interno dei argomenti a linea di comando passati in
844 \var{argv} le librerie standard del C forniscono la funzione \func{getopt}
845 che ha il seguente prototipo:
846 \begin{prototype}{unistd.h}
847 {int getopt(int argc, char *const argv[], const char *optstring)}
848 Esegue il parsing degli argomenti passati da linea di comando
849 riconoscendo le possibili opzioni segnalate con \var{optstring}.
850
851 \bodydesc{Ritorna il carattere che segue l'opzione, \cmd{':'} se manca un
852   parametro all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e -1 se non
853   esistono altre opzioni.}
854 \end{prototype}
855
856 Questa funzione prende come argomenti le due variabili \var{argc} e \var{argv}
857 passate a \func{main} ed una stringa che indica quali sono le opzioni valide;
858 la funzione effettua la scansione della lista degli argomenti ricercando ogni
859 stringa che comincia con \cmd{-} e ritorna ogni volta che trova una opzione
860 valida.
861
862 La stringa \var{optstring} indica quali sono le opzioni riconosciute ed è
863 costituita da tutti i caratteri usati per identificare le singole opzioni, se
864 l'opzione ha un parametro al carattere deve essere fatto seguire un segno di
865 due punti \var{':'}; nel caso di \figref{fig:proc_argv_argc} ad esempio la
866 stringa di opzioni avrebbe dovuto contenere \var{"r:m"}.
867
868 La modalità di uso di \func{getopt} è pertanto quella di chiamare più volte la
869 funzione all'interno di un ciclo, fintanto che essa non ritorna il valore -1
870 che indica che non ci sono più opzioni. Nel caso si incontri un'opzione non
871 dichiarata in \var{optstring} viene ritornato il carattere \texttt{'?'}
872 mentre se un opzione che lo richiede non è seguita da un parametro viene
873 ritornato il carattere \texttt{':'}, infine se viene incontrato il valore
874 \cmd{--} la scansione viene considerata conclusa, anche se vi sono altri
875 elementi di \var{argv} che cominciano con il carattere \texttt{'-'}.
876
877 \begin{figure}[htb]
878   \footnotesize
879     \begin{lstlisting}{}
880     opterr = 0;  /* don't want writing to stderr */
881     while ( (i = getopt(argc, argv, "hp:c:e:")) != -1) {
882         switch (i) {
883         /* 
884          * Handling options 
885          */ 
886         case 'h':   /* help option */
887             printf("Wrong -h option use\n");
888             usage();
889             return -1;
890             break;
891         case 'c':   /* take wait time for childen */
892             wait_child = strtol(optarg, NULL, 10);    /* convert input */
893             break;
894         case 'p':   /* take wait time for childen */
895             wait_parent = strtol(optarg, NULL, 10);   /* convert input */
896             break;
897         case 'e':   /* take wait before parent exit */
898             wait_end = strtol(optarg, NULL, 10);      /* convert input */
899             break;
900         case '?':   /* unrecognized options */
901             printf("Unrecognized options -%c\n",optopt);
902             usage();
903         default:    /* should not reached */
904             usage();
905         }
906     }
907     debug("Optind %d, argc %d\n",optind,argc);
908   \end{lstlisting}
909   \caption{Esempio di codice per la gestione delle opzioni.}
910   \label{fig:proc_options_code}
911 \end{figure}
912
913 Quando la funzione trova un'opzione essa ritorna il valore numerico del
914 carattere, in questo modo si possono eseguire azioni specifiche usando uno
915 \code{switch}; \func{getopt} inoltre inizializza alcune variabili globali:
916 \begin{itemize*}
917 \item \var{char *optarg} contiene il puntatore alla stringa parametro
918   dell'opzione.
919 \item \var{int optind} alla fine della scansione restituisce l'indice del
920   primo elemento di \var{argv} che non è un'opzione.
921 \item \var{int opterr} previene, se posto a zero, la stampa di un messaggio
922   di errore in caso di riconoscimento di opzioni non definite.
923 \item \var{int optopt} contiene il carattere dell'opzione non riconosciuta.
924 \end{itemize*}
925
926 In \figref{fig:proc_options_code} è mostrata la sezione del programma
927 \file{ForkTest.c} (che useremo nel prossimo capitolo per effettuare dei test
928 sulla creazione dei processi) deputata alla decodifica delle opzioni a riga di
929 comando. 
930
931 Anzitutto si può notare che si è anzitutto (\texttt{\small 1}) disabilitata la
932 stampa di messaggi di errore per opzioni non riconosciute, per poi passare al
933 ciclo per la verifica delle opzioni (\texttt{\small 2-27}); per ciascuna delle
934 opzioni possibili si è poi provveduto ad una opportuna azione, ad esempio per
935 le tre opzioni che prevedono un parametro si è effettuata la decodifica del
936 medesimo (il cui indirizzo è contenuto nella variabile \var{optarg})
937 avvalorando la relativa variabile (\texttt{\small 12-14}, \texttt{\small
938   15-17} e \texttt{\small 18-20}). Completato il ciclo troveremo in
939 \var{optind} l'indice in \var{argv[]} del primo degli argomenti a linea di
940 comando restanti.
941
942 Normalmente \func{getopt} compie una permutazione degli elementi di \var{argv}
943 così che alla fine della scansione gli elementi che non sono opzioni sono
944 spostati in coda al vettore. Oltre a questa esistono altre due modalità di
945 gestire gli elementi di \var{argv}; se \var{optstring} inizia con il carattere
946 \texttt{'+'} (o è settata la variabile di ambiente \macro{POSIXLY\_CORRECT})
947 la scansione viene fermata non appena si incontra un elemento che non è
948 un'opzione. L'ultima modalità, usata quando un programma può gestire la
949 mescolanza fra opzioni e argomenti, ma se li aspetta in un ordine definito, si
950 attiva quando \var{optstring} inizia con il carattere \texttt{'-'}. In questo
951 caso ogni elemento che non è un'opzione viene considerato comunque un'opzione
952 e associato ad un valore di ritorno pari ad 1, questo permette di identificare
953 gli elementi che non sono opzioni, ma non effettua il riordinamento del
954 vettore \var{argv}.
955
956
957 \subsection{Opzioni in formato esteso}
958 \label{sec:proc_opt_extended}
959
960 Un'estensione di questo schema è costituito dalle cosiddette
961 \textit{long-options} espresse nella forma \cmd{--option=parameter}, anche la
962 gestione di queste ultime è stata standardizzata attraverso l'uso di una
963 versione estesa di \func{getopt}.
964
965 (NdA: da finire).
966
967
968 \subsection{Le variabili di ambiente}
969 \label{sec:proc_environ}
970
971 Oltre agli argomenti passati a linea di comando ogni processo riceve dal
972 sistema un \textsl{ambiente}, nella forma di una lista di variabili (detta
973 \textit{environment list}) messa a disposizione dal processo, e costruita
974 nella chiamata alla funzione \func{exec} quando questo viene lanciato.
975
976 Come per la lista dei parametri anche questa lista è un array di puntatori a
977 caratteri, ciascuno dei quali punta ad una stringa, terminata da un
978 \macro{NULL}. A differenza di \var{argv[]} in questo caso non si ha una
979 lunghezza dell'array data da un equivalente di \var{argc}, ma la lista è
980 terminata da un puntatore nullo.
981
982 L'indirizzo della lista delle variabili di ambiente è passato attraverso la
983 variabile globale \var{environ}, a cui si può accedere attraverso una semplice
984 dichiarazione del tipo:
985 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
986 extern char ** environ;
987 \end{lstlisting}
988 un esempio del contenuto dell'ambiente, in si è riportato un estratto delle
989 variabili che normalmente sono definite dal sistema, è riportato in \nfig.
990 \begin{figure}[htb]
991   \centering
992   \includegraphics[width=11cm]{img/environ_var}
993   \caption{Esempio di lista delle variabili di ambiente.}
994   \label{fig:proc_envirno_list}
995 \end{figure}
996
997 Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo
998 \textsl{\texttt{nome=valore}}. Inoltre alcune variabili, come quelle elencate
999 in \curfig, sono definite dal sistema per essere usate da diversi programmi e
1000 funzioni: per queste c'è l'ulteriore convenzione di usare nomi espressi in
1001 caratteri maiuscoli.
1002
1003 Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è
1004 riservata alle applicazioni e ad alcune funzioni di libreria; in genere esse
1005 costituiscono un modo comodo per definire un comportamento specifico senza
1006 dover ricorrere all'uso di opzioni a linea di comando o di file di
1007 configurazione. 
1008
1009 La shell ad esempio ne usa molte per il suo funzionamento (come \var{PATH} per
1010 la ricerca dei comandi, o \cmd{IFS} per la scansione degli argomenti), e
1011 alcune di esse (come \var{HOME}, \var{USER}, etc.)  sono definite al login. In
1012 genere è cura dell'amministratore definire le opportune variabili di ambiente
1013 in uno script di avvio. Alcune servono poi come riferimento generico per molti
1014 programmi (come \var{EDITOR} che indica l'editor preferito da invocare in caso
1015 di necessità).
1016
1017 Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più
1018 comuni), come riportato in \ntab. GNU/Linux le supporta tutte e ne definisce
1019 anche altre: per una lista più completa si può controllare \cmd{man environ}.
1020
1021 \begin{table}[htb]
1022   \centering
1023   \begin{tabular}[c]{|l|c|c|c|p{7cm}|}
1024     \hline
1025     \textbf{Variabile} & \textbf{POSIX} & \textbf{XPG3} 
1026     & \textbf{Linux} & \textbf{Descrizione} \\
1027     \hline
1028     \hline
1029     \macro{USER} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\
1030     \macro{LOGNAME} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\
1031     \macro{HOME} & $\bullet$ & $\bullet$ & $\bullet$ & 
1032     Directory base dell'utente\\
1033     \macro{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\
1034     \macro{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory
1035     dei programmi\\
1036     \macro{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\
1037     \macro{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\
1038     \macro{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\
1039     \macro{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i
1040     testi\\
1041     \macro{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor di default\\
1042     \macro{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser di default\\
1043     \hline
1044   \end{tabular}
1045   \caption{Variabile di ambiente più comuni definite da vari standard}
1046   \label{tab:proc_env_var}
1047 \end{table}
1048
1049 Lo standard ANSI C prevede l'esistenza di un ambiente, pur non entrando nelle
1050 specifiche di come sono strutturati i contenuti, e definisce la funzione
1051 \func{getenv} che permette di ottenere i valori delle variabili di ambiente,
1052 il cui prototipo è:
1053 \begin{prototype}{stdlib.h}{char *getenv(const char *name)}
1054   Esamina l'ambiente del processo cercando una stringa che corrisponda a
1055   quella specificata da \param{name}. 
1056   
1057   \bodydesc{La funzione ritorna \macro{NULL} se non trova nulla, o il
1058     puntatore alla stringa che corrisponde (di solito nella forma
1059     \cmd{NOME=valore}).}
1060 \end{prototype}
1061
1062 Oltre a questa funzione di lettura, che è l'unica definita dallo standard ANSI
1063 C, nell'evoluzione dei sistemi Unix ne sono state proposte altre, da
1064 utilizzare per settare e per cancellare le variabili di ambiente. Uno schema
1065 delle funzioni previste nei vari standard e disponibili in Linux è riportato
1066 in \ntab.
1067
1068 \begin{table}[htb]
1069   \centering
1070   \begin{tabular}[c]{|l|c|c|c|c|c|c|}
1071     \hline
1072     \textbf{Funzione} & \textbf{ANSI C} & \textbf{POSIX.1} & \textbf{XPG3} & 
1073     \textbf{SVr4} & \textbf{BSD} & \textbf{Linux} \\
1074     \hline
1075     \hline
1076     \func{getenv} & $\bullet$ &  $\bullet$ & $\bullet$ & 
1077       $\bullet$ & $\bullet$ & $\bullet$ \\
1078     \func{setenv} &   &   &    & 
1079         & $\bullet$ & $\bullet$ \\
1080     \func{unsetenv} &  &   &    & 
1081         & $\bullet$ & $\bullet$ \\
1082     \func{putenv} &  & opz.  & $\bullet$ & 
1083         & $\bullet$ & $\bullet$ \\
1084     \func{clearenv} &  & opz.  &    & 
1085         &  &  \\
1086     \hline
1087   \end{tabular}
1088   \caption{Funzioni per la gestione delle variabili di ambiente.}
1089   \label{tab:proc_env_func}
1090 \end{table}
1091
1092 In Linux solo le prime quattro funzioni di \curtab\ sono definite,
1093 \func{getenv} l'abbiamo già esaminata; delle tre restanti le prime due,
1094 \func{putenv} e \func{setenv}, servono per assegnare nuove variabili di
1095 ambiente, i loro prototipi sono i seguenti:
1096 \begin{functions}
1097   \headdecl{stdlib.h} 
1098   
1099   \funcdecl{int setenv(const char *name, const char *value, int overwrite)}
1100   Setta la variabile di ambiente \param{name} al valore \param{value}.
1101   
1102   \funcdecl{int putenv(char *string)} Aggiunge la stringa \param{string}
1103   all'ambiente.
1104   
1105   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un
1106     errore, che è sempre \macro{ENOMEM}.}
1107 \end{functions}
1108 \noindent la terza, \func{unsetenv}, serve a cancellare una variabile di
1109 ambiente; il suo prototipo è:
1110 \begin{functions}
1111   \headdecl{stdlib.h}
1112   
1113   \funcdecl{void unsetenv(const char *name)} Rimuove la variabile di ambiente
1114   \param{name}.
1115 \end{functions}
1116 \noindent questa funzione elimina ogni occorrenza della variabile specificata;
1117 se essa non esiste non succede nulla. Non è prevista (dato che la funzione è
1118 \type{void}) nessuna segnalazione di errore.
1119
1120 Per modificare o aggiungere una variabile di ambiente si possono usare sia
1121 \func{setenv} che \func{putenv}. La prima permette di specificare
1122 separatamente nome e valore della variabile di ambiente, inoltre il valore di
1123 \param{overwrite} specifica il comportamento della funzione nel caso la
1124 variabile esista già, sovrascrivendola se diverso da zero, lasciandola
1125 immutata se uguale a zero.
1126
1127 La seconda funzione prende come parametro una stringa analoga quella
1128 restituita da \func{getenv}, e sempre nella forma \var{NOME=valore}. Se la
1129 variabile specificata non esiste la stringa sarà aggiunta all'ambiente, se
1130 invece esiste il suo valore sarà settato a quello specificato da
1131 \param{string}. Si tenga presente che, seguendo lo standard SUSv2, le
1132 \acr{glibc} successive alla versione 2.1.2 aggiungono\footnote{il
1133   comportamento è lo stesso delle vecchie \acr{libc4} e \acr{libc5}; nelle
1134   \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece fatta una copia,
1135   seguendo il comportamento di BSD4.4; dato che questo può dar luogo a perdite
1136   di memoria e non rispetta lo standard. Il comportamento è stato modificato a
1137   partire dalle 2.1.2, eliminando anche, sempre in conformità a SUSv2,
1138   l'attributo \type{const} dal prototipo.} \func{string} alla lista delle
1139 variabili di ambiente; pertanto ogni cambiamento alla stringa in questione si
1140 riflette automaticamente sull'ambiente, e quindi si deve evitare di passare a
1141 questa funzione una variabile automatica (per evitare i problemi esposti in
1142 \secref{sec:proc_auto_var}).
1143
1144 Si tenga infine presente che se si passa a \func{putenv} solo il nome di una
1145 variabile (cioè \param{string} è nella forma \texttt{NAME} e non contiene un
1146 \texttt{=}) allora questa viene cancellata dall'ambiente. Infine se la chiamata
1147 di \func{putenv} comporta la necessità di allocare una nuova versione del
1148 vettore \var{environ} questo sarà allocato, ma la versione corrente sarà
1149 deallocata solo se anch'essa è risultante da una allocazione fatta in
1150 precedenza da un'altra \func{putenv}, il vettore originale (in genere piazzato
1151 al di sopra dello stack, vedi \figref{fig:proc_mem_layout}), o la memoria
1152 associata alle variabili di ambiente eliminate non viene comunque liberata.
1153
1154
1155 \section{Problematiche di programmazione generica}
1156 \label{sec:proc_gen_prog}
1157
1158 Benché questo non sia un libro di C, è opportuno affrontare alcune delle
1159 problematiche generali che possono emergere nella programmazione e di quali
1160 precauzioni o accorgimenti occorre prendere per risolverle. Queste
1161 problematiche non sono specifiche di sistemi unix-like o multitasking, ma
1162 avendo trattato in questo capitolo il comportamento dei processi visti come
1163 entità a se stanti, le riportiamo qui.
1164
1165
1166 \subsection{Il passaggio delle variabili e dei valori di ritorno}
1167 \label{sec:proc_var_passing}
1168
1169 Una delle caratteristiche standard del C è che le variabili vengono passate
1170 alle subroutine attraverso un meccanismo che viene chiamato \textit{by value}
1171 (diverso ad esempio da quanto avviene con il Fortran, dove le variabili sono
1172 passate, come suol dirsi, \textit{by reference}, o dal C++ dove la modalità
1173 del passaggio può essere controllata con l'operatore \cmd{\&}).
1174
1175 Il passaggio di una variabile \textit{by value} significa che in realtà quello
1176 che viene passato alla subroutine è una copia del valore attuale di quella
1177 variabile, copia che la subroutine potrà modificare a piacere, senza che il
1178 valore originale nella routine chiamante venga toccato. In questo modo non
1179 occorre preoccuparsi di eventuali effetti delle operazioni della subroutine
1180 sulla variabile passata come parametro.
1181
1182 Questo però va inteso nella maniera corretta. Il passaggio \textit{by value}
1183 vale per qualunque variabile, puntatori compresi; quando però in una
1184 subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in
1185 realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche
1186 se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e
1187 le eventuali modifiche avranno effetto e saranno visibili anche nella routine
1188 chiamante.
1189
1190 Nella maggior parte delle funzioni di libreria e delle system call i puntatori
1191 vengono usati per scambiare dati (attraverso buffer o strutture) e le
1192 variabili semplici vengono usate per specificare parametri; in genere le
1193 informazioni a riguardo dei risultati vengono passate alla routine chiamante
1194 attraverso il valore di ritorno.  È buona norma seguire questa pratica anche
1195 nella programmazione normale.
1196
1197
1198 Talvolta però è necessario che la funzione possa restituire indietro alla
1199 funzione chiamante un valore relativo ad uno dei suoi parametri.  Per far
1200 questo si usa il cosiddetto \textit{value result argument}, si passa cioè,
1201 invece di una normale variabile, un puntatore alla stessa; vedremo alcuni
1202 esempi di questa modalità nelle funzioni che gestiscono i socket (in
1203 \secref{sec:TCPel_functions}), in cui, per permettere al kernel di restituire
1204 informazioni sulle dimensioni delle strutture degli indirizzi utilizzate,
1205 viene usato questo meccanismo.
1206
1207
1208 \subsection{Il passaggio di un numero variabile di argomenti}
1209 \label{sec:proc_variadic}
1210
1211 Come vedremo nei capitoli successivi, non sempre è possibile specificare un
1212 numero fisso di parametri per una funzione.  Lo standard ISO C prevede nella
1213 sua sintassi la possibilità di definire delle \textit{variadic function} che
1214 abbiano un numero variabile di argomenti, attraverso l'uso della
1215 \textit{ellipsis} \var{...} nella dichiarazione della funzione; ma non
1216 provvede a livello di linguaggio alcun meccanismo con cui dette funzioni
1217 possono accedere ai loro argomenti.
1218
1219 L'accesso viene invece realizzato dalle librerie standard che provvedono gli
1220 strumenti adeguati.  L'uso delle \textit{variadic function} prevede tre punti:
1221 \begin{itemize*}
1222 \item \textsl{Dichiarare} la funzione come \textit{variadic} usando un
1223   prototipo che contenga una \textit{ellipsis}.
1224 \item \textsl{Definire} la funzione come \textit{variadic} usando lo stesso
1225   \textit{ellipsis}, ed utilizzare le apposite macro che consentono la
1226   gestione di un numero variabile di argomenti.
1227 \item \textsl{Chiamare} la funzione specificando prima gli argomenti fissi, e
1228   a seguire gli addizionali.
1229 \end{itemize*}
1230
1231 Lo standard ISO C prevede che una \textit{variadic function} abbia sempre
1232 almeno un argomento fisso; prima di effettuare la dichiarazione deve essere
1233 incluso l'apposito header file \file{stdarg.h}; un esempio di dichiarazione è
1234 il prototipo della funzione \func{execl} che vedremo in
1235 \secref{sec:proc_exec}:
1236 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
1237   int execl(const char *path, const char *arg, ...);
1238 \end{lstlisting}
1239 in questo caso la funzione prende due parametri fissi ed un numero variabile
1240 di altri parametri (che verranno a costituire gli elementi successivi al primo
1241 del vettore \var{argv} passato al nuovo processo). Lo standard ISO C richiede
1242 inoltre che l'ultimo degli argomenti fissi sia di tipo
1243 \textit{self-promoting}\footnote{il linguaggio C prevede che quando si
1244   mescolano vari tipi di dati, alcuni di essi possano essere \textsl{promossi}
1245   per compatibilità; ad esempio i tipi \type{float} vengono convertiti
1246   automaticamente a \type{double} ed i \type{char} e gli \type{short} ad
1247   \type{int}. Un tipo \textit{self-promoting} è un tipo che verrebbe promosso
1248   a se stesso.} il che esclude array, puntatori a funzioni e interi di tipo
1249 \type{char} o \type{short} (con segno o meno). Una ulteriore restrizione di
1250 alcuni compilatori è di non dichiarare l'ultimo parametro fisso come
1251 \type{register}.
1252
1253 Una volta dichiarata la funzione il secondo passo è accedere ai vari parametri
1254 quando la si va a definire. I parametri fissi infatti hanno un loro nome, ma
1255 quelli variabili vengono indicati in maniera generica dalla ellipsis.
1256
1257 L'unica modalità in cui essi possono essere recuperati è pertanto quella
1258 sequenziale; essi verranno estratti dallo stack secondo l'ordine in cui sono
1259 stati scritti. Per fare questo in \file{stdarg.h} sono definite delle apposite
1260 macro; la procedura da seguire è la seguente:
1261 \begin{enumerate*}
1262 \item Inizializzare un puntatore alla lista degli argomenti di tipo
1263   \type{va\_list} attraverso la macro \macro{va\_start}.
1264 \item Accedere ai vari argomenti opzionali con chiamate successive alla macro
1265   \macro{va\_arg}, la prima chiamata restituirà il primo argomento, la seconda
1266   il secondo e così via.
1267 \item Dichiarare la conclusione dell'estrazione dei parametri invocando la
1268   macro \macro{va\_end}.
1269 \end{enumerate*}
1270 in generale è perfettamente legittimo richiedere meno argomenti di quelli che
1271 potrebbero essere stati effettivamente forniti, e nella esecuzione delle
1272 \macro{va\_arg} ci si può fermare in qualunque momento ed i restanti argomenti
1273 saranno ignorati; se invece si richiedono più argomenti di quelli forniti si
1274 otterranno dei valori indefiniti. Nel caso del \cmd{gcc} poi l'uso della macro
1275 \macro{va\_end} è inutile, ma si consiglia di usarlo ugualmente per
1276 compatibilità.
1277
1278 Le definizioni delle tre macro sono le seguenti:
1279 \begin{functions}
1280   \headdecl{stdarg.h}
1281   
1282   \funcdecl{void va\_start(va\_list ap, last)} Inizializza il puntatore alla
1283   lista di argomenti \param{ap}; il parametro \param{last} \emph{deve} essere
1284   l'ultimo dei parametri fissi.
1285   
1286   \funcdecl{type va\_arg(va\_list ap, type)} Restituisce il valore del
1287   successivo parametro opzionale, modificando opportunamente \param{ap}; la
1288   macro richiede che si specifichi il tipo dell'argomento attraverso il
1289   parametro \param{type} che deve essere il nome del tipo dell'argomento in
1290   questione. Il tipo deve essere \textit{self-promoting}.
1291
1292   \funcdecl{void va\_end(va\_list ap)} Conclude l'uso di \param{ap}.
1293 \end{functions}
1294
1295 In generale si possono avere più puntatori alla lista degli argomenti,
1296 ciascuno andrà inizializzato con \macro{va\_start} e letto con \macro{va\_arg}
1297 e ciascuno potrà scandire la lista degli argomenti per conto suo. 
1298
1299 Dopo l'uso di \macro{va\_end} la variabile \var{ap} diventa indefinita e
1300 successive chiamate a \macro{va\_arg} non funzioneranno. Si avranno risultati
1301 indefiniti anche chiamando \macro{va\_arg} specificando un tipo che non
1302 corrisponde a quello del parametro.
1303
1304 Un altro limite delle macro è che i passi 1) e 3) devono essere eseguiti nel
1305 corpo principale della funzione, il passo 2) invece può essere eseguito anche
1306 in una subroutine passandole il puntatore alla lista di argomenti; in questo
1307 caso però si richiede che al ritorno della funzione il puntatore non venga più
1308 usato (lo standard richiederebbe la chiamata esplicita di \macro{va\_end}),
1309 dato che il valore di \var{ap} risulterebbe indefinito.
1310
1311 Esistono dei casi in cui è necessario eseguire più volte la scansione dei
1312 parametri e poter memorizzare una posizione durante la stessa.  La cosa più
1313 naturale in questo caso sembrerebbe quella di copiarsi il puntatore alla lista
1314 degli argomenti con una semplice assegnazione. Dato che una delle
1315 realizzazioni più comuni di \macro{va\_list} è quella di un puntatore nello
1316 stack all'indirizzo dove sono stati salvati i parametri, è assolutamente
1317 normale pensare di poter effettuare questa operazione.
1318
1319 In generale però possono esistere anche realizzazioni diverse, per questo
1320 motivo \macro{va\_list} è definito come tipo opaco e non può essere assegnato
1321 direttamente ad un altra variabile dello stesso tipo. Per risolvere questo
1322 problema lo standard ISO C99\footnote{alcuni sistemi che non hanno questa
1323   macro provvedono al suo posto \macro{\_\_va\_copy} che era il nome proposto
1324   in una bozza dello standard} ha previsto una ulteriore macro che permette di
1325 eseguire la copia di un puntatore alla lista degli argomenti:
1326 \begin{prototype}{stdarg.h}{void va\_copy(va\_list dest, va\_list src)}
1327   Copia l'attuale valore \param{src} del puntatore alla lista degli argomenti
1328   su \param{dest}.
1329 \end{prototype}
1330 \noindent anche in questo caso è buona norma chiudere ogni esecuzione di una
1331 \macro{va\_copy} con una corrispondente \macro{va\_end} sul nuovo puntatore
1332 alla lista degli argomenti.
1333
1334 La chiamata di una funzione con un numero variabile di argomenti, posto che la
1335 si sia dichiarata e definita come tale, non prevede nulla di particolare;
1336 l'invocazione è identica alle altre, con i parametri, sia quelli fissi che
1337 quelli opzionali, separati da virgole. Quello che però è necessario tenere
1338 presente è come verranno convertiti gli argomenti variabili. 
1339
1340 In Linux gli argomenti dello stesso tipo sono passati allo stesso modo, sia
1341 che siano fissi sia che siano opzionali (alcuni sistemi trattano diversamente
1342 gli opzionali), ma dato che il prototipo non può specificare il tipo degli
1343 argomenti opzionali, questi verranno sempre promossi, pertanto nella ricezione
1344 dei medesimi occorrerà tenerne conto (ad esempio un \type{char} verrà visto da
1345 \macro{va\_arg} come \type{int}).
1346
1347
1348 Uno dei problemi che si devono affrontare con le funzioni con un numero
1349 variabile di argomenti è che non esiste un modo generico che permetta di
1350 stabilire quanti sono i parametri passati effettivamente in una chiamata.
1351
1352 Esistono varie modalità per affrontare questo problema; una delle più
1353 immediate è quella di specificare il numero degli argomenti opzionali come uno
1354 degli argomenti fissi. Una variazione di questo metodo è l'uso di un parametro
1355 per specificare anche il tipo degli argomenti (come fa la stringa di formato
1356 per \func{printf}).
1357
1358 Una modalità diversa, che può essere applicata solo quando il tipo dei
1359 parametri lo rende possibile, è quella che prevede di usare un valore speciale
1360 come ultimo argomento (come fa ad esempio \func{execl} che usa un puntatore
1361 \macro{NULL} per indicare la fine della lista degli argomenti).
1362
1363
1364 \subsection{Potenziali problemi con le variabili automatiche}
1365 \label{sec:proc_auto_var}
1366
1367 Uno dei possibili problemi che si possono avere con le subroutine è quello di
1368 restituire alla funzione chiamante dei dati che sono contenuti in una
1369 variabile automatica.  Ovviamente quando la subroutine ritorna la sezione
1370 dello stack che conteneva la variabile automatica potrà essere riutilizzata da
1371 una nuova funzione, con le immaginabili conseguenze di sovrapposizione e
1372 sovrascrittura dei dati.
1373
1374 Per questo una delle regole fondamentali della programmazione in C è che
1375 all'uscita di una funzione non deve restare nessun riferimento alle variabili
1376 locali; qualora sia necessario utilizzare variabili che possano essere viste
1377 anche dalla funzione chiamante queste devono essere allocate esplicitamente, o
1378 in maniera statica (usando variabili di tipo \type{static} o \type{extern}), o
1379 dinamicamente con una delle funzioni della famiglia \func{malloc}.
1380
1381 \subsection{Il controllo di flusso non locale}
1382 \label{sec:proc_longjmp}
1383
1384 Il controllo del flusso di un programma in genere viene effettuato con le
1385 varie istruzioni del linguaggio C, la più bistrattata delle quali è il
1386 \code{goto}, ampiamente deprecato in favore di costrutti più puliti; esiste
1387 però un caso in l'uso di questa istruzione porta all'implementazione più
1388 efficiente, quello dell'uscita in caso di errore.
1389
1390 Il C però non consente di effettuare un salto ad una label definita in
1391 un'altra funzione, per cui se l'errore avviene in funzioni profondamente
1392 annidate occorre usare quello che viene chiamato un salto \textsl{non-locale};
1393 questo viene fatto usando salvando il contesto dello stack nel punto in cui si
1394 vuole tornare in caso di errore, e ripristinandolo quando l'occorrenza capita.
1395
1396
1397 La funzione che permette di salvare il contesto dello stack è \func{setjmp},
1398 il cui prototipo è:
1399
1400 \begin{functions}
1401   \headdecl{setjmp.h}
1402   \funcdecl{void setjmp(jmp\_buf env)}
1403   
1404   Salva il contesto dello stack in \param{env} per un successivo uso da parte
1405   di \func{longjmp}. Il contesto viene invalidato se la routine che ha
1406   chiamato \func{setjmp} ritorna.
1407   
1408   \bodydesc{La funzione ritorna zero quando è chiamata direttamente e un
1409     valore diverso da zero quando ritorna da una chiamata di \func{longjmp}
1410     che usa il contesto salvato in precedenza.}
1411 \end{functions}
1412
1413
1414 Per poter effettuare un salto non locale si usa la funzione \func{longjmp}; il
1415 suo prototipo è:
1416 \begin{functions}
1417   \headdecl{setjmp.h}
1418   \funcdecl{void longjmp(jmp\_buf env, int val)}
1419   
1420   Ripristina il contesto dello stack salvato dall'ultima chiamata di
1421   \func{setjmp} con l'argomento \param{env}. Il programma prosegue dal ritorno
1422   di \func{setjmp} con un valore \param{val}. Il valore di \param{val} deve
1423   essere diverso da zero, se viene specificato 0 sarà usato 1 al suo posto.
1424
1425   \bodydesc{La funzione non ritorna.}
1426 \end{functions}
1427
1428
1429 %%% Local Variables: 
1430 %%% mode: latex
1431 %%% TeX-master: "gapil"
1432 %%% End: