Inizio della revisione del formato per la suddivisione in due parti,
[gapil.git] / process.tex
1 %% process.tex
2 %%
3 %% Copyright (C) 2000-2011 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
12 \chapter{L'interfaccia base con i processi}
13 \label{cha:process_interface}
14
15 Come accennato nell'introduzione il \textsl{processo} è l'unità di base con
16 cui un sistema unix-like alloca ed utilizza le risorse.  Questo capitolo
17 tratterà l'interfaccia base fra il sistema e i processi, come vengono passati
18 gli argomenti, come viene gestita e allocata la memoria, come un processo può
19 richiedere servizi al sistema e cosa deve fare quando ha finito la sua
20 esecuzione. Nella sezione finale accenneremo ad alcune problematiche generiche
21 di programmazione.
22
23 In genere un programma viene eseguito quando un processo lo fa partire
24 eseguendo una funzione della famiglia \func{exec}; torneremo su questo e sulla
25 creazione e gestione dei processi nel prossimo capitolo. In questo
26 affronteremo l'avvio e il funzionamento di un singolo processo partendo dal
27 punto di vista del programma che viene messo in esecuzione.
28
29
30 \section{Esecuzione e conclusione di un programma}
31
32 Uno dei concetti base di Unix è che un processo esegue sempre uno ed un solo
33 programma: si possono avere più processi che eseguono lo stesso programma ma
34 ciascun processo vedrà la sua copia del codice (in realtà il kernel fa sì che
35 tutte le parti uguali siano condivise), avrà un suo spazio di indirizzi,
36 variabili proprie e sarà eseguito in maniera completamente indipendente da
37 tutti gli altri.\footnote{questo non è del tutto vero nel caso di un programma
38   \textit{multi-thread}, ma la gestione dei \itindex{thread} \textit{thread}
39   in Linux sarà trattata a parte in cap.~\ref{cha:threads}.}
40
41
42 \subsection{La funzione \func{main}} 
43 \label{sec:proc_main}
44
45 Quando un programma viene lanciato il kernel esegue un opportuno codice di
46 avvio, usando il programma \cmd{ld-linux.so}.  Questo programma prima carica
47 le librerie condivise che servono al programma, poi effettua il collegamento
48 dinamico del codice e alla fine lo esegue. Infatti, a meno di non aver
49 specificato il flag \texttt{-static} durante la compilazione, tutti i
50 programmi in Linux sono incompleti e necessitano di essere \textsl{collegati}
51 alle librerie condivise quando vengono avviati.  La procedura è controllata da
52 alcune variabili di ambiente e dal contenuto di \conffile{/etc/ld.so.conf}. I
53 dettagli sono riportati nella pagina di manuale di \cmd{ld.so}.
54
55 Il sistema fa partire qualunque programma chiamando la funzione \func{main};
56 sta al programmatore chiamare così la funzione principale del programma da cui
57 si suppone iniziare l'esecuzione; in ogni caso senza questa funzione lo stesso
58 \textit{linker} (si chiama così il programma che effettua i collegamenti di
59 cui sopra) darebbe luogo ad errori.  Lo standard ISO C specifica che la
60 funzione \func{main} può non avere argomenti o prendere due argomenti che
61 rappresentano gli argomenti passati da linea di comando, in sostanza un
62 prototipo che va sempre bene è il seguente:
63 \includecodesnip{listati/main_def.c}
64
65 In realtà nei sistemi Unix esiste un altro modo per definire la funzione
66 \func{main}, che prevede la presenza di un terzo argomento, \code{char
67   *envp[]}, che fornisce (vedi sez.~\ref{sec:proc_environ})
68 l'\textsl{ambiente} del programma; questa forma però non è prevista dallo
69 standard POSIX.1 per cui se si vogliono scrivere programmi portabili è meglio
70 evitarla.
71
72
73 \subsection{Come chiudere un programma}
74 \label{sec:proc_conclusion}
75
76 Normalmente un programma finisce quando la funzione \func{main} ritorna, una
77 modalità equivalente di chiudere il programma è quella di chiamare
78 direttamente la funzione \func{exit} (che viene comunque chiamata
79 automaticamente quando \func{main} ritorna).  Una forma alternativa è quella
80 di chiamare direttamente la system call \func{\_exit}, che restituisce il
81 controllo direttamente alla funzione di conclusione dei processi del kernel.
82
83 Oltre alla conclusione ``\textsl{normale}'' esiste anche la possibilità di una
84 conclusione ``\textsl{anomala}'' del programma a causa della ricezione di un
85 segnale (tratteremo i segnali in cap.~\ref{cha:signals}) o della chiamata alla
86 funzione \func{abort}; torneremo su questo in sez.~\ref{sec:proc_termination}.
87
88 Il valore di ritorno della funzione \func{main}, o quello usato nelle chiamate
89 ad \func{exit} e \func{\_exit}, viene chiamato \textsl{stato di uscita} (o
90 \textit{exit status}) e passato al processo che aveva lanciato il programma
91 (in genere la shell). In generale si usa questo valore per fornire
92 informazioni sulla riuscita o il fallimento del programma; l'informazione è
93 necessariamente generica, ed il valore deve essere compreso fra 0 e 255.
94
95 La convenzione in uso pressoché universale è quella di restituire 0 in caso di
96 successo e 1 in caso di fallimento; l'unica eccezione è per i programmi che
97 effettuano dei confronti (come \cmd{diff}), che usano 0 per indicare la
98 corrispondenza, 1 per indicare la non corrispondenza e 2 per indicare
99 l'incapacità di effettuare il confronto. È opportuno adottare una di queste
100 convenzioni a seconda dei casi.  Si tenga presente che se si raggiunge la fine
101 della funzione \func{main} senza ritornare esplicitamente si ha un valore di
102 uscita indefinito, è pertanto consigliabile di concludere sempre in maniera
103 esplicita detta funzione.
104
105 Un'altra convenzione riserva i valori da 128 a 256 per usi speciali: ad
106 esempio 128 viene usato per indicare l'incapacità di eseguire un altro
107 programma in un sottoprocesso. Benché questa convenzione non sia
108 universalmente seguita è una buona idea tenerne conto.
109
110 Si tenga presente inoltre che non è una buona idea usare il codice di errore
111 restituito dalla variabile \var{errno} (per i dettagli si veda
112 sez.~\ref{sec:sys_errors}) come stato di uscita. In generale infatti una shell
113 non si cura del valore se non per vedere se è diverso da zero; inoltre il
114 valore dello stato di uscita è sempre troncato ad 8 bit, per cui si potrebbe
115 incorrere nel caso in cui restituendo un codice di errore 256, si otterrebbe
116 uno stato di uscita uguale a zero, che verrebbe interpretato come un successo.
117
118 In \file{stdlib.h} sono definite, seguendo lo standard POSIX, le due costanti
119 \const{EXIT\_SUCCESS} e \const{EXIT\_FAILURE}, da usare sempre per specificare
120 lo stato di uscita di un processo. In Linux esse sono poste rispettivamente ai
121 valori di tipo \ctyp{int} 0 e 1.
122
123
124 \subsection{Le funzioni \func{exit} e \func{\_exit}}
125 \label{sec:proc_exit}
126
127 Come accennato le funzioni usate per effettuare un'uscita ``\textit{normale}''
128 da un programma sono due, la prima è la funzione \funcd{exit}, che è definita
129 dallo standard ANSI C ed il cui prototipo è:
130 \begin{prototype}{stdlib.h}{void exit(int status)}
131   Causa la conclusione ordinaria del programma.
132
133   \bodydesc{La funzione non ritorna. Il processo viene terminato.}
134 \end{prototype}
135
136 La funzione \func{exit} è pensata per eseguire una conclusione pulita di un
137 programma che usi le librerie standard del C; essa esegue tutte le funzioni
138 che sono state registrate con \func{atexit} e \func{on\_exit} (vedi
139 sez.~\ref{sec:proc_atexit}), e chiude tutti gli stream effettuando il
140 salvataggio dei dati sospesi (chiamando \func{fclose}, vedi
141 sez.~\ref{sec:file_fopen}), infine passa il controllo al kernel chiamando
142 \func{\_exit} e restituendo il valore di \param{status} come stato di uscita.
143
144 La system call \funcd{\_exit} restituisce direttamente il controllo al kernel,
145 concludendo immediatamente il processo; i dati sospesi nei buffer degli stream
146 non vengono salvati e le eventuali funzioni registrate con \func{atexit} e
147 \func{on\_exit} non vengono eseguite. Il prototipo della funzione è:
148 \begin{prototype}{unistd.h}{void \_exit(int status)}
149   Causa la conclusione immediata del programma.
150
151   \bodydesc{La funzione non ritorna. Il processo viene terminato.}
152 \end{prototype}
153
154 La funzione chiude tutti i file descriptor appartenenti al processo; si tenga
155 presente che questo non comporta il salvataggio dei dati bufferizzati degli
156 stream, (torneremo sulle due interfacce dei file a partire da
157 cap.~\ref{cha:file_intro}), fa sì che ogni figlio del processo sia adottato da
158 \cmd{init} (vedi cap.~\ref{cha:process_handling}), manda un segnale
159 \const{SIGCHLD} al processo padre (vedi sez.~\ref{sec:sig_job_control}) ed
160 infine ritorna lo stato di uscita specificato in \param{status} che può essere
161 raccolto usando la funzione \func{wait} (vedi sez.~\ref{sec:proc_wait}).
162
163
164 \subsection{Le funzioni \func{atexit} e \func{on\_exit}}
165 \label{sec:proc_atexit}
166
167 Un'esigenza comune che si incontra nella programmazione è quella di dover
168 effettuare una serie di operazioni di pulizia (ad esempio salvare dei dati,
169 ripristinare delle impostazioni, eliminare dei file temporanei, ecc.) prima
170 della conclusione di un programma. In genere queste operazioni vengono fatte
171 in un'apposita sezione del programma, ma quando si realizza una libreria
172 diventa antipatico dover richiedere una chiamata esplicita ad una funzione di
173 pulizia al programmatore che la utilizza.
174
175 È invece molto meno soggetto ad errori, e completamente trasparente
176 all'utente, avere la possibilità di effettuare automaticamente la chiamata ad
177 una funzione che effettui tali operazioni all'uscita dal programma. A questo
178 scopo lo standard ANSI C prevede la possibilità di registrare un certo numero
179 di funzioni che verranno eseguite all'uscita dal programma (sia per la
180 chiamata ad \func{exit} che per il ritorno di \func{main}). La prima funzione
181 che si può utilizzare a tal fine è \funcd{atexit} il cui prototipo è:
182 \begin{prototype}{stdlib.h}{void atexit(void (*function)(void))}
183   Registra la funzione \param{function} per la chiamata all'uscita dal
184   programma.
185   
186   \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di
187     fallimento, \var{errno} non viene modificata.}
188 \end{prototype}
189 \noindent la funzione richiede come argomento l'indirizzo di una opportuna
190 funzione di pulizia da chiamare all'uscita del programma, che non deve
191 prendere argomenti e non deve ritornare niente (deve essere cioè definita come
192 \code{void function(void)}).
193
194 Un'estensione di \func{atexit} è la funzione \funcd{on\_exit}, che le
195 \acr{glibc} includono per compatibilità con SunOS, ma che non è detto sia
196 definita su altri sistemi; il suo prototipo è:
197 \begin{prototype}{stdlib.h}
198 {void on\_exit(void (*function)(int , void *), void *arg)}
199   Registra la funzione \param{function} per la chiamata all'uscita dal
200   programma. 
201   
202   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
203     fallimento, \var{errno} non viene modificata.}
204 \end{prototype}
205
206 In questo caso la funzione da chiamare all'uscita prende i due argomenti
207 specificati nel prototipo, dovrà cioè essere definita come \code{void
208   function(int status, void *argp)}. Il primo argomento sarà inizializzato
209 allo stato di uscita con cui è stata chiamata \func{exit} ed il secondo al
210 puntatore \param{arg} passato come secondo argomento di \func{on\_exit}.  Così
211 diventa possibile passare dei dati alla funzione di chiusura.
212
213 Nella sequenza di chiusura tutte le funzioni registrate verranno chiamate in
214 ordine inverso rispetto a quello di registrazione (ed una stessa funzione
215 registrata più volte sarà chiamata più volte); poi verranno chiusi tutti gli
216 stream aperti, infine verrà chiamata \func{\_exit}.
217
218
219 \subsection{Conclusioni}
220 \label{sec:proc_term_conclusion}
221
222 Data l'importanza dell'argomento è opportuno sottolineare ancora una volta che
223 in un sistema Unix l'unico modo in cui un programma può essere eseguito dal
224 kernel è attraverso la chiamata alla system call \func{execve} (o attraverso
225 una delle funzioni della famiglia \func{exec} che vedremo in
226 sez.~\ref{sec:proc_exec}).
227
228 Allo stesso modo l'unico modo in cui un programma può concludere
229 volontariamente la sua esecuzione è attraverso una chiamata alla system call
230 \func{\_exit}, o esplicitamente, o in maniera indiretta attraverso l'uso di
231 \func{exit} o il ritorno di \func{main}.
232
233 Uno schema riassuntivo che illustra le modalità con cui si avvia e conclude
234 normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}.
235
236 \begin{figure}[htb]
237   \centering
238 %  \includegraphics[width=9cm]{img/proc_beginend}
239   \begin{tikzpicture}[>=stealth]
240     \filldraw[fill=black!35] (-0.3,0) rectangle (12,1);
241     \draw(5.5,0.5) node {\large{kernel}};
242
243     \filldraw[fill=black!15] (1.5,2) rectangle (4,3);
244     \draw (2.75,2.5) node {\texttt{ld-linux.so}};
245     \draw [->] (2.75,1) -- (2.75,2);
246     \draw (2.75,1.5) node [anchor=west]{\texttt{exec}};
247
248     \filldraw[fill=black!15,rounded corners] (1.5,4) rectangle (4,5);
249     \draw (2.75,4.5) node {\texttt{main}};
250
251     \draw [<->, dashed] (2.75,3) -- (2.75,4);
252     \draw [->] (1.5,4.5) -- (0.3,4.5) -- (0.3,1);
253     \draw (0.9,4.5) node [anchor=south] {\texttt{\_exit}};
254
255     \filldraw[fill=black!15,rounded corners] (1.5,6) rectangle (4,7);
256     \draw (2.75,6.5) node {\texttt{funzione}};
257
258     \draw [<->, dashed] (2.75,5) -- (2.75,6);
259     \draw [->] (1.5,6.5) -- (0.05,6.5) -- (0.05,1);
260     \draw (0.9,6.5) node [anchor=south] {\texttt{\_exit}};
261
262     \draw (6.75,4.5) node (exit) [rectangle,fill=black!15,minimum width=2.5cm,minimum height=1cm,rounded corners, draw]{\texttt{exit}};
263
264     \draw[->] (4,6.5) -- node[anchor=south west]{\texttt{exit}} (exit);
265     \draw[->] (4,4.5) -- node[anchor=south]{\texttt{exit}} (exit);
266     \draw[->] (exit) -- node[anchor=east]{\texttt{\_exit}}(6.75,1);
267
268     \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{exit handler};
269     \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{exit handler};
270     \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{chiusura stream};
271
272     \draw[<->, dashed] (exithandler1) -- (exit);
273     \draw[<->, dashed] (exithandler2) -- (exit);
274     \draw[<->, dashed] (stream) -- (exit);
275   \end{tikzpicture}
276   \caption{Schema dell'avvio e della conclusione di un programma.}
277   \label{fig:proc_prog_start_stop}
278 \end{figure}
279
280 Si ricordi infine che un programma può anche essere interrotto dall'esterno
281 attraverso l'uso di un segnale (modalità di conclusione non mostrata in
282 fig.~\ref{fig:proc_prog_start_stop}); tratteremo nei dettagli i segnali e la
283 loro gestione nel capitolo \ref{cha:signals}.
284
285
286
287 \section{I processi e l'uso della memoria}
288 \label{sec:proc_memory}
289
290 Una delle risorse base che ciascun processo ha a disposizione è la memoria, e
291 la gestione della memoria è appunto uno degli aspetti più complessi di un
292 sistema unix-like. In questa sezione, dopo una breve introduzione ai concetti
293 base, esamineremo come la memoria viene vista da parte di un programma in
294 esecuzione, e le varie funzioni utilizzabili per la sua gestione.
295
296
297 \subsection{I concetti generali}
298 \label{sec:proc_mem_gen}
299
300 Ci sono vari modi in cui i sistemi operativi organizzano la memoria, ed i
301 dettagli di basso livello dipendono spesso in maniera diretta
302 dall'architettura dell'hardware, ma quello più tipico, usato dai sistemi
303 unix-like come Linux è la cosiddetta \index{memoria~virtuale} \textsl{memoria
304   virtuale} che consiste nell'assegnare ad ogni processo uno spazio virtuale
305 di indirizzamento lineare, in cui gli indirizzi vanno da zero ad un qualche
306 valore massimo.\footnote{nel caso di Linux fino al kernel 2.2 detto massimo
307   era, per macchine a 32bit, di 2Gb. Con il kernel 2.4 ed il supporto per la
308   \textit{high-memory} il limite è stato esteso anche per macchine a 32 bit.}
309
310 Come accennato in cap.~\ref{cha:intro_unix} questo spazio di indirizzi è
311 virtuale e non corrisponde all'effettiva posizione dei dati nella RAM del
312 computer; in genere detto spazio non è neppure continuo (cioè non tutti gli
313 indirizzi possibili sono utilizzabili, e quelli usabili non sono
314 necessariamente adiacenti).
315
316 Per la gestione da parte del kernel la memoria viene divisa in pagine di
317 dimensione fissa,\footnote{inizialmente questi erano di 4kb sulle macchine a
318   32 bit e di 8kb sulle alpha, con le versioni più recenti del kernel è
319   possibile anche utilizzare pagine di dimensioni maggiori (4Mb), per sistemi
320   con grandi quantitativi di memoria in cui l'uso di pagine troppo piccole
321   comporta una perdita di prestazioni.} e ciascuna pagina nello spazio di
322 indirizzi virtuale è associata ad un supporto che può essere una pagina di
323 memoria reale o ad un dispositivo di stoccaggio secondario (come lo spazio
324 disco riservato alla swap, o i file che contengono il codice). Per ciascun
325 processo il kernel si cura di mantenere un mappa di queste corrispondenze
326 nella cosiddetta \itindex{page~table} \textit{page table}.\footnote{questa è
327   una semplificazione brutale, il meccanismo è molto più complesso; una buona
328   trattazione di come Linux gestisce la memoria virtuale si trova su
329   \cite{LinVM}.}
330
331 Una stessa pagina di memoria reale può fare da supporto a diverse pagine di
332 memoria virtuale appartenenti a processi diversi (come accade in genere per le
333 pagine che contengono il codice delle librerie condivise). Ad esempio il
334 codice della funzione \func{printf} starà su una sola pagina di memoria reale
335 che farà da supporto a tutte le pagine di memoria virtuale di tutti i processi
336 che hanno detta funzione nel loro codice.
337
338 La corrispondenza fra le pagine della \index{memoria~virtuale} memoria
339 virtuale di un processo e quelle della memoria fisica della macchina viene
340 gestita in maniera trasparente dal kernel.\footnote{in genere con l'ausilio
341   dell'hardware di gestione della memoria (la \textit{Memory Management Unit}
342   del processore), con i kernel della serie 2.6 è comunque diventato possibile
343   utilizzare Linux anche su architetture che non dispongono di una MMU.}
344 Poiché in genere la memoria fisica è solo una piccola frazione della memoria
345 virtuale, è necessario un meccanismo che permetta di trasferire le pagine che
346 servono dal supporto su cui si trovano in memoria, eliminando quelle che non
347 servono.  Questo meccanismo è detto \index{paginazione} \textsl{paginazione}
348 (o \textit{paging}), ed è uno dei compiti principali del kernel.
349
350 Quando un processo cerca di accedere ad una pagina che non è nella memoria
351 reale, avviene quello che viene chiamato un \itindex{page~fault} \textit{page
352   fault}; la gestione della memoria genera un'interruzione e passa il
353 controllo al kernel il quale sospende il processo e si incarica di mettere in
354 RAM la pagina richiesta (effettuando tutte le operazioni necessarie per
355 reperire lo spazio necessario), per poi restituire il controllo al processo.
356
357 Dal punto di vista di un processo questo meccanismo è completamente
358 trasparente, e tutto avviene come se tutte le pagine fossero sempre
359 disponibili in memoria.  L'unica differenza avvertibile è quella dei tempi di
360 esecuzione, che passano dai pochi nanosecondi necessari per l'accesso in RAM,
361 a tempi molto più lunghi, dovuti all'intervento del kernel. 
362
363 Normalmente questo è il prezzo da pagare per avere un multitasking reale, ed
364 in genere il sistema è molto efficiente in questo lavoro; quando però ci siano
365 esigenze specifiche di prestazioni è possibile usare delle funzioni che
366 permettono di bloccare il meccanismo della \index{paginazione} paginazione e
367 mantenere fisse delle pagine in memoria (vedi sez.~\ref{sec:proc_mem_lock}).
368 Inoltre per certe applicazioni gli algoritmi di gestione della memoria
369
370
371 \subsection{La struttura della memoria di un processo}
372 \label{sec:proc_mem_layout}
373
374 Benché lo spazio di indirizzi virtuali copra un intervallo molto ampio, solo
375 una parte di essi è effettivamente allocato ed utilizzabile dal processo; il
376 tentativo di accedere ad un indirizzo non allocato è un tipico errore che si
377 commette quando si è manipolato male un puntatore e genera quella che viene
378 chiamata una \itindex{segment~violation} \textit{segment violation}. Se si
379 tenta cioè di leggere o scrivere da un indirizzo per il quale non esiste
380 un'associazione della pagina virtuale, il kernel risponde al relativo
381 \itindex{page~fault} \textit{page fault} mandando un segnale \const{SIGSEGV}
382 al processo, che normalmente ne causa la terminazione immediata.
383
384 È pertanto importante capire come viene strutturata \index{memoria~virtuale}
385 \textsl{la memoria virtuale} di un processo. Essa viene divisa in
386 \textsl{segmenti}, cioè un insieme contiguo di indirizzi virtuali ai quali il
387 processo può accedere.  Solitamente un programma C viene suddiviso nei
388 seguenti segmenti:
389
390 \begin{enumerate}
391 \item Il \index{segmento!testo} segmento di testo o \textit{text segment}.
392   Contiene il codice del programma, delle funzioni di librerie da esso
393   utilizzate, e le costanti.  Normalmente viene condiviso fra tutti i processi
394   che eseguono lo stesso programma (e anche da processi che eseguono altri
395   programmi nel caso delle librerie).  Viene marcato in sola lettura per
396   evitare sovrascritture accidentali (o maliziose) che ne modifichino le
397   istruzioni.
398   
399   Viene allocato da \func{exec} all'avvio del programma e resta invariato
400   per tutto il tempo dell'esecuzione.
401   
402 \item Il \index{segmento!dati} segmento dei dati o \textit{data segment}.
403   Contiene le variabili globali (cioè quelle definite al di fuori di tutte le
404   funzioni che compongono il programma) e le variabili statiche (cioè quelle
405   dichiarate con l'attributo \ctyp{static}). Di norma è diviso in due parti.
406   
407   La prima parte è il segmento dei dati inizializzati, che contiene le
408   variabili il cui valore è stato assegnato esplicitamente. Ad esempio
409   se si definisce:
410 \includecodesnip{listati/pi.c}
411   questo valore sarà immagazzinato in questo segmento. La memoria di questo
412   segmento viene preallocata all'avvio del programma e inizializzata ai valori
413   specificati.
414   
415   La seconda parte è il segmento dei dati non inizializzati, che contiene le
416   variabili il cui valore non è stato assegnato esplicitamente. Ad esempio se
417   si definisce:
418 \includecodesnip{listati/vect.c}
419   questo vettore sarà immagazzinato in questo segmento. Anch'esso viene
420   allocato all'avvio, e tutte le variabili vengono inizializzate a zero (ed i
421   puntatori a \val{NULL}).\footnote{si ricordi che questo vale solo per le
422     variabili che vanno nel segmento dati, e non è affatto vero in generale.}
423    
424   Storicamente questa seconda parte del segmento dati viene chiamata BSS (da
425   \textit{Block Started by Symbol}). La sua dimensione è fissa.
426   
427 \item Lo \itindex{heap} \textit{heap}. Tecnicamente lo si può considerare
428   l'estensione del segmento dati, a cui di solito è posto giusto di seguito. È
429   qui che avviene l'allocazione dinamica della memoria; può essere
430   ridimensionato allocando e disallocando la memoria dinamica con le apposite
431   funzioni (vedi sez.~\ref{sec:proc_mem_alloc}), ma il suo limite inferiore
432   (quello adiacente al segmento dati) ha una posizione fissa.
433   
434 \item Il segmento di \itindex{stack} \textit{stack}, che contiene quello che
435   viene chiamato \textit{stack} del programma.  Tutte le volte che si effettua
436   una chiamata ad una funzione è qui che viene salvato l'indirizzo di ritorno
437   e le informazioni dello stato del chiamante (tipo il contenuto di alcuni
438   registri della CPU), poi la funzione chiamata alloca qui lo spazio per le
439   sue variabili locali. Tutti questi dati vengono \textit{impilati} (da questo
440   viene il nome \itindex{stack} \textit{stack}) in sequenza uno sull'altro; in
441   questo modo le funzioni possono essere chiamate ricorsivamente. Al ritorno
442   della funzione lo spazio è automaticamente rilasciato e
443   ``\textsl{ripulito}''.\footnote{il compilatore si incarica di generare
444     automaticamente il codice necessario, seguendo quella che viene chiamata
445     una \textit{calling convention}; quella standard usata con il C ed il C++
446     è detta \textit{cdecl} e prevede che gli argomenti siano caricati nello
447     \textit{stack} dal chiamante da destra a sinistra, e che sia il chiamante
448     stesso ad eseguire la ripulitura dello \textit{stack} al ritorno della
449     funzione, se ne possono però utilizzare di alternative (ad esempio nel
450     Pascal gli argomenti sono inseriti da sinistra a destra ed è compito del
451     chiamato ripulire lo \textit{stack}), in genere non ci si deve preoccupare
452     di questo fintanto che non si mescolano funzioni scritte con linguaggi
453     diversi.}
454
455   La dimensione di questo segmento aumenta seguendo la crescita dello
456   \itindex{stack} \textit{stack} del programma, ma non viene ridotta quando
457   quest'ultimo si restringe.
458 \end{enumerate}
459
460 \begin{figure}[htb]
461   \centering
462 %  \includegraphics[height=12cm]{img/memory_layout}
463   \begin{tikzpicture}
464   \draw (0,0) rectangle (4,1);
465   \draw (2,0.5) node {text};
466   \draw (0,1) rectangle (4,2.5);
467   \draw (2,1.75) node {dati inizializzati};
468   \draw (0,2.5) rectangle (4,5);
469   \draw (2,3.75) node {dati non inizializzati};
470   \draw (0,5) rectangle (4,9);
471   \draw[dashed] (0,6) -- (4,6);
472   \draw[dashed] (0,8) -- (4,8);
473   \draw (2,5.5) node {heap};
474   \draw (2,8.5) node {stack};
475   \draw [->] (2,6) -- (2,6.5);
476   \draw [->] (2,8) -- (2,7.5);
477   \draw (0,9) rectangle (4,10);
478   \draw (2,9.5) node {environment};
479   \draw (4,0) node [anchor=west] {\texttt{0x08000000}};
480   \draw (4,5) node [anchor=west] {\texttt{0x08xxxxxx}};
481   \draw (4,9) node [anchor=west] {\texttt{0xC0000000}};
482   \end{tikzpicture} 
483   \caption{Disposizione tipica dei segmenti di memoria di un processo.}
484   \label{fig:proc_mem_layout}
485 \end{figure}
486
487 Una disposizione tipica dei vari segmenti (testo, \itindex{heap}
488 \textit{heap}, \itindex{stack} \textit{stack}, ecc.) è riportata in
489 fig.~\ref{fig:proc_mem_layout}. Usando il comando \cmd{size} su un programma
490 se ne può stampare le dimensioni dei segmenti di testo e di dati
491 (inizializzati e BSS); si tenga presente però che il BSS non è mai salvato sul
492 file che contiene l'eseguibile, dato che viene sempre inizializzato a zero al
493 caricamento del programma.
494
495
496 \subsection{Allocazione della memoria per i programmi C}
497 \label{sec:proc_mem_alloc}
498
499 Il C supporta direttamente, come linguaggio di programmazione, soltanto due
500 modalità di allocazione della memoria: l'\textsl{allocazione statica} e
501 l'\textsl{allocazione automatica}.
502
503 L'\textsl{allocazione statica} è quella con cui sono memorizzate le variabili
504 globali e le variabili statiche, cioè le variabili il cui valore deve essere
505 mantenuto per tutta la durata del programma. Come accennato queste variabili
506 vengono allocate nel \index{segmento!dati} segmento dei dati all'avvio del
507 programma (come parte delle operazioni svolte da \func{exec}) e lo spazio da
508 loro occupato non viene liberato fino alla sua conclusione.
509
510 L'\textsl{allocazione automatica} è quella che avviene per gli argomenti di
511 una funzione e per le sue variabili locali (le cosiddette \textsl{variabili
512   automatiche}), che esistono solo per la durata della funzione.  Lo spazio
513 per queste variabili viene allocato nello \itindex{stack} \textit{stack} quando
514 viene eseguita la funzione e liberato quando si esce dalla medesima.
515
516 Esiste però un terzo tipo di allocazione, l'\textsl{allocazione dinamica}
517 della memoria, che non è prevista direttamente all'interno del linguaggio C,
518 ma che è necessaria quando il quantitativo di memoria che serve è
519 determinabile solo durante il corso dell'esecuzione del programma.
520
521 Il C non consente di usare variabili allocate dinamicamente, non è possibile
522 cioè definire in fase di programmazione una variabile le cui dimensioni
523 possano essere modificate durante l'esecuzione del programma. Per questo le
524 librerie del C forniscono una serie opportuna di funzioni per eseguire
525 l'allocazione dinamica di memoria (in genere nello \itindex{heap}
526 \textit{heap}).
527
528 Le variabili il cui contenuto è allocato in questo modo non potranno essere
529 usate direttamente come le altre (quelle nello \itindex{stack}
530 \textit{stack}), ma l'accesso sarà possibile solo in maniera indiretta,
531 attraverso i puntatori alla memoria loro riservata che si sono ottenuti dalle
532 funzioni di allocazione.
533
534
535 Le funzioni previste dallo standard ANSI C per la gestione della memoria sono
536 quattro: \funcd{malloc}, \funcd{calloc}, \funcd{realloc} e \funcd{free}, i
537 loro prototipi sono i seguenti:
538 \begin{functions}
539 \headdecl{stdlib.h}
540 \funcdecl{void *calloc(size\_t nmemb, size\_t size)}
541   Alloca nello \textit{heap} un'area di memoria per un vettore di
542   \param{nmemb} membri di \param{size} byte di dimensione. La memoria viene
543   inizializzata a 0. 
544   
545   La funzione restituisce il puntatore alla zona di memoria allocata in caso
546   di successo e \val{NULL} in caso di fallimento, nel qual caso
547   \var{errno} assumerà il valore \errval{ENOMEM}.
548 \funcdecl{void *malloc(size\_t size)}
549   Alloca \param{size} byte nello \textit{heap}. La memoria non viene
550   inizializzata. 
551
552   La funzione restituisce il puntatore alla zona di memoria allocata in caso
553   di successo e \val{NULL} in caso di fallimento, nel qual caso
554   \var{errno} assumerà il valore \errval{ENOMEM}.
555 \funcdecl{void *realloc(void *ptr, size\_t size)}
556   Cambia la dimensione del blocco allocato all'indirizzo \param{ptr}
557   portandola a \param{size}.
558
559   La funzione restituisce il puntatore alla zona di memoria allocata in caso
560   di successo e \val{NULL} in caso di fallimento, nel qual caso
561   \var{errno} assumerà il valore \errval{ENOMEM}.
562 \funcdecl{void free(void *ptr)}
563   Disalloca lo spazio di memoria puntato da \param{ptr}.
564
565   La funzione non ritorna nulla e non riporta errori.
566 \end{functions}
567 Il puntatore ritornato dalle funzioni di allocazione è garantito essere sempre
568 allineato correttamente per tutti i tipi di dati; ad esempio sulle macchine a
569 32 bit in genere è allineato a multipli di 4 byte e sulle macchine a 64 bit a
570 multipli di 8 byte.
571
572 In genere si usano le funzioni \func{malloc} e \func{calloc} per allocare
573 dinamicamente la quantità di memoria necessaria al programma indicata da
574 \param{size},\footnote{queste funzioni presentano un comportamento diverso fra
575   le \acr{glibc} e le \acr{uClib} quando il valore di \param{size} è nullo.
576   Nel primo caso viene comunque restituito un puntatore valido, anche se non è
577   chiaro a cosa esso possa fare riferimento, nel secondo caso viene restituito
578   \val{NULL}. Il comportamento è analogo con \code{realloc(NULL, 0)}.} e
579 siccome i puntatori ritornati sono di tipo generico non è necessario
580 effettuare un cast per assegnarli a puntatori al tipo di variabile per la
581 quale si effettua l'allocazione.
582
583 La memoria allocata dinamicamente deve essere esplicitamente rilasciata usando
584 \func{free}\footnote{le glibc provvedono anche una funzione \func{cfree}
585   definita per compatibilità con SunOS, che è deprecata.} una volta che non
586 sia più necessaria. Questa funzione vuole come argomento un puntatore
587 restituito da una precedente chiamata a una qualunque delle funzioni di
588 allocazione che non sia già stato liberato da un'altra chiamata a \func{free},
589 in caso contrario il comportamento della funzione è indefinito.
590
591 La funzione \func{realloc} si usa invece per cambiare (in genere aumentare) la
592 dimensione di un'area di memoria precedentemente allocata, la funzione vuole
593 in ingresso il puntatore restituito dalla precedente chiamata ad una
594 \func{malloc} (se è passato un valore \val{NULL} allora la funzione si
595 comporta come \func{malloc})\footnote{questo è vero per Linux e
596   l'implementazione secondo lo standard ANSI C, ma non è vero per alcune
597   vecchie implementazioni, inoltre alcune versioni delle librerie del C
598   consentivano di usare \func{realloc} anche per un puntatore liberato con
599   \func{free} purché non ci fossero state nel frattempo altre chiamate a
600   funzioni di allocazione, questa funzionalità è totalmente deprecata e non è
601   consentita sotto Linux.} ad esempio quando si deve far crescere la
602 dimensione di un vettore. In questo caso se è disponibile dello spazio
603 adiacente al precedente la funzione lo utilizza, altrimenti rialloca altrove
604 un blocco della dimensione voluta, copiandoci automaticamente il contenuto; lo
605 spazio aggiunto non viene inizializzato.
606
607 Si deve sempre avere ben presente il fatto che il blocco di memoria restituito
608 da \func{realloc} può non essere un'estensione di quello che gli si è passato
609 in ingresso; per questo si dovrà \emph{sempre} eseguire la riassegnazione di
610 \param{ptr} al valore di ritorno della funzione, e reinizializzare o provvedere
611 ad un adeguato aggiornamento di tutti gli altri puntatori all'interno del
612 blocco di dati ridimensionato.
613
614 Un errore abbastanza frequente (specie se si ha a che fare con vettori di
615 puntatori) è quello di chiamare \func{free} più di una volta sullo stesso
616 puntatore; per evitare questo problema una soluzione di ripiego è quella di
617 assegnare sempre a \val{NULL} ogni puntatore liberato con \func{free}, dato
618 che, quando l'argomento è un puntatore nullo, \func{free} non esegue nessuna
619 operazione.
620
621 Le \acr{glibc} hanno un'implementazione delle funzioni di allocazione che è
622 controllabile dall'utente attraverso alcune variabili di ambiente (vedi
623 sez.~\ref{sec:proc_environ}), in particolare diventa possibile tracciare
624 questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_}
625 che quando viene definita mette in uso una versione meno efficiente delle
626 funzioni suddette, che però è più tollerante nei confronti di piccoli errori
627 come quello di chiamate doppie a \func{free}.  In particolare:
628 \begin{itemize}
629 \item se la variabile è posta a zero gli errori vengono ignorati;
630 \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error}
631   (vedi sez.~\ref{sec:file_std_stream});
632 \item se è posta a 2 viene chiamata \func{abort}, che in genere causa
633   l'immediata conclusione del programma.
634 \end{itemize}
635
636 Il problema più comune e più difficile da risolvere che si incontra con le
637 funzioni di allocazione è quando non viene opportunamente liberata la memoria
638 non più utilizzata, quello che in inglese viene chiamato \itindex{memory~leak}
639 \textit{memory leak}, cioè una \textsl{perdita di memoria}.
640
641 Un caso tipico che illustra il problema è quello in cui in una subroutine si
642 alloca della memoria per uso locale senza liberarla prima di uscire. La
643 memoria resta così allocata fino alla terminazione del processo.  Chiamate
644 ripetute alla stessa subroutine continueranno ad effettuare altre allocazioni,
645 causando a lungo andare un esaurimento della memoria disponibile (e la
646 probabile impossibilità di proseguire l'esecuzione del programma).
647
648 Il problema è che l'esaurimento della memoria può avvenire in qualunque
649 momento, in corrispondenza ad una qualunque chiamata di \func{malloc} che può
650 essere in una sezione del codice che non ha alcuna relazione con la subroutine
651 che contiene l'errore. Per questo motivo è sempre molto difficile trovare un
652 \itindex{memory~leak} \textit{memory leak}.
653
654 In C e C++ il problema è particolarmente sentito. In C++, per mezzo della
655 programmazione ad oggetti, il problema dei \itindex{memory~leak}
656 \textit{memory leak} è notevolmente ridimensionato attraverso l'uso accurato
657 di appositi oggetti come gli \textit{smartpointers}.  Questo però in genere va
658 a scapito delle prestazioni dell'applicazione in esecuzione.
659
660 % TODO decidere cosa fare di questo che segue
661 % In altri linguaggi come il java e recentemente il C\# il problema non si pone
662 % nemmeno perché la gestione della memoria viene fatta totalmente in maniera
663 % automatica, ovvero il programmatore non deve minimamente preoccuparsi di
664 % liberare la memoria allocata precedentemente quando non serve più, poiché
665 % l'infrastruttura del linguaggio gestisce automaticamente la cosiddetta
666 % \index{\textit{garbage~collection}} \textit{garbage collection}. In tal caso,
667 % attraverso meccanismi simili a quelli del \textit{reference counting}, quando
668 % una zona di memoria precedentemente allocata non è più riferita da nessuna
669 % parte del codice in esecuzione, può essere deallocata automaticamente in
670 % qualunque momento dall'infrastruttura.
671
672 % Anche questo va a scapito delle prestazioni dell'applicazione in esecuzione
673 % (inoltre le applicazioni sviluppate con tali linguaggi di solito non sono
674 % eseguibili compilati, come avviene invece per il C ed il C++, ed è necessaria
675 % la presenza di una infrastruttura per la loro interpretazione e pertanto hanno
676 % di per sé delle prestazioni più scadenti rispetto alle stesse applicazioni
677 % compilate direttamente).  Questo comporta però il problema della non
678 % predicibilità del momento in cui viene deallocata la memoria precedentemente
679 % allocata da un oggetto.
680
681 Per limitare l'impatto di questi problemi, e semplificare la ricerca di
682 eventuali errori, l'implementazione delle funzioni di allocazione delle
683 \acr{glibc} mette a disposizione una serie di funzionalità che permettono di
684 tracciare le allocazioni e le disallocazioni, e definisce anche una serie di
685 possibili \textit{hook} (\textsl{ganci}) che permettono di sostituire alle
686 funzioni di libreria una propria versione (che può essere più o meno
687 specializzata per il debugging). Esistono varie librerie che forniscono dei
688 sostituti opportuni delle funzioni di allocazione in grado, senza neanche
689 ricompilare il programma,\footnote{esempi sono \textit{Dmalloc}
690   \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed
691   \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche
692 molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle
693 funzionalità di ausilio presenti nelle \acr{glibc} in
694 sez.~\ref{sec:proc_memory_adv_management}. 
695
696 Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire
697 dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in
698 precedenza, è di allocare la memoria nel segmento di \itindex{stack}
699 \textit{stack} della funzione corrente invece che nello \itindex{heap}
700 \textit{heap}, per farlo si può usare la funzione \funcd{alloca}, la cui
701 sintassi è identica a quella di \func{malloc}; il suo prototipo è:
702 \begin{prototype}{stdlib.h}{void *alloca(size\_t size)}
703   Alloca \param{size} byte nello \textit{stack}.
704   
705   \bodydesc{La funzione restituisce il puntatore alla zona di memoria
706     allocata.}
707 \end{prototype}
708
709 La funzione alloca la quantità di memoria (non inizializzata) richiesta
710 dall'argomento \param{size} nel segmento di \itindex{stack} \textit{stack}
711 della funzione chiamante.  Con questa funzione non è più necessario liberare
712 la memoria allocata (e quindi non esiste un analogo della \func{free}) in
713 quanto essa viene rilasciata automaticamente al ritorno della funzione.
714
715 Come è evidente questa funzione ha molti vantaggi, anzitutto permette di
716 evitare alla radice i problemi di \itindex{memory~leak} \textit{memory leak},
717 dato che non serve più la deallocazione esplicita; inoltre la deallocazione
718 automatica funziona anche quando si usa \func{longjmp} per uscire da una
719 subroutine con un salto non locale da una funzione (vedi
720 sez.~\ref{sec:proc_longjmp}).
721
722 Un altro vantaggio è che in Linux la funzione è molto più veloce di
723 \func{malloc} e non viene sprecato spazio, infatti non è necessario gestire un
724 pool di memoria da riservare e si evitano così anche i problemi di
725 frammentazione di quest'ultimo, che comportano inefficienze sia
726 nell'allocazione della memoria che nell'esecuzione dell'allocazione.
727
728 Gli svantaggi sono che questa funzione non è disponibile su tutti gli Unix, e
729 non è inserita né nello standard POSIX né in SUSv3 (ma è presente in BSD), il
730 suo utilizzo quindi limita la portabilità dei programmi. Inoltre la funzione
731 non può essere usata nella lista degli argomenti di una funzione, perché lo
732 spazio verrebbe allocato nel mezzo degli stessi.
733
734 Inoltre non è chiaramente possibile usare \func{alloca} per allocare memoria
735 che deve poi essere usata anche al di fuori della funzione in cui essa viene
736 chiamata, dato che all'uscita dalla funzione lo spazio allocato diventerebbe
737 libero, e potrebbe essere sovrascritto all'invocazione di nuove funzioni.
738 Questo è lo stesso problema che si può avere con le variabili automatiche, su
739 cui torneremo in sez.~\ref{sec:proc_auto_var}.
740
741 Infine non esiste un modo di sapere se l'allocazione ha avuto successo, la
742 funzione infatti viene realizzata inserendo del codice \textit{inline} nel
743 programma\footnote{questo comporta anche il fatto che non è possibile
744   sostituirla con una propria versione o modificarne il comportamento
745   collegando il proprio programma con un'altra libreria.} che si limita a
746 modificare il puntatore nello \itindex{stack} \textit{stack} e non c'è modo di
747 sapere se se ne sono superate le dimensioni, per cui in caso di fallimento
748 nell'allocazione il comportamento del programma può risultare indefinito,
749 dando luogo ad una \itindex{segment~violation} \textit{segment violation} la
750 prima volta che cercherà di accedere alla memoria non effettivamente
751 disponibile. 
752
753 Le due funzioni seguenti\footnote{le due funzioni sono state definite con BSD
754   4.3, sono marcate obsolete in SUSv2 e non fanno parte delle librerie
755   standard del C e mentre sono state esplicitamente rimosse dallo standard
756   POSIX/1-2001.} vengono utilizzate soltanto quando è necessario effettuare
757 direttamente la gestione della memoria associata allo spazio dati di un
758 processo, ad esempio qualora si debba implementare la propria versione delle
759 funzioni di allocazione della memoria. Per poterle utilizzare è necessario
760 definire una della macro di funzionalità (vedi
761 sez.~\ref{sec:intro_gcc_glibc_std}) fra \macro{\_BSD\_SOURCE},
762 \macro{\_SVID\_SOURCE} e \macro{\_XOPEN\_SOURCE} (ad un valore maggiore o
763 uguale di 500). La prima funzione è \funcd{brk}, ed il suo prototipo è:
764 \begin{prototype}{unistd.h}{int brk(void *end\_data\_segment)}
765   Sposta la fine del segmento dei dati.
766   
767   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
768     fallimento, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}.}
769 \end{prototype}
770
771 La funzione è un'interfaccia all'omonima system call ed imposta l'indirizzo
772 finale del \index{segmento!dati} segmento dati di un processo all'indirizzo
773 specificato da \param{end\_data\_segment}. Quest'ultimo deve essere un valore
774 ragionevole, ed inoltre la dimensione totale del segmento non deve comunque
775 eccedere un eventuale limite (si veda sez.~\ref{sec:sys_resource_limit})
776 imposto sulle dimensioni massime dello spazio dati del processo.
777
778 Il valore di ritorno della funzione fa riferimento alla versione fornita dalle
779 \acr{glibc}, in realtà in Linux la \textit{system call} corrispondente
780 restituisce come valore di ritorno il nuovo valore della fine del
781 \index{segmento!dati} segmento dati in caso di successo e quello corrente in
782 caso di fallimento, è la funzione di interfaccia usata dalle \acr{glibc} che
783 fornisce i valori di ritorno appena descritti, questo può non accadere se si
784 usano librerie diverse.
785
786 Una seconda funzione per la manipolazione diretta delle dimensioni
787 \index{segmento!dati} del segmento dati\footnote{in questo caso si tratta
788   soltanto di una funzione di libreria, e non di una system call.} è
789 \funcd{sbrk}, ed il suo prototipo è:
790 \begin{prototype}{unistd.h}{void *sbrk(ptrdiff\_t increment)} 
791   Incrementa la dimensione dello spazio dati.
792   
793   \bodydesc{La funzione restituisce il puntatore all'inizio della nuova zona
794     di memoria allocata in caso di successo e \val{NULL} in caso di
795     fallimento, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}.}
796 \end{prototype}
797 \noindent la funzione incrementa la dimensione lo spazio dati di un programma
798 di \param{increment} byte, restituendo il nuovo indirizzo finale dello stesso.
799 Un valore nullo permette di ottenere l'attuale posizione della fine del
800 \index{segmento!dati} segmento dati.
801
802 Queste funzioni sono state deliberatamente escluse dallo standard POSIX.1 e
803 per i programmi normali è sempre opportuno usare le funzioni di allocazione
804 standard descritte in precedenza, che sono costruite su di esse. 
805
806
807 \subsection{Il controllo della memoria virtuale}  
808 \label{sec:proc_mem_lock}
809
810 \index{memoria~virtuale|(}
811
812 Come spiegato in sez.~\ref{sec:proc_mem_gen} il kernel gestisce la memoria
813 virtuale in maniera trasparente ai processi, decidendo quando rimuovere pagine
814 dalla memoria per metterle nello swap, sulla base dell'utilizzo corrente da
815 parte dei vari processi.
816
817 Nell'uso comune un processo non deve preoccuparsi di tutto ciò, in quanto il
818 meccanismo della \index{paginazione} paginazione riporta in RAM, ed in maniera
819 trasparente, tutte le pagine che gli occorrono; esistono però esigenze
820 particolari in cui non si vuole che questo meccanismo si attivi. In generale i
821 motivi per cui si possono avere di queste necessità sono due:
822 \begin{itemize}
823 \item \textsl{La velocità}. Il processo della \index{paginazione} paginazione
824   è trasparente solo se il programma in esecuzione non è sensibile al tempo
825   che occorre a riportare la pagina in memoria; per questo motivo processi
826   critici che hanno esigenze di tempo reale o tolleranze critiche nelle
827   risposte (ad esempio processi che trattano campionamenti sonori) possono non
828   essere in grado di sopportare le variazioni della velocità di accesso dovuta
829   alla paginazione.
830   
831   In certi casi poi un programmatore può conoscere meglio dell'algoritmo di
832   allocazione delle pagine le esigenze specifiche del suo programma e decidere
833   quali pagine di memoria è opportuno che restino in memoria per un aumento
834   delle prestazioni. In genere queste sono esigenze particolari e richiedono
835   anche un aumento delle priorità in esecuzione del processo (vedi
836   sez.~\ref{sec:proc_real_time}).
837   
838 \item \textsl{La sicurezza}. Se si hanno password o chiavi segrete in chiaro
839   in memoria queste possono essere portate su disco dal meccanismo della
840   \index{paginazione} paginazione. Questo rende più lungo il periodo di tempo
841   in cui detti segreti sono presenti in chiaro e più complessa la loro
842   cancellazione (un processo può cancellare la memoria su cui scrive le sue
843   variabili, ma non può toccare lo spazio disco su cui una pagina di memoria
844   può essere stata salvata). Per questo motivo di solito i programmi di
845   crittografia richiedono il blocco di alcune pagine di memoria.
846 \end{itemize}
847
848 Per ottenere informazioni sulle modalità in cui un programma sta usando la
849 memoria virtuale è disponibile una apposita funzione, \funcd{mincore}, che
850 però non è standardizzata da POSIX e pertanto non è disponibile su tutte le
851 versioni di kernel unix-like;\footnote{nel caso di Linux devono essere
852   comunque definite le macro \macro{\_BSD\_SOURCE} e \macro{\_SVID\_SOURCE}.}
853 il suo prototipo è:
854 % \begin{functions}
855 %   \headdecl{unistd.h} 
856 %   \headdecl{sys/mman.h} 
857
858 %   \funcdecl{int mincore(void *addr, size\_t length, unsigned char *vec)}
859 %   Ritorna lo stato delle pagine di memoria occupate da un processo.
860   
861 %   \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
862 %     errore, nel qual caso \var{errno} assumerà uno dei valori seguenti:
863 %   \begin{errlist}
864 %   \item[\errcode{ENOMEM}] o \param{addr} + \param{length} eccede la dimensione
865 %     della memoria usata dal processo o l'intervallo di indirizzi specificato
866 %     non è mappato.
867 %   \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
868 %     una pagina.
869 %   \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
870 %   \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire
871 %     una risposta.
872 %   \end{errlist}
873 % }
874 % \end{functions}
875
876 \begin{funcproto}{
877 \fhead{unistd.h}
878 \fhead{sys/mman.h}
879 \fdecl{int mincore(void *addr, size\_t length, unsigned char *vec)}
880 \fdesc{Ritorna lo stato delle pagine di memoria occupate da un processo.}
881 }
882 {La funzione ritorna 0 in caso di successo e $-1$ in caso di errore, nel qual
883 caso \var{errno} assumerà uno dei valori seguenti:
884 \begin{errlist}
885    \item[\errcode{ENOMEM}] o \param{addr} + \param{length} eccede la dimensione
886      della memoria usata dal processo o l'intervallo di indirizzi specificato
887      non è mappato.
888    \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di
889      una pagina.
890    \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido.
891    \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire
892      una risposta.
893 \end{errlist}}
894 \end{funcproto}
895
896 La funzione permette di ottenere le informazioni sullo stato della mappatura
897 della memoria per il processo chiamante, specificando l'intervallo da
898 esaminare con l'indirizzo iniziale (indicato con l'argomento \param{addr}) e
899 la lunghezza (indicata con l'argomento \param{length}). L'indirizzo iniziale
900 deve essere un multiplo delle dimensioni di una pagina, mentre la lunghezza
901 può essere qualunque, fintanto che si resta nello spazio di indirizzi del
902 processo,\footnote{in caso contrario si avrà un errore di \errcode{ENOMEM};
903   fino al kernel 2.6.11 in questo caso veniva invece restituito
904   \errcode{EINVAL}, in considerazione che il caso più comune in cui si
905   verifica questo errore è quando si usa per sbaglio un valore negativo
906   di \param{length}, che nel caso verrebbe interpretato come un intero
907   positivo di grandi dimensioni.}  ma il risultato verrà comunque fornito per
908 l'intervallo compreso fino al multiplo successivo.
909
910 I risultati della funzione vengono forniti nel vettore puntato da \param{vec},
911 che deve essere allocato preventivamente e deve essere di dimensione
912 sufficiente a contenere tanti byte quante sono le pagine contenute
913 nell'intervallo di indirizzi specificato.\footnote{la dimensione cioè deve
914   essere almeno pari a \code{(length+PAGE\_SIZE-1)/PAGE\_SIZE}. } Al ritorno
915 della funzione il bit meno significativo di ciascun byte del vettore sarà
916 acceso se la pagina di memoria corrispondente è al momento residente in
917 memoria, o cancellato altrimenti. Il comportamento sugli altri bit è
918 indefinito, essendo questi al momento riservati per usi futuri. Per questo
919 motivo in genere è comunque opportuno inizializzare a zero il contenuto del
920 vettore, così che le pagine attualmente residenti in memoria saranno indicata
921 da un valore non nullo del byte corrispondente.
922
923 Dato che lo stato della memoria di un processo può cambiare continuamente, il
924 risultato di \func{mincore} è assolutamente provvisorio e lo stato delle
925 pagine potrebbe essere già cambiato al ritorno stesso della funzione, a meno
926 che, come vedremo ora, non si sia attivato il meccanismo che forza il
927 mantenimento di una pagina sulla memoria.  
928
929 \itindbeg{memory~locking} 
930
931 Il meccanismo che previene la \index{paginazione} paginazione di parte della
932 memoria virtuale di un processo è chiamato \textit{memory locking} (o
933 \textsl{blocco della memoria}). Il blocco è sempre associato alle pagine della
934 memoria virtuale del processo, e non al segmento reale di RAM su cui essa
935 viene mantenuta.  La regola è che se un segmento di RAM fa da supporto ad
936 almeno una pagina bloccata allora esso viene escluso dal meccanismo della
937 \index{paginazione} paginazione. I blocchi non si accumulano, se si blocca due
938 volte la stessa pagina non è necessario sbloccarla due volte, una pagina o è
939 bloccata oppure no.
940
941 Il \textit{memory lock} persiste fintanto che il processo che detiene la
942 memoria bloccata non la sblocca. Chiaramente la terminazione del processo
943 comporta anche la fine dell'uso della sua memoria virtuale, e quindi anche di
944 tutti i suoi \textit{memory lock}.  Infine i \textit{memory lock} non sono
945 ereditati dai processi figli,\footnote{ma siccome Linux usa il
946   \itindex{copy~on~write} \textit{copy on write} (vedi
947   sez.~\ref{sec:proc_fork}) gli indirizzi virtuali del figlio sono mantenuti
948   sullo stesso segmento di RAM del padre, quindi fintanto che un figlio non
949   scrive su un segmento, può usufruire del \textit{memory lock} del padre.} e
950 vengono automaticamente rimossi se si pone in esecuzione un altro programma
951 con \func{exec} (vedi sez.~\ref{sec:proc_exec}).
952
953 Siccome la richiesta di un \textit{memory lock} da parte di un processo riduce
954 la memoria fisica disponibile nel sistema, questo ha un evidente impatto su
955 tutti gli altri processi, per cui fino al kernel 2.6.9 solo un processo con i
956 privilegi opportuni (la \itindex{capabilities} \textit{capability}
957 \const{CAP\_IPC\_LOCK}, vedi sez.~\ref{sec:proc_capabilities}) aveva la
958 capacità di bloccare una pagina.
959
960 Il sistema pone dei limiti all'ammontare di memoria di un processo che può
961 essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo
962 standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro
963 \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il
964 \textit{memory locking}. Inoltre in alcuni sistemi è definita la costante
965 \const{PAGE\_SIZE} in \file{limits.h} per indicare la dimensione di una pagina
966 in byte.\footnote{con Linux questo non avviene e si deve ricorrere alla
967   funzione \func{getpagesize}, vedi sez.~\ref{sec:sys_memory_res}.} 
968
969 A partire dal kernel 2.6.9 anche un processo normale può bloccare la propria
970 memoria\footnote{la funzionalità è stata introdotta per non essere costretti a
971   dare privilegi eccessivi a programmi di crittografia, che necessitano di
972   questa funzionalità, ma che devono essere usati da utenti normali.} ma
973 mentre un processo privilegiato non ha limiti sulla quantità di memoria che
974 può bloccare, un processo normale è soggetto al limite della risorsa
975 \const{RLIMIT\_MEMLOCK} (vedi sez.~\ref{sec:sys_resource_limit}). In generale
976 poi ogni processo può sbloccare le pagine relative alla propria memoria, se
977 però diversi processi bloccano la stessa pagina questa resterà bloccata
978 fintanto che ci sarà almeno un processo che la blocca.
979
980 Le funzioni per bloccare e sbloccare la \index{paginazione} paginazione di
981 singole sezioni di memoria sono \funcd{mlock} e \funcd{munlock}; i loro
982 prototipi sono:
983 % \begin{functions}
984 %   \headdecl{sys/mman.h} 
985
986 %   \funcdecl{int mlock(const void *addr, size\_t len)}
987 %   Blocca la paginazione su un intervallo di memoria.
988
989 %   \funcdecl{int munlock(const void *addr, size\_t len)}
990 %   Rimuove il blocco della paginazione su un intervallo di memoria.
991   
992 %   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ in
993 %     caso di errore, nel qual caso \var{errno} assumerà uno dei
994 %     valori seguenti:
995 %   \begin{errlist}
996 %   \item[\errcode{ENOMEM}] alcuni indirizzi dell'intervallo specificato non
997 %     corrispondono allo spazio di indirizzi del processo o si è ecceduto
998 %     il numero massimo consentito di pagine bloccate.
999 %   \item[\errcode{EINVAL}] \param{len} non è un valore positivo.
1000 %   \item[\errcode{EPERM}] con un kernel successivo al 2.6.9 il processo non è
1001 %     privilegiato e si un limite nullo per \const{RLIMIT\_MEMLOCK}.
1002 %   \end{errlist}
1003 %   e, per \func{mlock}, anche \errval{EPERM} quando il processo non ha i
1004 %   privilegi richiesti per l'operazione.}
1005 % \end{functions}
1006
1007 \begin{funcproto}{
1008   \fhead{sys/mman.h} 
1009   \fdecl{int mlock(const void *addr, size\_t len)}
1010   \fdesc{Blocca la paginazione su un intervallo di memoria.}
1011
1012   \fdecl{int munlock(const void *addr, size\_t len)}
1013   \fdesc{Rimuove il blocco della paginazione su un intervallo di memoria.}
1014   }
1015 {Entrambe le funzioni ritornano 0 in caso di successo e $-1$ in
1016     caso di errore, nel qual caso \var{errno} assumerà uno dei
1017     valori seguenti:
1018   \begin{errlist}
1019   \item[\errcode{ENOMEM}] alcuni indirizzi dell'intervallo specificato non
1020     corrispondono allo spazio di indirizzi del processo o si è ecceduto
1021     il numero massimo consentito di pagine bloccate.
1022   \item[\errcode{EINVAL}] \param{len} non è un valore positivo.
1023   \item[\errcode{EPERM}] con un kernel successivo al 2.6.9 il processo non è
1024     privilegiato e si un limite nullo per \const{RLIMIT\_MEMLOCK}.
1025   \end{errlist}
1026   e, per \func{mlock}, anche \errval{EPERM} quando il processo non ha i
1027   privilegi richiesti per l'operazione.}
1028 \end{funcproto}
1029
1030
1031 Le due funzioni permettono rispettivamente di bloccare e sbloccare la
1032 \index{paginazione} paginazione per l'intervallo di memoria specificato dagli
1033 argomenti, che ne indicano nell'ordine l'indirizzo iniziale e la lunghezza.
1034 Tutte le pagine che contengono una parte dell'intervallo bloccato sono
1035 mantenute in RAM per tutta la durata del blocco.\footnote{con altri kernel si
1036   può ottenere un errore di \errcode{EINVAL} se \param{addr} non è un multiplo
1037   della dimensione delle pagine di memoria.}
1038
1039 Altre due funzioni, \funcd{mlockall} e \funcd{munlockall}, consentono di
1040 bloccare genericamente la \index{paginazione} paginazione per l'intero spazio
1041 di indirizzi di un processo.  I prototipi di queste funzioni sono:
1042 \begin{functions}
1043   \headdecl{sys/mman.h} 
1044
1045   \funcdecl{int mlockall(int flags)}
1046   Blocca la paginazione per lo spazio di indirizzi del processo corrente. 
1047   
1048   \funcdecl{int munlockall(void)}
1049   Sblocca la paginazione per lo spazio di indirizzi del processo corrente. 
1050   
1051   \bodydesc{Codici di ritorno ed errori sono gli stessi di \func{mlock} e
1052     \func{munlock}, con un kernel successivo al 2.6.9 l'uso di
1053     \func{munlockall} senza la \itindex{capabilities} \textit{capability}
1054 \const{CAP\_IPC\_LOCK} genera un errore di \errcode{EPERM}.}
1055 \end{functions}
1056
1057 L'argomento \param{flags} di \func{mlockall} permette di controllarne il
1058 comportamento; esso può essere specificato come l'OR aritmetico delle due
1059 costanti: 
1060 \begin{basedescript}{\desclabelwidth{2.5cm}}
1061 \item[\const{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello
1062   spazio di indirizzi del processo.
1063 \item[\const{MCL\_FUTURE}] blocca tutte le pagine che verranno mappate nello
1064   spazio di indirizzi del processo.
1065 \end{basedescript}
1066
1067 Con \func{mlockall} si possono bloccare tutte le pagine mappate nello spazio
1068 di indirizzi del processo, sia che comprendano il \index{segmento!dati}
1069 \index{segmento!testo} segmento di testo, di dati, lo \itindex{stack}
1070 \textit{stack}, lo \itindex{heap} \textit{heap} e pure le funzioni di libreria
1071 chiamate, i file mappati in memoria, i dati del kernel mappati in user space,
1072 la memoria condivisa.  L'uso dei flag permette di selezionare con maggior
1073 finezza le pagine da bloccare, ad esempio limitandosi a tutte le pagine
1074 allocate a partire da un certo momento.
1075
1076 In ogni caso un processo real-time che deve entrare in una
1077 \index{sezione~critica} sezione critica deve provvedere a riservare memoria
1078 sufficiente prima dell'ingresso, per scongiurare l'occorrenza di un eventuale
1079 \itindex{page~fault} \textit{page fault} causato dal meccanismo di
1080 \itindex{copy~on~write} \textit{copy on write}.  Infatti se nella
1081 \index{sezione~critica} sezione critica si va ad utilizzare memoria che non è
1082 ancora stata riportata in RAM si potrebbe avere un \itindex{page~fault}
1083 \textit{page fault} durante l'esecuzione della stessa, con conseguente
1084 rallentamento (probabilmente inaccettabile) dei tempi di esecuzione.
1085
1086 In genere si ovvia a questa problematica chiamando una funzione che ha
1087 allocato una quantità sufficientemente ampia di variabili automatiche, in modo
1088 che esse vengano mappate in RAM dallo \itindex{stack} \textit{stack}, dopo di
1089 che, per essere sicuri che esse siano state effettivamente portate in memoria,
1090 ci si scrive sopra.
1091
1092 \itindend{memory~locking}
1093
1094 \index{memoria~virtuale|)} 
1095
1096
1097 \subsection{Gestione avanzata dell'allocazione della memoria} 
1098 \label{sec:proc_memory_adv_management}
1099
1100 La trattazione delle funzioni di allocazione di sez.~\ref{sec:proc_mem_alloc}
1101 si è limitata a coprire le esigenze generiche di un programma, in cui non si
1102 hanno dei requisiti specifici e si lascia il controllo delle modalità di
1103 allocazione alle funzioni di libreria.  Tuttavia esistono una serie di casi in
1104 cui può essere necessario avere un controllo più dettagliato delle modalità
1105 con cui la memoria viene allocata; nel qual caso potranno venire in aiuto le
1106 funzioni trattate in questa sezione.
1107
1108 Le prime funzioni che tratteremo sono quelle che consentono di richiedere di
1109 allocare un blocco di memoria ``\textsl{allineato}'' ad un multiplo una certa
1110 dimensione. Questo tipo di esigenza emerge usualmente quando si devono
1111 allocare dei buffer da utilizzare per eseguire dell'I/O diretto su dispositivi
1112 a blocchi. In questo caso infatti il trasferimento di dati viene eseguito per
1113 blocchi di dimensione fissa, ed è richiesto che l'indirizzo di partenza del
1114 buffer sia un multiplo intero di questa dimensione, usualmente 512 byte. In
1115 tal caso l'uso di \func{malloc} non è sufficiente, ed occorre utilizzare una
1116 funzione specifica.
1117
1118 Tradizionalmente per rispondere a questa esigenza sono state create due
1119 funzioni diverse, \funcd{memalign} e \funcd{valloc}, oggi obsolete; i
1120 rispettivi prototipi sono:
1121 \begin{functions}
1122   \headdecl{malloc.h} 
1123
1124   \funcdecl{void *valloc(size\_t size)} Alloca un blocco di memoria allineato
1125   alla dimensione di una pagina di memoria.
1126
1127   \funcdecl{void *memalign(size\_t boundary, size\_t size)}
1128   Alloca un blocco di memoria allineato ad un multiplo di \param{boundary}.
1129   
1130   \bodydesc{Entrambe le funzioni ritornano un puntatore al blocco di memoria
1131     allocato in caso di successo e \val{NULL} in caso di errore, nel qual
1132     caso \var{errno} assumerà uno dei valori seguenti:
1133   \begin{errlist}
1134   \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione.
1135   \item[\errcode{EINVAL}] \param{boundary} non è multiplo di due.
1136   \end{errlist}
1137 }
1138 \end{functions}
1139
1140 Le funzioni restituiscono il puntatore al buffer di memoria allocata, che per
1141 \func{memalign} sarà un multiplo di \param{boundary} mentre per \func{valloc}
1142 un multiplo della dimensione di una pagina di memoria. Nel caso della versione
1143 fornita dalle \acr{glibc} la memoria allocata con queste funzioni deve essere
1144 liberata con \func{free}, cosa che non è detto accada con altre
1145 implementazioni.
1146
1147 Nessuna delle due funzioni ha una chiara standardizzazione (nessuna delle due
1148 compare in POSIX.1), ed inoltre ci sono indicazioni discordi sui file che ne
1149 contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in
1150   \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e
1151   \acr{libc5} la dichiarano in \texttt{malloc.h}, lo stesso vale per
1152   \func{memalign} che in alcuni sistemi è dichiarata in \texttt{stdlib.h}.}
1153 per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla
1154 nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo
1155 prototipo è:
1156 \begin{prototype}{stdlib.h}{posix\_memalign(void **memptr, size\_t alignment,
1157     size\_t size) } 
1158   Alloca un buffer di memoria allineato ad un multiplo di \param{alignment}.
1159   
1160   \bodydesc{La funzione restituisce 0 in caso di successo e \val{NULL} in caso
1161     di fallimento, o uno dei due codici di errore \errcode{ENOMEM} o
1162     \errcode{EINVAL}; \var{errno} non viene impostata.}
1163 \end{prototype}
1164
1165 La funzione restituisce il puntatore al buffer allocato all'indirizzo indicato
1166 da \param{memptr}. La funzione fallisce nelle stesse condizioni delle due
1167 funzioni precedenti, ma a differenza di \func{memalign} restituisce un codice
1168 di errore \errcode{EINVAL} anche se \param{alignment} non è un multiplo della
1169 la dimensione di \code{sizeof(void *)}. Come per le precedenti la memoria
1170 allocata con \func{posix\_memalign} può essere disallocata con
1171 \func{free}.\footnote{che in questo caso è quanto richiesto dallo standard.}
1172
1173 Un secondo caso in cui risulta estremamente utile poter avere un maggior
1174 controllo delle modalità di allocazione della memoria è quello in cui cercano
1175 errori di programmazione. Esempi di questi errori sono chiamate doppie alla
1176 funzione \func{free} con lo stesso puntatore, o i cosiddetti
1177 \itindex{buffer~overrun} \textit{buffer overrun}, cioè le scritture su un buffer
1178 oltre le dimensioni della sua allocazione,\footnote{entrambe queste operazioni
1179   causano in genere la corruzione dei dati di controllo delle funzioni di
1180   allocazione, che vengono anch'essi mantenuti nello \itindex{heap}
1181   \textit{heap} per tenere traccia delle zone di memoria allocata.} o i
1182 classici \itindex{memory~leak} \textit{memory leak}.
1183
1184 Una prima funzionalità di ausilio nella ricerca di questi errori viene fornita
1185 dalla \acr{glibc} tramite l'uso della variabile di ambiente
1186 \var{MALLOC\_CHECK\_}. Quando questa viene definita al posto della versione
1187 ordinaria delle funzioni di allocazione (\func{malloc}, \func{calloc},
1188 \func{realloc}, e \func{free}) viene usata una versione meno efficiente ma in
1189 grado di rilevare (e tollerare) alcuni degli errori più semplici, come le
1190 doppie chiamate a \func{free} o i \itindex{buffer~overrun} \textit{buffer
1191   overrun} di un byte.\footnote{uno degli errori più comuni, causato ad
1192   esempio dalla scrittura di una stringa di dimensione pari a quella del
1193   buffer, in cui ci si dimentica dello zero di terminazione finale.}
1194
1195 In questo caso a seconda del valore assegnato a \var{MALLOC\_CHECK\_} si
1196 avranno diversi comportamenti: con 0 l'errore sarà ignorato, con 1 verrà
1197 stampato un messaggio sullo \textit{standard error} (vedi
1198 sez.~\ref{sec:file_std_stream}), con 2 verrà invocata la funzione \func{abort}
1199 (vedi sez.~\ref{sec:sig_alarm_abort}) che termina il programma, con 3 viene
1200 sia stampato il messaggio d'errore che abortito il programma. In genere è
1201 opportuno definire la variabile ad un valore diverso da zero che consente di
1202 rilevare un errore nel momento in cui avviene.
1203
1204 Una modalità alternativa per effettuare dei controlli di consistenza sullo
1205 stato delle allocazioni di memoria eseguite con \func{malloc}, anche questa
1206 fornita come estensione specifica (e non standard) delle \acr{glibc}, è quella
1207 di utilizzare la funzione \funcd{mcheck}, che deve essere chiamata prima di
1208 eseguire qualunque allocazione con \func{malloc}; il suo prototipo è:
1209 \begin{prototype}{mcheck.h}{mcheck(void (*abortfn) (enum mcheck\_status
1210     status))} 
1211   Attiva i controlli di consistenza delle allocazioni eseguite da \func{malloc}.
1212   
1213   \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di
1214     fallimento; \var{errno} non viene impostata.}
1215 \end{prototype}
1216
1217 La funzione consente di registrare una funzione di emergenza, da passare come
1218 argomento, che verrà eseguita tutte le volte che, in una successiva esecuzione
1219 di \func{malloc}, venissero trovate delle inconsistenze, come delle operazioni
1220 di scrittura oltre i limiti dei buffer allocati. Per questo motivo la funzione
1221 deve essere chiamata prima di qualunque allocazione di memoria, altrimenti
1222 fallirà con un valore di ritorno pari a $-1$.
1223
1224 Se come argomento di \func{mcheck} si passa \val{NULL} verrà utilizzata una
1225 funzione predefinita che stampa un messaggio di errore ed invoca la funzione
1226 \func{abort} (vedi sez.~\ref{sec:sig_alarm_abort}), altrimenti si dovrà create
1227 una funzione personalizzata che verrà eseguita ricevendo un unico argomento di
1228 tipo \type{mcheck\_status},\footnote{trattasi in sostanza di un codice di
1229   errore che la funzione di emergenza potrà utilizzare per prendere le
1230   opportune azioni.} un tipo enumerato che può assumere soltanto i valori di
1231 tab.~\ref{tab:mcheck_status_value}.
1232
1233 \begin{table}[htb]
1234   \centering
1235   \footnotesize
1236   \begin{tabular}[c]{|l|p{7cm}|}
1237     \hline
1238     \textbf{Valore} & \textbf{Significato} \\
1239     \hline
1240     \hline
1241     \macro{MCHECK\_OK}      & riportato (a \func{mprobe}) se nessuna
1242                               inconsistenza è presente.\\
1243     \macro{MCHECK\_DISABLED}& riportato (a \func{mprobe}) se si è chiamata
1244                               \func{mcheck} dopo aver già usato
1245                               \func{malloc}.\\
1246     \macro{MCHECK\_HEAD}    & i dati immediatamente precedenti il buffer sono
1247                               stati modificati, avviene in genere quando si
1248                               decrementa eccessivamente il valore di un
1249                               puntatore scrivendo poi prima dell'inizio del
1250                               buffer.\\
1251     \macro{MCHECK\_TAIL}    & i dati immediatamente seguenti il buffer sono
1252                               stati modificati, succede quando si va scrivere
1253                               oltre la dimensione corretta del buffer.\\
1254     \macro{MCHECK\_FREE}    & il buffer è già stato disallocato.\\
1255     \hline
1256   \end{tabular}
1257   \caption{Valori dello stato dell'allocazione di memoria ottenibili dalla
1258     funzione di terminazione installata con \func{mcheck}.} 
1259   \label{tab:mcheck_status_value}
1260 \end{table}
1261
1262 Una volta che si sia chiamata \func{mcheck} con successo si può anche
1263 controllare esplicitamente lo stato delle allocazioni (senza aspettare un
1264 errore nelle relative funzioni) utilizzando la funzione \funcd{mprobe}, il cui
1265 prototipo è:
1266 \begin{prototype}{mcheck.h}{enum mcheck\_status mprobe(ptr)} 
1267   Esegue un controllo di consistenza delle allocazioni.
1268   
1269   \bodydesc{La funzione restituisce un codice fra quelli riportati in
1270     tab.\ref{tab:mcheck_status_value}.}
1271 \end{prototype}
1272
1273 La funzione richiede che si passi come argomento un puntatore ad un blocco di
1274 memoria precedentemente allocato con \func{malloc} o \func{realloc}, e
1275 restituisce lo stesso codice di errore che si avrebbe per la funzione di
1276 emergenza ad una successiva chiamata di una funzione di allocazione, e poi i
1277 primi due codici che indicano rispettivamente quando tutto è a posto o il
1278 controllo non è possibile per non aver chiamato \func{mcheck} in tempo. 
1279
1280 % TODO: trattare le altre funzionalità avanzate di \func{malloc}, mallopt,
1281 % mtrace, muntrace, mallinfo e gli hook con le glibc 2.10 c'è pure malloc_info
1282 % a sostituire mallinfo, vedi http://udrepper.livejournal.com/20948.html
1283
1284
1285 \section{Argomenti, ambiente ed altre proprietà di un processo}
1286 \label{sec:proc_options}
1287
1288
1289 In questa sezione esamineremo le funzioni che permettono di gestire gli
1290 argomenti e le opzioni, e quelle che consentono di manipolare ed utilizzare le
1291 variabili di ambiente. Accenneremo infine alle modalità con cui si può gestire
1292 la localizzazione di un programma modificandone il comportamento a seconda
1293 della lingua o del paese a cui si vuole faccia riferimento nelle sue
1294 operazioni. 
1295
1296 \subsection{Il formato degli argomenti}
1297 \label{sec:proc_par_format}
1298
1299 Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando
1300 vengono lanciati. Il passaggio degli argomenti e delle opzioni è effettuato
1301 attraverso gli argomenti \param{argc} e \param{argv} della funzione
1302 \func{main}, che vengono passati al programma dalla shell (o dal processo che
1303 esegue la \func{exec}, secondo le modalità che vedremo in
1304 sez.~\ref{sec:proc_exec}) quando questo viene messo in esecuzione.
1305
1306 In genere il passaggio di argomenti ed opzioni ad un programma viene
1307 effettuato dalla shell, che si incarica di leggere la linea di comando e di
1308 effettuarne la scansione (il cosiddetto \textit{parsing}) per individuare le
1309 parole che la compongono, ciascuna delle quali potrà essere considerata un
1310 argomento o un'opzione. Di norma per individuare le parole che andranno a
1311 costituire la lista degli argomenti viene usato come carattere di separazione
1312 lo spazio o il tabulatore, ma la cosa dipende ovviamente dalle modalità con
1313 cui si effettua la scansione.
1314
1315 \begin{figure}[htb]
1316   \centering
1317 %  \includegraphics[width=13cm]{img/argv_argc}
1318 %  \includegraphics[width=13cm]{img/argv_argc}
1319   \begin{tikzpicture}[>=stealth]
1320   \draw (0.5,2.5) rectangle (3.5,3);
1321   \draw (2,2.75) node {\texttt{argc = 5}};
1322   \draw (5,2.5) rectangle (8,3);
1323   \draw (6.5,2.75) node {\texttt{argv[0]}};
1324   \draw [->] (8,2.75) -- (9,2.75);
1325   \draw (9,2.75) node [anchor=west] {\texttt{"touch"}};
1326   \draw (5,2) rectangle (8,2.5);
1327   \draw (6.5,2.25) node {\texttt{argv[1]}};
1328   \draw [->] (8,2.25) -- (9,2.25);
1329   \draw (9,2.25) node [anchor=west] {\texttt{"-r"}};
1330   \draw (5,1.5) rectangle (8,2);
1331   \draw (6.5,1.75) node {\texttt{argv[2]}};
1332   \draw [->] (8,1.75) -- (9,1.75);
1333   \draw (9,1.75) node [anchor=west] {\texttt{"riferimento.txt"}};
1334   \draw (5,1.0) rectangle (8,1.5);
1335   \draw (6.5,1.25) node {\texttt{argv[3]}};
1336   \draw [->] (8,1.25) -- (9,1.25);
1337   \draw (9,1.25) node [anchor=west] {\texttt{"-m"}};
1338   \draw (5,0.5) rectangle (8,1.0);
1339   \draw (6.5,0.75) node {\texttt{argv[4]}};
1340   \draw [->] (8,0.75) -- (9,0.75);
1341   \draw (9,0.75) node [anchor=west] {\texttt{"questofile.txt"}};
1342   \draw (4.25,3.5) node{\texttt{"touch -r riferimento.txt -m questofile.txt"}};
1343
1344   \end{tikzpicture}
1345   \caption{Esempio dei valori di \param{argv} e \param{argc} generati nella 
1346     scansione di una riga di comando.}
1347   \label{fig:proc_argv_argc}
1348 \end{figure}
1349
1350 Indipendentemente da come viene eseguita, il risultato della scansione deve
1351 essere la costruzione del vettore di puntatori \param{argv} in cui si devono
1352 inserire in successione i puntatori alle stringhe costituenti i vari argomenti
1353 ed opzioni, e della variabile \param{argc} che deve essere inizializzata al
1354 numero di stringhe passate. Nel caso della shell questo comporta che il primo
1355 argomento sia sempre il nome del programma; un esempio di questo meccanismo è
1356 mostrato in fig.~\ref{fig:proc_argv_argc}.
1357
1358
1359 \subsection{La gestione delle opzioni}
1360 \label{sec:proc_opt_handling}
1361
1362 In generale un programma Unix riceve da linea di comando sia gli argomenti che
1363 le opzioni, queste ultime sono standardizzate per essere riconosciute come
1364 tali: un elemento di \param{argv} che inizia con il carattere \texttt{'-'} e
1365 che non sia un singolo \texttt{'-'} o un \texttt{'-{}-'} viene considerato
1366 un'opzione.  In genere le opzioni sono costituite da una lettera singola
1367 (preceduta dal carattere \cmd{'-'}) e possono avere o no un parametro
1368 associato; un comando tipico può essere quello mostrato in
1369 fig.~\ref{fig:proc_argv_argc}. In quel caso le opzioni sono \cmd{-r} e \cmd{-m}
1370 e la prima vuole un parametro mentre la seconda no (\cmd{questofile.txt} è un
1371 argomento del programma, non un parametro di \cmd{-m}).
1372
1373 Per gestire le opzioni all'interno dei argomenti a linea di comando passati in
1374 \param{argv} le librerie standard del C forniscono la funzione \funcd{getopt},
1375 che ha il seguente prototipo:
1376 \begin{prototype}{unistd.h}
1377 {int getopt(int argc, char *const argv[], const char *optstring)}
1378 Esegue il parsing degli argomenti passati da linea di comando
1379 riconoscendo le possibili opzioni segnalate con \param{optstring}.
1380
1381 \bodydesc{Ritorna il carattere che segue l'opzione, \cmd{':'} se manca un
1382   parametro all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e $-1$ se non
1383   esistono altre opzioni.}
1384 \end{prototype}
1385
1386 Questa funzione prende come argomenti le due variabili \param{argc} e
1387 \param{argv} passate a \func{main} ed una stringa che indica quali sono le
1388 opzioni valide; la funzione effettua la scansione della lista degli argomenti
1389 ricercando ogni stringa che comincia con \cmd{-} e ritorna ogni volta che
1390 trova un'opzione valida.
1391
1392 La stringa \param{optstring} indica quali sono le opzioni riconosciute ed è
1393 costituita da tutti i caratteri usati per identificare le singole opzioni, se
1394 l'opzione ha un parametro al carattere deve essere fatto seguire un segno di
1395 due punti \texttt{':'}; nel caso di fig.~\ref{fig:proc_argv_argc} ad esempio la
1396 stringa di opzioni avrebbe dovuto contenere \texttt{"r:m"}.
1397
1398 La modalità di uso di \func{getopt} è pertanto quella di chiamare più volte la
1399 funzione all'interno di un ciclo, fintanto che essa non ritorna il valore $-1$
1400 che indica che non ci sono più opzioni. Nel caso si incontri un'opzione non
1401 dichiarata in \param{optstring} viene ritornato il carattere \texttt{'?'}
1402 mentre se un'opzione che lo richiede non è seguita da un parametro viene
1403 ritornato il carattere \texttt{':'}, infine se viene incontrato il valore
1404 \texttt{'-{}-'} la scansione viene considerata conclusa, anche se vi sono altri
1405 elementi di \param{argv} che cominciano con il carattere \texttt{'-'}.
1406
1407 \begin{figure}[!htbp]
1408   \footnotesize \centering
1409   \begin{minipage}[c]{\codesamplewidth}
1410   \includecodesample{listati/option_code.c}
1411   \end{minipage}
1412   \normalsize
1413   \caption{Esempio di codice per la gestione delle opzioni.}
1414   \label{fig:proc_options_code}
1415 \end{figure}
1416
1417 Quando la funzione trova un'opzione essa ritorna il valore numerico del
1418 carattere, in questo modo si possono eseguire azioni specifiche usando uno
1419 \code{switch}; \func{getopt} inoltre inizializza alcune variabili globali:
1420 \begin{itemize*}
1421 \item \var{char *optarg} contiene il puntatore alla stringa parametro
1422   dell'opzione.
1423 \item \var{int optind} alla fine della scansione restituisce l'indice del
1424   primo elemento di \param{argv} che non è un'opzione.
1425 \item \var{int opterr} previene, se posto a zero, la stampa di un messaggio
1426   di errore in caso di riconoscimento di opzioni non definite.
1427 \item \var{int optopt} contiene il carattere dell'opzione non riconosciuta.
1428 \end{itemize*}
1429
1430 In fig.~\ref{fig:proc_options_code} è mostrata la sezione del programma
1431 \file{ForkTest.c} (che useremo nel prossimo capitolo per effettuare dei test
1432 sulla creazione dei processi) deputata alla decodifica delle opzioni a riga di
1433 comando. 
1434
1435 Si può notare che si è anzitutto (\texttt{\small 1}) disabilitata la stampa di
1436 messaggi di errore per opzioni non riconosciute, per poi passare al ciclo per
1437 la verifica delle opzioni (\texttt{\small 2-27}); per ciascuna delle opzioni
1438 possibili si è poi provveduto ad un'azione opportuna, ad esempio per le tre
1439 opzioni che prevedono un parametro si è effettuata la decodifica del medesimo
1440 (il cui indirizzo è contenuto nella variabile \var{optarg}) avvalorando la
1441 relativa variabile (\texttt{\small 12-14}, \texttt{\small 15-17} e
1442 \texttt{\small 18-20}). Completato il ciclo troveremo in \var{optind} l'indice
1443 in \code{argv[]} del primo degli argomenti rimanenti nella linea di comando.
1444
1445 Normalmente \func{getopt} compie una permutazione degli elementi di
1446 \param{argv} cosicché alla fine della scansione gli elementi che non sono
1447 opzioni sono spostati in coda al vettore. Oltre a questa esistono altre due
1448 modalità di gestire gli elementi di \param{argv}; se \param{optstring} inizia
1449 con il carattere \texttt{'+'} (o è impostata la variabile di ambiente
1450 \macro{POSIXLY\_CORRECT}) la scansione viene fermata non appena si incontra un
1451 elemento che non è un'opzione. 
1452
1453 L'ultima modalità, usata quando un programma può gestire la mescolanza fra
1454 opzioni e argomenti, ma se li aspetta in un ordine definito, si attiva
1455 quando \param{optstring} inizia con il carattere \texttt{'-'}. In questo caso
1456 ogni elemento che non è un'opzione viene considerato comunque un'opzione e
1457 associato ad un valore di ritorno pari ad 1, questo permette di identificare
1458 gli elementi che non sono opzioni, ma non effettua il riordinamento del
1459 vettore \param{argv}.
1460
1461
1462 \subsection{Le variabili di ambiente}
1463 \label{sec:proc_environ}
1464
1465 Oltre agli argomenti passati a linea di comando esiste un'altra modalità che
1466 permette di trasferire ad un processo delle informazioni in modo da
1467 modificarne il comportamento.  Ogni processo infatti riceve dal sistema, oltre
1468 alle variabili \param{argv} e \param{argc} anche un \textsl{ambiente} (in
1469 inglese \textit{environment}); questo viene espresso nella forma di una lista
1470 (chiamata \textit{environment list}) delle cosiddette \textsl{variabili di
1471   ambiente}, i valori di queste variabili possono essere poi usati dal
1472 programma.
1473
1474 Anche in questo caso la lista delle \textsl{variabili di ambiente} deve essere
1475 costruita ed utilizzata nella chiamata alla funzione \func{exec} (torneremo su
1476 questo in sez.~\ref{sec:proc_exec}) quando questo viene lanciato. Come per la
1477 lista degli argomenti anche questa lista è un vettore di puntatori a
1478 caratteri, ciascuno dei quali punta ad una stringa, terminata da un
1479 \val{NULL}. A differenza di \code{argv[]} in questo caso non si ha una
1480 lunghezza del vettore data da un equivalente di \param{argc}, ma la lista è
1481 terminata da un puntatore nullo.
1482
1483 L'indirizzo della lista delle variabili di ambiente è passato attraverso la
1484 variabile globale \var{environ}, che viene definita automaticamente per
1485 ciascun processo, e a cui si può accedere attraverso una semplice
1486 dichiarazione del tipo:
1487 \includecodesnip{listati/env_ptr.c}
1488 un esempio della struttura di questa lista, contenente alcune delle variabili
1489 più comuni che normalmente sono definite dal sistema, è riportato in
1490 fig.~\ref{fig:proc_envirno_list}.
1491 \begin{figure}[htb]
1492   \centering
1493 %  \includegraphics[width=15 cm]{img/environ_var}
1494   \begin{tikzpicture}[>=stealth]
1495   \draw (2,3.5) node {\textsf{Environment pointer}};
1496   \draw (6,3.5) node {\textsf{Environment list}};
1497   \draw (10.5,3.5) node {\textsf{Environment string}};
1498   \draw (0.5,2.5) rectangle (3.5,3);
1499   \draw (2,2.75) node {\texttt{environ}};
1500   \draw [->] (3.5,2.75) -- (4.5,2.75);
1501   \draw (4.5,2.5) rectangle (7.5,3);
1502   \draw (6,2.75) node {\texttt{environ[0]}};
1503   \draw (4.5,2) rectangle (7.5,2.5);
1504   \draw (6,2.25) node {\texttt{environ[1]}};
1505   \draw (4.5,1.5) rectangle (7.5,2);
1506   \draw (4.5,1) rectangle (7.5,1.5);
1507   \draw (4.5,0.5) rectangle (7.5,1);
1508   \draw (4.5,0) rectangle (7.5,0.5);
1509   \draw (6,0.25) node {\texttt{NULL}};
1510   \draw [->] (7.5,2.75) -- (8.5,2.75);
1511   \draw (8.5,2.75) node[right] {\texttt{HOME=/home/piccardi}};
1512   \draw [->] (7.5,2.25) -- (8.5,2.25);
1513   \draw (8.5,2.25) node[right] {\texttt{PATH=:/bin:/usr/bin}};
1514   \draw [->] (7.5,1.75) -- (8.5,1.75);
1515   \draw (8.5,1.75) node[right] {\texttt{SHELL=/bin/bash}};
1516   \draw [->] (7.5,1.25) -- (8.5,1.25);
1517   \draw (8.5,1.25) node[right] {\texttt{EDITOR=emacs}};
1518   \draw [->] (7.5,0.75) -- (8.5,0.75);
1519   \draw (8.5,0.75) node[right] {\texttt{OSTYPE=linux-gnu}};
1520   \end{tikzpicture}
1521   \caption{Esempio di lista delle variabili di ambiente.}
1522   \label{fig:proc_envirno_list}
1523 \end{figure}
1524
1525 Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo
1526 \textsl{\texttt{nome=valore}} ed in questa forma che le funzioni di gestione
1527 che vedremo a breve se le aspettano, se pertanto si dovesse costruire
1528 manualmente un ambiente si abbia cura di rispettare questa convenzione.
1529 Inoltre alcune variabili, come quelle elencate in
1530 fig.~\ref{fig:proc_envirno_list}, sono definite dal sistema per essere usate
1531 da diversi programmi e funzioni: per queste c'è l'ulteriore convenzione di
1532 usare nomi espressi in caratteri maiuscoli.\footnote{ma si tratta solo di una
1533   convenzione, niente vieta di usare caratteri minuscoli.}
1534
1535 Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è
1536 riservata alle applicazioni e ad alcune funzioni di libreria; in genere esse
1537 costituiscono un modo comodo per definire un comportamento specifico senza
1538 dover ricorrere all'uso di opzioni a linea di comando o di file di
1539 configurazione. É di norma cura della shell, quando esegue un comando, passare
1540 queste variabili al programma messo in esecuzione attraverso un uso opportuno
1541 delle relative chiamate (si veda sez.~\ref{sec:proc_exec}).
1542
1543 La shell ad esempio ne usa molte per il suo funzionamento, come \texttt{PATH}
1544 per indicare la lista delle directory in cui effettuare la ricerca dei comandi
1545 o \texttt{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come
1546 \texttt{HOME}, \texttt{USER}, ecc. sono invece definite al login (per i
1547 dettagli si veda sez.~\ref{sec:sess_login}), ed in genere è cura della propria
1548 distribuzione definire le opportune variabili di ambiente in uno script di
1549 avvio. Alcune servono poi come riferimento generico per molti programmi, come
1550 \texttt{EDITOR} che indica l'editor preferito da invocare in caso di
1551 necessità. Una in particolare, \texttt{LANG}, serve a controllare la
1552 localizzazione del programma (su cui torneremo in
1553 sez.~\ref{sec:proc_localization}) per adattarlo alla lingua ed alle convezioni
1554 dei vari paesi.
1555
1556 Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più
1557 comuni), come riportato in tab.~\ref{tab:proc_env_var}. GNU/Linux le supporta
1558 tutte e ne definisce anche altre, in particolare poi alcune funzioni di
1559 libreria prevedono la presenza di specifiche variabili di ambiente che ne
1560 modificano il comportamento, come quelle usate per indicare una localizzazione
1561 e quelle per indicare un fuso orario; una lista più completa che comprende
1562 queste ed ulteriori variabili si può ottenere con il comando \cmd{man 7
1563   environ}.
1564
1565 \begin{table}[htb]
1566   \centering
1567   \footnotesize
1568   \begin{tabular}[c]{|l|c|c|c|p{7cm}|}
1569     \hline
1570     \textbf{Variabile} & \textbf{POSIX} & \textbf{XPG3} 
1571     & \textbf{Linux} & \textbf{Descrizione} \\
1572     \hline
1573     \hline
1574     \texttt{USER}   &$\bullet$&$\bullet$&$\bullet$& Nome utente\\
1575     \texttt{LOGNAME}&$\bullet$&$\bullet$&$\bullet$& Nome di login\\
1576     \texttt{HOME}   &$\bullet$&$\bullet$&$\bullet$& Directory base
1577                                                     dell'utente\\
1578     \texttt{LANG}   &$\bullet$&$\bullet$&$\bullet$& Localizzazione\\
1579     \texttt{PATH}   &$\bullet$&$\bullet$&$\bullet$& Elenco delle directory
1580                                                     dei programmi\\
1581     \texttt{PWD}    &$\bullet$&$\bullet$&$\bullet$& Directory corrente\\
1582     \texttt{SHELL}  &$\bullet$&$\bullet$&$\bullet$& Shell in uso\\
1583     \texttt{TERM}   &$\bullet$&$\bullet$&$\bullet$& Tipo di terminale\\
1584     \texttt{PAGER}  &$\bullet$&$\bullet$&$\bullet$& Programma per vedere i
1585                                                     testi\\
1586     \texttt{EDITOR} &$\bullet$&$\bullet$&$\bullet$& Editor preferito\\
1587     \texttt{BROWSER}&$\bullet$&$\bullet$&$\bullet$& Browser preferito\\
1588     \texttt{TMPDIR} &$\bullet$&$\bullet$&$\bullet$& Directory dei file
1589                                                     temporanei\\
1590     \hline
1591   \end{tabular}
1592   \caption{Esempi delle variabili di ambiente più comuni definite da vari
1593     standard.} 
1594   \label{tab:proc_env_var}
1595 \end{table}
1596
1597 Lo standard ANSI C prevede l'esistenza di un ambiente, e pur non entrando
1598 nelle specifiche di come sono strutturati i contenuti, definisce la funzione
1599 \funcd{getenv} che permette di ottenere i valori delle variabili di ambiente;
1600 il suo prototipo è:
1601 \begin{prototype}{stdlib.h}{char *getenv(const char *name)}
1602   Esamina l'ambiente del processo cercando una stringa che corrisponda a
1603   quella specificata da \param{name}. 
1604   
1605   \bodydesc{La funzione ritorna \val{NULL} se non trova nulla, o il
1606     puntatore alla stringa che corrisponde (di solito nella forma
1607     \cmd{NOME=valore}).}
1608 \end{prototype}
1609
1610 Oltre a questa funzione di lettura, che è l'unica definita dallo standard ANSI
1611 C, nell'evoluzione dei sistemi Unix ne sono state proposte altre, da
1612 utilizzare per impostare e per cancellare le variabili di ambiente. Uno schema
1613 delle funzioni previste nei vari standard e disponibili in Linux è riportato
1614 in tab.~\ref{tab:proc_env_func}.
1615
1616 \begin{table}[htb]
1617   \centering
1618   \footnotesize
1619   \begin{tabular}[c]{|l|c|c|c|c|c|c|}
1620     \hline
1621     \textbf{Funzione} & \textbf{ANSI C} & \textbf{POSIX.1} & \textbf{XPG3} & 
1622     \textbf{SVr4} & \textbf{BSD} & \textbf{Linux} \\
1623     \hline
1624     \hline
1625     \func{getenv}  & $\bullet$ & $\bullet$ & $\bullet$ 
1626                    & $\bullet$ & $\bullet$ & $\bullet$ \\
1627     \func{setenv}  &    --     &    --     &   --      
1628                    &    --     & $\bullet$ & $\bullet$ \\
1629     \func{unsetenv}&    --     &    --     &   --       
1630                    &    --     & $\bullet$ & $\bullet$ \\
1631     \func{putenv}  &    --     & opz.      & $\bullet$ 
1632                    &    --     & $\bullet$ & $\bullet$ \\
1633     \func{clearenv}&    --     & opz.      &   --
1634                    &    --     &    --     & $\bullet$ \\
1635     \hline
1636   \end{tabular}
1637   \caption{Funzioni per la gestione delle variabili di ambiente.}
1638   \label{tab:proc_env_func}
1639 \end{table}
1640
1641 In Linux\footnote{in realtà nelle libc4 e libc5 sono definite solo le prime
1642   quattro, \func{clearenv} è stata introdotta con le \acr{glibc} 2.0.} sono
1643 definite tutte le funzioni elencate in tab.~\ref{tab:proc_env_func}. La prima,
1644 \func{getenv}, l'abbiamo appena esaminata; delle restanti le prime due,
1645 \funcd{putenv} e \funcd{setenv}, servono per assegnare nuove variabili di
1646 ambiente, i loro prototipi sono i seguenti:
1647 \begin{functions}
1648   \headdecl{stdlib.h} 
1649   
1650   \funcdecl{int setenv(const char *name, const char *value, int overwrite)}
1651   Imposta la variabile di ambiente \param{name} al valore \param{value}.
1652   
1653   \funcdecl{int putenv(char *string)} Aggiunge la stringa \param{string}
1654   all'ambiente.
1655   
1656   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e $-1$ per un
1657     errore, che è sempre \errval{ENOMEM}.}
1658 \end{functions}
1659
1660 La terza funzione della lista, \funcd{unsetenv}, serve a cancellare una
1661 variabile dall'ambiente, il suo prototipo è:
1662 \begin{functions}
1663   \headdecl{stdlib.h}
1664   
1665   \funcdecl{void unsetenv(const char *name)} Rimuove la variabile di ambiente
1666   \param{name}.
1667 \end{functions}
1668
1669 \noindent la funzione elimina ogni occorrenza della variabile specificata; se la
1670 variabile non esiste non succede nulla. Non è prevista (dato che la funzione è
1671 \ctyp{void}) nessuna segnalazione di errore.
1672
1673 Per modificare o aggiungere una variabile di ambiente si possono usare sia
1674 \func{setenv} che \func{putenv}. La prima permette di specificare
1675 separatamente nome e valore della variabile di ambiente, inoltre il valore di
1676 \param{overwrite} specifica il comportamento della funzione nel caso la
1677 variabile esista già, sovrascrivendola se diverso da zero, lasciandola
1678 immutata se uguale a zero.
1679
1680 La seconda funzione prende come argomento una stringa analoga a quella
1681 restituita da \func{getenv}, e sempre nella forma \code{NOME=valore}. Se la
1682 variabile specificata non esiste la stringa sarà aggiunta all'ambiente, se
1683 invece esiste il suo valore sarà impostato a quello specificato da
1684 \param{string}. 
1685
1686 Si tenga presente che, seguendo lo standard SUSv2, le \acr{glibc} successive
1687 alla versione 2.1.2 aggiungono \param{string} alla lista delle variabili di
1688 ambiente;\footnote{il comportamento è lo stesso delle vecchie \acr{libc4} e
1689   \acr{libc5}; nelle \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece
1690   fatta una copia, seguendo il comportamento di BSD4.4; dato che questo può
1691   dar luogo a perdite di memoria e non rispetta lo standard. Il comportamento
1692   è stato modificato a partire dalle 2.1.2, eliminando anche, sempre in
1693   conformità a SUSv2, l'attributo \direct{const} dal prototipo.} pertanto ogni
1694 cambiamento alla stringa in questione si riflette automaticamente
1695 sull'ambiente, e quindi si deve evitare di passare a questa funzione una
1696 variabile automatica (per evitare i problemi esposti in
1697 sez.~\ref{sec:proc_auto_var}). Si tenga infine presente che se si passa a
1698 \func{putenv} solo il nome di una variabile (cioè \param{string} è nella forma
1699 \texttt{NAME} e non contiene un carattere \texttt{'='}) allora questa viene
1700 cancellata dall'ambiente.
1701
1702 Infine quando chiamata a \func{putenv} comporta la necessità di creare una
1703 nuova versione del vettore \var{environ} questo sarà allocato automaticamente,
1704 ma la versione corrente sarà deallocata solo se anch'essa è risultante da
1705 un'allocazione fatta in precedenza da un'altra \func{putenv}. Questo avviene
1706 perché il vettore delle variabili di ambiente iniziale, creato dalla chiamata
1707 ad \func{exec} (vedi sez.~\ref{sec:proc_exec}) è piazzato nella memoria al di
1708 sopra dello \itindex{stack} stack, (vedi fig.~\ref{fig:proc_mem_layout}) e non
1709 nello \itindex{heap} \textit{heap} e quindi non può essere deallocato.
1710 Inoltre la memoria associata alle variabili di ambiente eliminate non viene
1711 liberata.
1712
1713 L'ultima funzione per la gestione dell'ambiente è \funcd{clearenv}, che viene
1714 usata per cancellare completamente tutto l'ambiente; il suo prototipo è:
1715 \begin{functions}
1716   \headdecl{stdlib.h}
1717   
1718   \funcdecl{int clearenv(void)} 
1719   Cancella tutto l'ambiente.
1720   
1721   \bodydesc{la funzione restituisce 0 in caso di successo e un valore diverso
1722     da zero per un errore.}
1723 \end{functions}
1724
1725 In genere si usa questa funzione in maniera precauzionale per evitare i
1726 problemi di sicurezza connessi nel trasmettere ai programmi che si invocano un
1727 ambiente che può contenere dei dati non controllati. In tal caso si provvede
1728 alla cancellazione di tutto l'ambiente per costruirne una versione
1729 ``\textsl{sicura}'' da zero.
1730
1731 \subsection{La localizzazione}
1732 \label{sec:proc_localization}
1733
1734 Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente
1735 \texttt{LANG} sia usata per indicare ai processi il valore della cosiddetta
1736 \textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie
1737 di sistema\footnote{prenderemo in esame soltanto il caso delle \acr{glibc}.}
1738 che consente di gestire in maniera automatica sia la lingua in cui vengono
1739 stampati i vari messaggi (come i messaggi associati agli errori che vedremo in
1740 sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una
1741 serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti
1742 alfabetici, le espressioni della valute, ecc.
1743
1744 La localizzazione di un programma si può selezionare con la 
1745
1746
1747 In realtà perché un programma sia effettivamente localizzato non è sufficiente 
1748
1749 % TODO trattare, quando ci sarà tempo, setlocale ed il resto
1750
1751
1752 %\subsection{Opzioni in formato esteso}
1753 %\label{sec:proc_opt_extended}
1754
1755 %Oltre alla modalità ordinaria di gestione delle opzioni trattata in
1756 %sez.~\ref{sec:proc_opt_handling} le \acr{glibc} forniscono una modalità
1757 %alternativa costituita dalle cosiddette \textit{long-options}, che consente di
1758 %esprimere le opzioni in una forma più descrittiva che nel caso più generale è
1759 %qualcosa del tipo di ``\texttt{-{}-option-name=parameter}''.
1760
1761 %(NdA: questa parte verrà inserita in seguito).
1762
1763 % TODO opzioni in formato esteso
1764
1765 \section{Problematiche di programmazione generica}
1766 \label{sec:proc_gen_prog}
1767
1768 Benché questo non sia un libro di C, è opportuno affrontare alcune delle
1769 problematiche generali che possono emergere nella programmazione e di quali
1770 precauzioni o accorgimenti occorre prendere per risolverle. Queste
1771 problematiche non sono specifiche di sistemi unix-like o multitasking, ma
1772 avendo trattato in questo capitolo il comportamento dei processi visti come
1773 entità a sé stanti, le riportiamo qui.
1774
1775
1776 \subsection{Il passaggio delle variabili e dei valori di ritorno}
1777 \label{sec:proc_var_passing}
1778
1779 Una delle caratteristiche standard del C è che le variabili vengono passate
1780 alle subroutine attraverso un meccanismo che viene chiamato \textit{by value}
1781 (diverso ad esempio da quanto avviene con il Fortran, dove le variabili sono
1782 passate, come suol dirsi, \textit{by reference}, o dal C++ dove la modalità
1783 del passaggio può essere controllata con l'operatore \cmd{\&}).
1784
1785 Il passaggio di una variabile \textit{by value} significa che in realtà quello
1786 che viene passato alla subroutine è una copia del valore attuale di quella
1787 variabile, copia che la subroutine potrà modificare a piacere, senza che il
1788 valore originale nella funzione chiamante venga toccato. In questo modo non
1789 occorre preoccuparsi di eventuali effetti delle operazioni della subroutine
1790 sulla variabile passata come argomento.
1791
1792 Questo però va inteso nella maniera corretta. Il passaggio \textit{by value}
1793 vale per qualunque variabile, puntatori compresi; quando però in una
1794 subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in
1795 realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche
1796 se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e
1797 le eventuali modifiche avranno effetto e saranno visibili anche nella funzione
1798 chiamante.
1799
1800 Nella maggior parte delle funzioni di libreria e delle system call i puntatori
1801 vengono usati per scambiare dati (attraverso buffer o strutture) e le
1802 variabili semplici vengono usate per specificare argomenti; in genere le
1803 informazioni a riguardo dei risultati vengono passate alla funzione chiamante
1804 attraverso il valore di ritorno.  È buona norma seguire questa pratica anche
1805 nella programmazione normale.
1806
1807 Talvolta però è necessario che la funzione possa restituire indietro alla
1808 funzione chiamante un valore relativo ad uno dei suoi argomenti.  Per far
1809 questo si usa il cosiddetto \itindex{value~result~argument} \textit{value
1810   result argument}, si passa cioè, invece di una normale variabile, un
1811 puntatore alla stessa; vedremo alcuni esempi di questa modalità nelle funzioni
1812 che gestiscono i socket (in sez.~\ref{sec:TCP_functions}), in cui, per
1813 permettere al kernel di restituire informazioni sulle dimensioni delle
1814 strutture degli indirizzi utilizzate, viene usato questo meccanismo.
1815
1816
1817 \subsection{Il passaggio di un numero variabile di argomenti}
1818 \label{sec:proc_variadic}
1819
1820 Come vedremo nei capitoli successivi, non sempre è possibile specificare un
1821 numero fisso di argomenti per una funzione.  Lo standard ISO C prevede nella
1822 sua sintassi la possibilità di definire delle \index{variadic}
1823 \textit{variadic function} che abbiano un numero variabile di argomenti,
1824 attraverso l'uso nella dichiarazione della funzione dello speciale costrutto
1825 ``\texttt{\textellipsis}'', che viene chiamato \textit{ellipsis}.
1826
1827 Lo standard però non provvede a livello di linguaggio alcun meccanismo con cui
1828 dette funzioni possono accedere ai loro argomenti.  L'accesso viene pertanto
1829 realizzato a livello delle librerie standard del C che provvedono gli
1830 strumenti adeguati.  L'uso di una \textit{variadic function} prevede quindi
1831 tre punti:
1832 \begin{itemize*}
1833 \item \textsl{Dichiarare} la funzione come \textit{variadic} usando un
1834   prototipo che contenga una \textit{ellipsis}.
1835 \item \textsl{Definire} la funzione come \textit{variadic} usando la stessa
1836   \textit{ellipsis}, ed utilizzare le apposite macro che consentono la
1837   gestione di un numero variabile di argomenti.
1838 \item \textsl{Invocare} la funzione specificando prima gli argomenti fissi, ed
1839   a seguire quelli addizionali.
1840 \end{itemize*}
1841
1842 Lo standard ISO C prevede che una \index{variadic} \textit{variadic function}
1843 abbia sempre almeno un argomento fisso; prima di effettuare la dichiarazione
1844 deve essere incluso l'apposito header file \file{stdarg.h}; un esempio di
1845 dichiarazione è il prototipo della funzione \func{execl} che vedremo in
1846 sez.~\ref{sec:proc_exec}:
1847 \includecodesnip{listati/exec_sample.c}
1848 in questo caso la funzione prende due argomenti fissi ed un numero variabile
1849 di altri argomenti (che verranno a costituire gli elementi successivi al primo
1850 del vettore \param{argv} passato al nuovo processo). Lo standard ISO C
1851 richiede inoltre che l'ultimo degli argomenti fissi sia di tipo
1852 \textit{self-promoting}\footnote{il linguaggio C prevede che quando si
1853   mescolano vari tipi di dati, alcuni di essi possano essere \textsl{promossi}
1854   per compatibilità; ad esempio i tipi \ctyp{float} vengono convertiti
1855   automaticamente a \ctyp{double} ed i \ctyp{char} e gli \ctyp{short} ad
1856   \ctyp{int}. Un tipo \textit{self-promoting} è un tipo che verrebbe promosso
1857   a sé stesso.} il che esclude vettori, puntatori a funzioni e interi di tipo
1858 \ctyp{char} o \ctyp{short} (con segno o meno). Una restrizione ulteriore di
1859 alcuni compilatori è di non dichiarare l'ultimo argomento fisso come
1860 \direct{register}.
1861
1862 Una volta dichiarata la funzione il secondo passo è accedere ai vari argomenti
1863 quando la si va a definire. Gli argomenti fissi infatti hanno un loro nome, ma
1864 quelli variabili vengono indicati in maniera generica dalla \textit{ellipsis}.
1865
1866 L'unica modalità in cui essi possono essere recuperati è pertanto quella
1867 sequenziale; essi verranno estratti dallo \itindex{stack} \textit{stack}
1868 secondo l'ordine in cui sono stati scritti. Per fare questo in \file{stdarg.h}
1869 sono definite delle apposite macro; la procedura da seguire è la seguente:
1870 \begin{enumerate*}
1871 \item Inizializzare un puntatore alla lista degli argomenti di tipo
1872   \macro{va\_list} attraverso la macro \macro{va\_start}.
1873 \item Accedere ai vari argomenti opzionali con chiamate successive alla macro
1874   \macro{va\_arg}, la prima chiamata restituirà il primo argomento, la seconda
1875   il secondo e così via.
1876 \item Dichiarare la conclusione dell'estrazione degli argomenti invocando la
1877   macro \macro{va\_end}.
1878 \end{enumerate*}
1879
1880 In generale è perfettamente legittimo richiedere meno argomenti di quelli che
1881 potrebbero essere stati effettivamente forniti, e nella esecuzione delle
1882 \macro{va\_arg} ci si può fermare in qualunque momento ed i restanti argomenti
1883 saranno ignorati; se invece si richiedono più argomenti di quelli forniti si
1884 otterranno dei valori indefiniti. Nel caso del \cmd{gcc} l'uso di
1885 \macro{va\_end} è inutile, ma si consiglia di usarla ugualmente per
1886 compatibilità. Le definizioni delle macro citate sono le seguenti:
1887 \begin{functions}
1888   \headdecl{stdarg.h}
1889   
1890   \funcdecl{void va\_start(va\_list ap, last)} Inizializza il puntatore alla
1891   lista di argomenti \param{ap}; il parametro \param{last} \emph{deve} essere
1892   l'ultimo degli argomenti fissi.
1893   
1894   \funcdecl{type va\_arg(va\_list ap, type)} Restituisce il valore del
1895   successivo argomento opzionale, modificando opportunamente \param{ap}; la
1896   macro richiede che si specifichi il tipo dell'argomento attraverso il
1897   parametro \param{type} che deve essere il nome del tipo dell'argomento in
1898   questione. Il tipo deve essere \textit{self-promoting}.
1899
1900   \funcdecl{void va\_end(va\_list ap)} Conclude l'uso di \param{ap}.
1901 \end{functions}
1902
1903 In generale si possono avere più puntatori alla lista degli argomenti,
1904 ciascuno andrà inizializzato con \macro{va\_start} e letto con \macro{va\_arg}
1905 e ciascuno potrà scandire la lista degli argomenti per conto suo. Dopo l'uso
1906 di \macro{va\_end} la variabile \param{ap} diventa indefinita e successive
1907 chiamate a \macro{va\_arg} non funzioneranno. Si avranno risultati indefiniti
1908 anche chiamando \macro{va\_arg} specificando un tipo che non corrisponde a
1909 quello dell'argomento.
1910
1911 Un altro limite delle macro è che i passi 1) e 3) devono essere eseguiti nel
1912 corpo principale della funzione, il passo 2) invece può essere eseguito anche
1913 in una subroutine passandole il puntatore alla lista di argomenti; in questo
1914 caso però si richiede che al ritorno della funzione il puntatore non venga più
1915 usato (lo standard richiederebbe la chiamata esplicita di \macro{va\_end}),
1916 dato che il valore di \param{ap} risulterebbe indefinito.
1917
1918 Esistono dei casi in cui è necessario eseguire più volte la scansione degli
1919 argomenti e poter memorizzare una posizione durante la stessa. In questo caso
1920 sembrerebbe naturale copiarsi il puntatore alla lista degli argomenti con una
1921 semplice assegnazione. Dato che una delle realizzazioni più comuni di
1922 \macro{va\_list} è quella di un puntatore nello \itindex{stack} \textit{stack}
1923 all'indirizzo dove sono stati salvati gli argomenti, è assolutamente normale
1924 pensare di poter effettuare questa operazione.
1925
1926 In generale però possono esistere anche realizzazioni diverse, per questo
1927 motivo \macro{va\_list} è definito come \index{tipo!opaco} \textsl{tipo opaco}
1928 e non può essere assegnato direttamente ad un'altra variabile dello stesso
1929 tipo. Per risolvere questo problema lo standard ISO C99\footnote{alcuni
1930   sistemi che non hanno questa macro provvedono al suo posto
1931   \macro{\_\_va\_copy} che era il nome proposto in una bozza dello standard.}
1932 ha previsto una macro ulteriore che permette di eseguire la copia di un
1933 puntatore alla lista degli argomenti:
1934 \begin{prototype}{stdarg.h}{void va\_copy(va\_list dest, va\_list src)}
1935   Copia l'attuale valore \param{src} del puntatore alla lista degli argomenti
1936   su \param{dest}.
1937 \end{prototype}
1938 \noindent anche in questo caso è buona norma chiudere ogni esecuzione di una
1939 \macro{va\_copy} con una corrispondente \macro{va\_end} sul nuovo puntatore
1940 alla lista degli argomenti.
1941
1942 La chiamata di una funzione con un numero variabile di argomenti, posto che la
1943 si sia dichiarata e definita come tale, non prevede nulla di particolare;
1944 l'invocazione è identica alle altre, con gli argomenti, sia quelli fissi che
1945 quelli opzionali, separati da virgole. Quello che però è necessario tenere
1946 presente è come verranno convertiti gli argomenti variabili.
1947
1948 In Linux gli argomenti dello stesso tipo sono passati allo stesso modo, sia
1949 che siano fissi sia che siano opzionali (alcuni sistemi trattano diversamente
1950 gli opzionali), ma dato che il prototipo non può specificare il tipo degli
1951 argomenti opzionali, questi verranno sempre promossi, pertanto nella ricezione
1952 dei medesimi occorrerà tenerne conto (ad esempio un \ctyp{char} verrà visto da
1953 \macro{va\_arg} come \ctyp{int}).
1954
1955 Uno dei problemi che si devono affrontare con le funzioni con un numero
1956 variabile di argomenti è che non esiste un modo generico che permetta di
1957 stabilire quanti sono gli argomenti passati effettivamente in una chiamata.
1958
1959 Esistono varie modalità per affrontare questo problema; una delle più
1960 immediate è quella di specificare il numero degli argomenti opzionali come uno
1961 degli argomenti fissi. Una variazione di questo metodo è l'uso di un argomento
1962 per specificare anche il tipo degli argomenti (come fa la stringa di formato
1963 per \func{printf}). 
1964
1965 Una modalità diversa, che può essere applicata solo quando il tipo degli
1966 argomenti lo rende possibile, è quella che prevede di usare un valore speciale
1967 come ultimo argomento (come fa ad esempio \func{execl} che usa un puntatore
1968 \val{NULL} per indicare la fine della lista degli argomenti).
1969
1970
1971 \subsection{Potenziali problemi con le variabili automatiche}
1972 \label{sec:proc_auto_var}
1973
1974 Uno dei possibili problemi che si possono avere con le subroutine è quello di
1975 restituire alla funzione chiamante dei dati che sono contenuti in una
1976 variabile automatica.  Ovviamente quando la subroutine ritorna la sezione
1977 dello \itindex{stack} \textit{stack} che conteneva la variabile automatica
1978 potrà essere riutilizzata da una nuova funzione, con le immaginabili
1979 conseguenze di sovrapposizione e sovrascrittura dei dati.
1980
1981 Per questo una delle regole fondamentali della programmazione in C è che
1982 all'uscita di una funzione non deve restare nessun riferimento alle variabili
1983 locali; qualora sia necessario utilizzare variabili che possano essere viste
1984 anche dalla funzione chiamante queste devono essere allocate esplicitamente, o
1985 in maniera statica (usando variabili di tipo \ctyp{static} o \ctyp{extern}), o
1986 dinamicamente con una delle funzioni della famiglia \func{malloc}.
1987
1988
1989 \subsection{Il controllo di flusso non locale}
1990 \label{sec:proc_longjmp}
1991
1992 Il controllo del flusso di un programma in genere viene effettuato con le
1993 varie istruzioni del linguaggio C; fra queste la più bistrattata è il
1994 \code{goto}, che viene deprecato in favore dei costrutti della programmazione
1995 strutturata, che rendono il codice più leggibile e mantenibile. Esiste però un
1996 caso in cui l'uso di questa istruzione porta all'implementazione più
1997 efficiente e più chiara anche dal punto di vista della struttura del
1998 programma: quello dell'uscita in caso di errore.
1999
2000 \index{salto~non-locale|(} 
2001
2002 Il C però non consente di effettuare un salto ad una etichetta definita in
2003 un'altra funzione, per cui se l'errore avviene in una funzione, e la sua
2004 gestione ordinaria è in un'altra, occorre usare quello che viene chiamato un
2005 \textsl{salto non-locale}.  Il caso classico in cui si ha questa necessità,
2006 citato sia in \cite{APUE} che in \cite{glibc}, è quello di un programma nel
2007 cui corpo principale vengono letti dei dati in ingresso sui quali viene
2008 eseguita, tramite una serie di funzioni di analisi, una scansione dei
2009 contenuti, da cui si ottengono le indicazioni per l'esecuzione di opportune
2010 operazioni.
2011
2012 Dato che l'analisi può risultare molto complessa, ed opportunamente suddivisa
2013 in fasi diverse, la rilevazione di un errore nei dati in ingresso può accadere
2014 all'interno di funzioni profondamente annidate l'una nell'altra. In questo
2015 caso si dovrebbe gestire, per ciascuna fase, tutta la casistica del passaggio
2016 all'indietro di tutti gli errori rilevabili dalle funzioni usate nelle fasi
2017 successive.  Questo comporterebbe una notevole complessità, mentre sarebbe
2018 molto più comodo poter tornare direttamente al ciclo di lettura principale,
2019 scartando l'input come errato.\footnote{a meno che, come precisa \cite{glibc},
2020   alla chiusura di ciascuna fase non siano associate operazioni di pulizia
2021   specifiche (come deallocazioni, chiusure di file, ecc.), che non potrebbero
2022   essere eseguite con un salto non-locale.}
2023
2024 Tutto ciò può essere realizzato proprio con un salto non-locale; questo di
2025 norma viene realizzato salvando il contesto dello \itindex{stack}
2026 \textit{stack} nel punto in cui si vuole tornare in caso di errore, e
2027 ripristinandolo, in modo da tornare nella funzione da cui si era partiti,
2028 quando serve.  La funzione che permette di salvare il contesto dello
2029 \itindex{stack} \textit{stack} è \funcd{setjmp}, il cui prototipo è:
2030 \begin{functions}
2031   \headdecl{setjmp.h}
2032   \funcdecl{int setjmp(jmp\_buf env)}
2033   
2034   Salva il contesto dello stack. 
2035
2036   \bodydesc{La funzione ritorna zero quando è chiamata direttamente e un
2037     valore diverso da zero quando ritorna da una chiamata di \func{longjmp}
2038     che usa il contesto salvato in precedenza.}
2039 \end{functions}
2040   
2041 Quando si esegue la funzione il contesto corrente dello \itindex{stack}
2042 \textit{stack} viene salvato nell'argomento \param{env}, una variabile di tipo
2043 \type{jmp\_buf}\footnote{questo è un classico esempio di variabile di
2044   \index{tipo!opaco} \textsl{tipo opaco}. Si definiscono così strutture ed
2045   altri oggetti usati da una libreria, la cui struttura interna non deve
2046   essere vista dal programma chiamante (da cui il nome) che li devono
2047   utilizzare solo attraverso dalle opportune funzioni di gestione.}  che deve
2048 essere stata definita in precedenza. In genere le variabili di tipo
2049 \type{jmp\_buf} vengono definite come variabili globali in modo da poter
2050 essere viste in tutte le funzioni del programma.
2051
2052 Quando viene eseguita direttamente la funzione ritorna sempre zero, un valore
2053 diverso da zero viene restituito solo quando il ritorno è dovuto ad una
2054 chiamata di \func{longjmp} in un'altra parte del programma che ripristina lo
2055 \itindex{stack} \textit{stack} effettuando il salto non-locale. Si tenga conto
2056 che il contesto salvato in \param{env} viene invalidato se la funzione che ha
2057 chiamato \func{setjmp} ritorna, nel qual caso un successivo uso di
2058 \func{longjmp} può comportare conseguenze imprevedibili (e di norma fatali)
2059 per il processo.
2060   
2061 Come accennato per effettuare un salto non-locale ad
2062 un punto precedentemente stabilito con \func{setjmp} si usa la funzione
2063 \funcd{longjmp}; il suo prototipo è:
2064 \begin{functions}
2065   \headdecl{setjmp.h}
2066   \funcdecl{void longjmp(jmp\_buf env, int val)}
2067   
2068   Ripristina il contesto dello stack.
2069   
2070   \bodydesc{La funzione non ritorna.}
2071 \end{functions}
2072
2073 La funzione ripristina il contesto dello \itindex{stack} \textit{stack}
2074 salvato da una chiamata a \func{setjmp} nell'argomento \param{env}. Dopo
2075 l'esecuzione della funzione il programma prosegue nel codice successivo al
2076 ritorno della \func{setjmp} con cui si era salvato \param{env}, che restituirà
2077 il valore
2078 \param{val} invece di zero.  Il valore di \param{val} specificato nella
2079 chiamata deve essere diverso da zero, se si è specificato 0 sarà comunque
2080 restituito 1 al suo posto.
2081
2082 In sostanza un \func{longjmp} è analogo ad un \code{return}, solo che invece
2083 di ritornare alla riga successiva della funzione chiamante, il programma
2084 ritorna alla posizione della relativa \func{setjmp}, l'altra differenza è che
2085 il ritorno può essere effettuato anche attraverso diversi livelli di funzioni
2086 annidate.
2087
2088 L'implementazione di queste funzioni comporta alcune restrizioni dato che esse
2089 interagiscono direttamente con la gestione dello \itindex{stack}
2090 \textit{stack} ed il funzionamento del compilatore stesso. In particolare
2091 \func{setjmp} è implementata con una macro, pertanto non si può cercare di
2092 ottenerne l'indirizzo, ed inoltre delle chiamate a questa funzione sono sicure
2093 solo in uno dei seguenti casi:
2094 \begin{itemize*}
2095 \item come espressione di controllo in un comando condizionale, di selezione
2096   o di iterazione (come \code{if}, \code{switch} o \code{while});
2097 \item come operando per un operatore di uguaglianza o confronto in una
2098   espressione di controllo di un comando condizionale, di selezione o di
2099   iterazione;
2100 \item come operando per l'operatore di negazione (\code{!}) in una espressione
2101   di controllo di un comando condizionale, di selezione o di iterazione;
2102 \item come espressione a sé stante.
2103 \end{itemize*}
2104
2105 In generale, dato che l'unica differenza fra la chiamata diretta e quella
2106 ottenuta nell'uscita con un \func{longjmp} è costituita dal valore di ritorno
2107 di \func{setjmp}, quest'ultima usualmente viene chiamata all'interno di un
2108 comando \code{if}.
2109
2110 Uno dei punti critici dei salti non-locali è quello del valore delle
2111 variabili, ed in particolare quello delle variabili automatiche della funzione
2112 a cui si ritorna. In generale le variabili globali e statiche mantengono i
2113 valori che avevano al momento della chiamata di \func{longjmp}, ma quelli
2114 delle variabili automatiche (o di quelle dichiarate
2115 \direct{register}\footnote{la direttiva \direct{register} del compilatore
2116   chiede che la variabile dichiarata tale sia mantenuta, nei limiti del
2117   possibile, all'interno di un registro del processore. Questa direttiva è
2118   originaria dell'epoca dai primi compilatori, quando stava al programmatore
2119   scrivere codice ottimizzato, riservando esplicitamente alle variabili più
2120   usate l'uso dei registri del processore. Oggi questa direttiva è in disuso
2121   dato che tutti i compilatori sono normalmente in grado di valutare con
2122   maggior efficacia degli stessi programmatori quando sia il caso di eseguire
2123   questa ottimizzazione.}) sono in genere indeterminati.
2124
2125 Quello che succede infatti è che i valori delle variabili che sono tenute in
2126 memoria manterranno il valore avuto al momento della chiamata di
2127 \func{longjmp}, mentre quelli tenuti nei registri del processore (che nella
2128 chiamata ad un'altra funzione vengono salvati nel contesto nello
2129 \itindex{stack} \textit{stack}) torneranno al valore avuto al momento della
2130 chiamata di \func{setjmp}; per questo quando si vuole avere un comportamento
2131 coerente si può bloccare l'ottimizzazione che porta le variabili nei registri
2132 dichiarandole tutte come \direct{volatile}.\footnote{la direttiva
2133   \direct{volatile} informa il compilatore che la variabile che è dichiarata
2134   può essere modificata, durante l'esecuzione del nostro, da altri programmi.
2135   Per questo motivo occorre dire al compilatore che non deve essere mai
2136   utilizzata l'ottimizzazione per cui quanto opportuno essa viene mantenuta in
2137   un registro, poiché in questo modo si perderebbero le eventuali modifiche
2138   fatte dagli altri programmi (che avvengono solo in una copia posta in
2139   memoria).}
2140
2141 \index{salto~non-locale|)}
2142
2143
2144 \subsection{La \textit{endianess}}
2145 \label{sec:sock_endianess}
2146
2147 \itindbeg{endianess} 
2148
2149 Uno dei problemi di programmazione che può dar luogo ad effetti imprevisti è
2150 quello relativo alla cosiddetta \textit{endianess}.  Questa è una
2151 caratteristica generale dell'architettura hardware di un computer che dipende
2152 dal fatto che la rappresentazione di un numero binario può essere fatta in due
2153 modi, chiamati rispettivamente \textit{big endian} e \textit{little endian} a
2154 seconda di come i singoli bit vengono aggregati per formare le variabili
2155 intere (ed in genere in diretta corrispondenza a come sono poi in realtà
2156 cablati sui bus interni del computer).
2157
2158 \begin{figure}[!htb]
2159   \centering \includegraphics[height=3cm]{img/endianess}
2160   \caption{Schema della disposizione dei dati in memoria a seconda della
2161     \textit{endianess}.}
2162   \label{fig:sock_endianess}
2163 \end{figure}
2164
2165 Per capire meglio il problema si consideri un intero a 32 bit scritto in una
2166 locazione di memoria posta ad un certo indirizzo. Come illustrato in
2167 fig.~\ref{fig:sock_endianess} i singoli bit possono essere disposti in memoria
2168 in due modi: a partire dal più significativo o a partire dal meno
2169 significativo.  Così nel primo caso si troverà il byte che contiene i bit più
2170 significativi all'indirizzo menzionato e il byte con i bit meno significativi
2171 nell'indirizzo successivo; questo ordinamento è detto \textit{big endian},
2172 dato che si trova per prima la parte più grande. Il caso opposto, in cui si
2173 parte dal bit meno significativo è detto per lo stesso motivo \textit{little
2174   endian}.
2175
2176 Si può allora verificare quale tipo di \textit{endianess} usa il proprio
2177 computer con un programma elementare che si limita ad assegnare un valore ad
2178 una variabile per poi ristamparne il contenuto leggendolo un byte alla volta.
2179 Il codice di detto programma, \file{endtest.c}, è nei sorgenti allegati,
2180 allora se lo eseguiamo su un normale PC compatibile, che è \textit{little
2181   endian} otterremo qualcosa del tipo:
2182 \begin{verbatim}
2183 [piccardi@gont sources]$ ./endtest
2184 Using value ABCDEF01
2185 val[0]= 1
2186 val[1]=EF
2187 val[2]=CD
2188 val[3]=AB
2189 \end{verbatim}%$
2190 mentre su un vecchio Macintosh con PowerPC, che è \textit{big endian} avremo
2191 qualcosa del tipo:
2192 \begin{verbatim}
2193 piccardi@anarres:~/gapil/sources$ ./endtest
2194 Using value ABCDEF01
2195 val[0]=AB
2196 val[1]=CD
2197 val[2]=EF
2198 val[3]= 1
2199 \end{verbatim}%$
2200
2201 L'attenzione alla \textit{endianess} nella programmazione è importante, perché
2202 se si fanno assunzioni relative alla propria architettura non è detto che
2203 queste restino valide su un'altra architettura. Inoltre, come vedremo ad
2204 esempio in sez.~\ref{sec:sock_addr_func}, si possono avere problemi quando ci
2205 si trova a usare valori di un formato con una infrastruttura che ne usa
2206 un altro. 
2207
2208 La \textit{endianess} di un computer dipende essenzialmente dalla architettura
2209 hardware usata; Intel e Digital usano il \textit{little endian}, Motorola,
2210 IBM, Sun (sostanzialmente tutti gli altri) usano il \textit{big endian}. Il
2211 formato dei dati contenuti nelle intestazioni dei protocolli di rete (il
2212 cosiddetto \textit{network order} è anch'esso \textit{big endian}; altri
2213 esempi di uso di questi due diversi formati sono quello del bus PCI, che è
2214 \textit{little endian}, o quello del bus VME che è \textit{big endian}.
2215
2216 Esistono poi anche dei processori che possono scegliere il tipo di formato
2217 all'avvio e alcuni che, come il PowerPC o l'Intel i860, possono pure passare
2218 da un tipo di ordinamento all'altro con una specifica istruzione. In ogni caso
2219 in Linux l'ordinamento è definito dall'architettura e dopo l'avvio del sistema
2220 in genere resta sempre lo stesso,\footnote{su architettura PowerPC è possibile
2221   cambiarlo, si veda sez.~\ref{sec:process_prctl}.} anche quando il processore
2222 permetterebbe di eseguire questi cambiamenti.
2223
2224 \begin{figure}[!htbp]
2225   \footnotesize \centering
2226   \begin{minipage}[c]{\codesamplewidth}
2227     \includecodesample{listati/endian.c}
2228   \end{minipage} 
2229   \normalsize
2230   \caption{La funzione \func{endian}, usata per controllare il tipo di
2231     architettura della macchina.}
2232   \label{fig:sock_endian_code}
2233 \end{figure}
2234
2235 Per controllare quale tipo di ordinamento si ha sul proprio computer si è
2236 scritta una piccola funzione di controllo, il cui codice è riportato
2237 fig.~\ref{fig:sock_endian_code}, che restituisce un valore nullo (falso) se
2238 l'architettura è \textit{big endian} ed uno non nullo (vero) se l'architettura
2239 è \textit{little endian}.
2240
2241 Come si vede la funzione è molto semplice, e si limita, una volta assegnato
2242 (\texttt{\small 9}) un valore di test pari a \texttt{0xABCD} ad una variabile
2243 di tipo \ctyp{short} (cioè a 16 bit), a ricostruirne una copia byte a byte.
2244 Per questo prima (\texttt{\small 10}) si definisce il puntatore \var{ptr} per
2245 accedere al contenuto della prima variabile, ed infine calcola (\texttt{\small
2246   11}) il valore della seconda assumendo che il primo byte sia quello meno
2247 significativo (cioè, per quanto visto in fig.~\ref{fig:sock_endianess}, che sia
2248 \textit{little endian}). Infine la funzione restituisce (\texttt{\small 12})
2249 il valore del confronto delle due variabili. 
2250 \itindend{endianess}
2251
2252
2253
2254 % LocalWords:  like exec kernel thread main ld linux static linker char envp Gb
2255 % LocalWords:  sez POSIX exit system call cap abort shell diff errno stdlib int
2256 % LocalWords:  SUCCESS FAILURE void atexit stream fclose unistd descriptor init
2257 % LocalWords:  SIGCHLD wait function glibc SunOS arg argp execve fig high kb Mb
2258 % LocalWords:  memory alpha swap table printf Unit MMU paging fault SIGSEGV BSS
2259 % LocalWords:  multitasking text segment NULL Block Started Symbol fill black
2260 % LocalWords:  heap stack calling convention size malloc calloc realloc nmemb
2261 % LocalWords:  ENOMEM ptr uClib cfree error leak smartpointers hook Dmalloc brk
2262 % LocalWords:  Gray Watson Electric Fence Bruce Perens sbrk longjmp SUSv BSD ap
2263 % LocalWords:  ptrdiff increment locking lock copy write capabilities IPC mlock
2264 % LocalWords:  capability MEMLOCK limits getpagesize RLIMIT munlock sys const
2265 % LocalWords:  addr len EINVAL EPERM mlockall munlockall flags l'OR CURRENT IFS
2266 % LocalWords:  argc argv parsing questofile txt getopt optstring switch optarg
2267 % LocalWords:  optind opterr optopt ForkTest POSIXLY CORRECT long options NdA
2268 % LocalWords:  option parameter list environ PATH HOME XPG tab LOGNAME LANG PWD
2269 % LocalWords:  TERM PAGER TMPDIR getenv name SVr setenv unsetenv putenv opz gcc
2270 % LocalWords:  clearenv libc value overwrite string reference result argument
2271 % LocalWords:  socket variadic ellipsis header stdarg execl self promoting last
2272 % LocalWords:  float double short register type dest src extern setjmp jmp buf
2273 % LocalWords:  env return if while Di page cdecl  rectangle node anchor west PS
2274 % LocalWords:  environment rounded corners dashed south width height draw east
2275 % LocalWords:  exithandler handler violation inline SOURCE SVID XOPEN mincore
2276 % LocalWords:  length unsigned vec EFAULT EAGAIN dell'I memalign valloc posix
2277 % LocalWords:  boundary memptr alignment sizeof overrun mcheck abortfn enum big
2278 % LocalWords:  mprobe DISABLED HEAD TAIL touch right emacs OSTYPE endianess IBM
2279 % LocalWords:  endian little endtest Macintosh PowerPC Intel Digital Motorola
2280 % LocalWords:  Sun order VME 
2281
2282 %%% Local Variables: 
2283 %%% mode: latex
2284 %%% TeX-master: "gapil"
2285 %%% End: