X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=a096d6a866c6d87f152ad5888b92fb17e9e8f294;hp=5114b01e40125dba4ab8ed3f3cd436f5471d4893;hb=3e5c39bbc24981125adb422a672fcd3d54493bb6;hpb=16e64b5dbce90526045cf9c0c95690c08d64a2dc diff --git a/process.tex b/process.tex index 5114b01..a096d6a 100644 --- a/process.tex +++ b/process.tex @@ -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}