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