Revisioni varie, introdotto nuovo capitolo sulle funzioni di gestione
[gapil.git] / process.tex
index 5114b01e40125dba4ab8ed3f3cd436f5471d4893..a096d6a866c6d87f152ad5888b92fb17e9e8f294 100644 (file)
@@ -976,18 +976,36 @@ 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.  Talvolta però è necessario che la funzione
-possa restituire indietro alla funzione chiamate un valore relativo ad uno dei
-suoi parametri. Per far questo si usa il cosiddetto \textit{}. Pertanto occorre
-tenere conto che quando si vuole restituire un risultato alla funzione
-chiamante occorre usare un puntatore.
+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}