X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=a90c4ed44afeb67b00ef9a8b5f6403f60bc30e30;hp=67cb4f5ccf1da431546545983e53a4624880529f;hb=5a59e67204ff436dceb6a13ed39e876aea3945a8;hpb=3f0b7dc79bb38d391505385754c9e3c222b6c86d diff --git a/process.tex b/process.tex index 67cb4f5..a90c4ed 100644 --- a/process.tex +++ b/process.tex @@ -1,3 +1,13 @@ +%% process.tex +%% +%% Copyright (C) 2000-2002 Simone Piccardi. Permission is granted to +%% copy, distribute and/or modify this document under the terms of the GNU Free +%% Documentation License, Version 1.1 or any later version published by the +%% Free Software Foundation; with the Invariant Sections being "Prefazione", +%% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the +%% license is included in the section entitled "GNU Free Documentation +%% License". +%% \chapter{L'interfaccia base con i processi} \label{cha:process_interface} @@ -365,7 +375,7 @@ seguenti segmenti: \end{lstlisting} questo vettore sarà immagazzinato in questo segmento. Anch'esso viene allocato all'avvio, e tutte le variabili vengono inizializzate a zero (ed i - puntatori a \macro{NULL}).\footnote{si ricordi che questo vale solo per le + puntatori a \val{NULL}).\footnote{si ricordi che questo vale solo per le variabili che vanno nel segmento dati, e non è affatto vero in generale.} Storicamente questo segmento viene chiamato BBS (da \textit{block started by @@ -456,20 +466,20 @@ prototipi sono i seguenti: Alloca \var{size} byte nello heap. La memoria viene inizializzata a 0. La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \macro{NULL} in caso di fallimento, nel qual caso + di successo e \val{NULL} in caso di fallimento, nel qual caso \var{errno} assumerà il valore \macro{ENOMEM}. \funcdecl{void *malloc(size\_t size)} Alloca \var{size} byte nello heap. La memoria non viene inizializzata. La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \macro{NULL} in caso di fallimento, nel qual caso + di successo e \val{NULL} in caso di fallimento, nel qual caso \var{errno} assumerà il valore \macro{ENOMEM}. \funcdecl{void *realloc(void *ptr, size\_t size)} Cambia la dimensione del blocco allocato all'indirizzo \var{ptr} portandola a \var{size}. La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \macro{NULL} in caso di fallimento, nel qual caso + di successo e \val{NULL} in caso di fallimento, nel qual caso \var{errno} assumerà il valore \macro{ENOMEM}. \funcdecl{void free(void *ptr)} Disalloca lo spazio di memoria puntato da \var{ptr}. @@ -482,10 +492,15 @@ allineato correttamente per tutti i tipi di dati; ad esempio sulle macchine a multipli di 8 byte. In genere si usano le funzioni \func{malloc} e \func{calloc} per allocare -dinamicamente la memoria necessaria al programma, e siccome i puntatori -ritornati sono di tipo generico non è necessario effettuare un cast per -assegnarli a puntatori al tipo di variabile per la quale si effettua -l'allocazione. +dinamicamente la quantità di memoria necessaria al programma indicata da +\param{size},\footnote{queste funzioni presentano un comportamento diverso fra + le \acr{glibc} e le \acr{uClib} quando il valore di \param{size} è nullo. + Nel primo caso viene comunque restituito un puntatore valido, anche se non è + chiaro a cosa esso possa fare riferimento, nel secondo caso viene restituito + \val{NULL}. Il comportamento è analogo con \code{realloc(NULL, 0)}.} e +siccome i puntatori ritornati sono di tipo generico non è necessario +effettuare un cast per assegnarli a puntatori al tipo di variabile per la +quale si effettua l'allocazione. La memoria allocata dinamicamente deve essere esplicitamente rilasciata usando \func{free}\footnote{le glibc provvedono anche una funzione \func{cfree} @@ -498,7 +513,7 @@ in caso contrario il comportamento della funzione La funzione \func{realloc} si usa invece per cambiare (in genere aumentare) la dimensione di un'area di memoria precedentemente allocata, la funzione vuole in ingresso il puntatore restituito dalla precedente chiamata ad una -\func{malloc} (se è passato un valore \macro{NULL} allora la funzione si +\func{malloc} (se è passato un valore \val{NULL} allora la funzione si comporta come \func{malloc})\footnote{questo è vero per Linux e l'implementazione secondo lo standard ANSI C, ma non è vero per alcune vecchie implementazioni, inoltre alcune versioni delle librerie del C @@ -521,7 +536,7 @@ blocco di dati ridimensionato. Un errore abbastanza frequente (specie se si ha a che fare con array di puntatori) è quello di chiamare \func{free} più di una volta sullo stesso puntatore; per evitare questo problema una soluzione di ripiego è quella di -assegnare sempre a \macro{NULL} ogni puntatore liberato con \func{free}, dato +assegnare sempre a \val{NULL} ogni puntatore liberato con \func{free}, dato che, quando il parametro è un puntatore nullo, \func{free} non esegue nessuna operazione. @@ -611,7 +626,7 @@ stack della funzione corrente. La sintassi La memoria non viene inizializzata. La funzione restituisce il puntatore alla zona di memoria allocata in caso - di successo e \macro{NULL} in caso di fallimento, nel qual caso + di successo e \val{NULL} in caso di fallimento, nel qual caso \var{errno} assumerà il valore \macro{ENOMEM}. \end{prototype} \noindent ma in questo caso non è più necessario liberare la memoria (e quindi @@ -671,7 +686,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono: della fine del segmento dati. La funzione restituisce il puntatore all'inizio della nuova zona di memoria - allocata in caso di successo e \macro{NULL} in caso di fallimento, nel qual + allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual caso \macro{errno} assumerà il valore \macro{ENOMEM}. \end{functions} \noindent in genere si usa \func{sbrk} con un valore zero per ottenere @@ -680,7 +695,7 @@ l'attuale posizione della fine del segmento dati. Queste funzioni sono state deliberatamente escluse dallo standard POSIX.1 e per i programmi normali è sempre opportuno usare le funzioni di allocazione standard descritte in precedenza, che sono costruite su di esse. L'uso di -queste funzione è ristretto alle specifiche necessità di chi debba +queste funzioni è ristretto alle specifiche necessità di chi debba implementare una sua versione delle routine di allocazione. @@ -1026,7 +1041,7 @@ nella chiamata alla funzione \func{exec} quando questo viene lanciato. Come per la lista dei parametri anche questa lista è un array di puntatori a caratteri, ciascuno dei quali punta ad una stringa, terminata da un -\macro{NULL}. A differenza di \var{argv[]} in questo caso non si ha una +\val{NULL}. A differenza di \var{argv[]} in questo caso non si ha una lunghezza dell'array data da un equivalente di \var{argc}, ma la lista è terminata da un puntatore nullo. @@ -1109,7 +1124,7 @@ il cui prototipo Esamina l'ambiente del processo cercando una stringa che corrisponda a quella specificata da \param{name}. - \bodydesc{La funzione ritorna \macro{NULL} se non trova nulla, o il + \bodydesc{La funzione ritorna \val{NULL} se non trova nulla, o il puntatore alla stringa che corrisponde (di solito nella forma \cmd{NOME=valore}).} \end{prototype} @@ -1415,7 +1430,7 @@ per \func{printf}). Una modalità diversa, che può essere applicata solo quando il tipo dei parametri lo rende possibile, è quella che prevede di usare un valore speciale come ultimo argomento (come fa ad esempio \func{execl} che usa un puntatore -\macro{NULL} per indicare la fine della lista degli argomenti). +\val{NULL} per indicare la fine della lista degli argomenti). \subsection{Potenziali problemi con le variabili automatiche}