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