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