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