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