Aggiunta figura, molto provvisoria, sull'allocazione delle porte.
[gapil.git] / process.tex
index d3fa51d41ca3f9f6e280dd3d4056a61af62507eb..a096d6a866c6d87f152ad5888b92fb17e9e8f294 100644 (file)
@@ -961,20 +961,51 @@ Il passaggio di una variabile \textit{by value} significa che in realt
 che viene passato alla subroutine è una copia del valore attuale di quella
 variabile, copia che la subroutine potrà modificare a piacere, senza che il
 valore originale nella routine chiamante venga toccato. In questo modo non
-occorre preoccuparsi di eventuali effetti delle operazioni della subroutine.
-
-La maggior parte delle funzioni di libreria e delle system call funziona
-esattamente in questo modo restituendo eventuali risultati alla routine
-chiamante attraverso il valore di ritorno. Talvolta però è necessario che la
-funzione possa restituire indietro alla funzione chiamate un valore relativo
-ad uno dei sui parametri.
-
-
+occorre preoccuparsi di eventuali effetti delle operazioni della subroutine
+sulla variabile passata come parametro.
+
+Questo però va inteso nella maniera corretta. Il passaggio \textit{by value}
+vale per qualunque variabile, puntatori compresi; quando però in una
+subroutine si usano dei puntatori (ad esempio per scrivere in un buffer) in
+realtà si va a modificare la zona di memoria a cui essi puntano, per cui anche
+se i puntatori sono copie, i dati a cui essi puntano sono sempre gli stessi, e
+le eventuali modifiche avranno effetto e saranno visibili anche nella routine
+chiamante.
+
+Nella maggior parte delle funzioni di libreria e delle system call i puntatori
+vengono usati per scambiare dati (attraverso buffer o strutture) e le
+variabili semplici vengono usate per specificare parametri; in genere le
+informazioni a riguardo dei risultati vengono passate alla routine chiamante
+attraverso il valore di ritorno.  È buona norma seguire questa pratica anche
+nella programmazione normale.
+
+
+Talvolta però è necessario che la funzione possa restituire indietro alla
+funzione chiamante un valore relativo ad uno dei suoi parametri.  Per far
+questo si usa il cosiddetto \textit{value result argument}, si passa cioè,
+invece di una normale variabile un puntatore; vedremo alcuni esempi di questa
+modalità nelle funzioni che gestiscono i socket (in
+\secref{sec:TCPel_functions}) in cui, per permettere al kernel di restituire
+informazioni sulle dimensioni delle strutture degli indirizzi utilizzate,
+viene usato questo meccanismo.
 
 
 \subsection{Potenziali problemi con le variabili automatiche}
 \label{sec:proc_auto_var}
 
+Uno dei possibili problemi che si possono avere con le subroutine è quello di
+restituire alla funzione chiamante dei dati che sono contenuti in una
+variabile automatica.  Ovviamente quando la subroutine ritorna la sezione
+dello stack che conteneva la variabile automatica potrà essere riutilizzata da
+una nuova funzione, con le conseguenze immaginabili di sovrapposizione.
+
+Per questo una delle regole fondamentali della programmazione in C è che
+all'uscita di una funzione non deve restare nessun riferimento a variabili
+locali di quella funzione; qualora necessiti di utilizzare variabili che
+possano essere viste anche dalla funzione chiamante queste devono essere
+allocate esplicitamente, o in maniera statica (usando variabili di tipo
+\type{static} o \type{extern}), o dinamicamente con una delle funzioni della
+famiglia \func{malloc}.
 
 \subsection{Il controllo di flusso non locale}
 \label{sec:proc_longjmp}