X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=db45209e4b70f4cf7ab749001fdf846a178958d3;hp=5e5fa6e55f8ff76ec56905945a01656994077e57;hb=4aa6c51696d2b11c572eccd37238db1691785573;hpb=ed54132fb0762894a86b100023f9d04fc4028975 diff --git a/process.tex b/process.tex index 5e5fa6e..db45209 100644 --- a/process.tex +++ b/process.tex @@ -1,6 +1,6 @@ %% process.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 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 "Un preambolo", @@ -243,10 +243,11 @@ Un esempio di inclusione di questi file, preso da uno dei programmi di esempio, è il seguente, e si noti come gli \textit{header file} possano essere referenziati con il nome fra parentesi angolari, nel qual caso si indica l'uso di quelli installati con il sistema,\footnote{in un sistema GNU/Linux che - segue le specifiche del \textit{Filesystem Hierarchy Standard} (per maggiori - informazioni si consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto - \texttt{/usr/include}.} o fra virgolette, nel qual caso si fa riferimento ad -una versione locale, da indicare con un pathname relativo: + segue le specifiche del \itindex{Filesystem~Hierarchy~Standard~(FHS)} + \textit{Filesystem Hierarchy Standard} (per maggiori informazioni si + consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto \texttt{/usr/include}.} +o fra virgolette, nel qual caso si fa riferimento ad una versione locale, da +indicare con un pathname relativo: \includecodesnip{listati/main_include.c} Si tenga presente che oltre ai nomi riservati a livello generale di cui si è @@ -378,7 +379,7 @@ standard ANSI C, è quella che deve essere invocata per una terminazione La funzione è pensata per eseguire una conclusione pulita di un programma che usi la libreria standard del C; essa esegue tutte le funzioni che sono state registrate con \func{atexit} e \func{on\_exit} (vedi -sez.~\ref{sec:proc_atexit}), chiude tutti i \textit{file stream} (vedi +sez.~\ref{sec:proc_atexit}), chiude tutti gli \textit{stream} (vedi sez.~\ref{sec:file_stream}) effettuando il salvataggio dei dati sospesi (chiamando \func{fclose}, vedi sez.~\ref{sec:file_fopen}), infine passa il controllo al kernel chiamando la \textit{system call} \func{\_exit} (che @@ -442,8 +443,8 @@ concludendo immediatamente il processo, il suo prototipo è: La funzione termina immediatamente il processo e le eventuali funzioni registrate con \func{atexit} e \func{on\_exit} non vengono eseguite. La funzione chiude tutti i file descriptor appartenenti al processo, cosa che -però non comporta il salvataggio dei dati eventualmente presenti nei buffer di -\textit{file stream}, (torneremo sulle due interfacce dei file in +però non comporta il salvataggio dei dati eventualmente presenti nei buffer +degli \textit{stream}, (torneremo sulle due interfacce dei file in cap.~\ref{cha:files_std_interface} e cap.~\ref{cha:file_unix_interface})). Infine fa sì che ogni figlio del processo sia adottato da \cmd{init} (vedi sez.~\ref{sec:proc_termination}), @@ -524,11 +525,11 @@ di esecuzione sarà riferito alla registrazione in quanto tale, indipendentemente dalla funzione usata per farla. Una volta completata l'esecuzione di tutte le funzioni registrate verranno -chiusi tutti i \textit{file stream} aperti ed infine verrà chiamata -\func{\_exit} per la terminazione del programma. Questa è la sequenza -ordinaria, eseguita a meno che una delle funzioni registrate non esegua al suo -interno \func{\_exit}, nel qual caso la terminazione del programma sarà -immediata ed anche le successive funzioni registrate non saranno invocate. +chiusi tutti gli \textit{stream} aperti ed infine verrà chiamata \func{\_exit} +per la terminazione del programma. Questa è la sequenza ordinaria, eseguita a +meno che una delle funzioni registrate non esegua al suo interno +\func{\_exit}, nel qual caso la terminazione del programma sarà immediata ed +anche le successive funzioni registrate non saranno invocate. Se invece all'interno di una delle funzioni registrate si chiama un'altra volta \func{exit} lo standard POSIX.1-2001 prescrive un comportamento @@ -1074,11 +1075,10 @@ funzioni di libreria una propria versione (che può essere più o meno specializzata per il debugging). Esistono varie librerie che forniscono dei sostituti opportuni delle funzioni di allocazione in grado, senza neanche ricompilare il programma,\footnote{esempi sono \textit{Dmalloc} - \href{http://dmalloc.com/}{\textsf{http://dmalloc.com/}} di Gray Watson ed - \textit{Electric Fence} di Bruce Perens.} di eseguire diagnostiche anche -molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle -funzionalità di ausilio presenti nella \acr{glibc} in -sez.~\ref{sec:proc_memory_adv_management}. + \url{http://dmalloc.com/} di Gray Watson ed \textit{Electric Fence} di Bruce + Perens.} di eseguire diagnostiche anche molto complesse riguardo +l'allocazione della memoria. Vedremo alcune delle funzionalità di ausilio +presenti nella \acr{glibc} in sez.~\ref{sec:proc_memory_adv_management}. Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in @@ -1262,14 +1262,14 @@ il suo prototipo è: {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOMEM}] o \param{addr} + \param{length} eccede la dimensione - della memoria usata dal processo o l'intervallo di indirizzi specificato - non è mappato. - \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di - una pagina. - \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido. \item[\errcode{EAGAIN}] il kernel è temporaneamente non in grado di fornire una risposta. + \item[\errcode{EFAULT}] \param{vec} punta ad un indirizzo non valido. + \item[\errcode{EINVAL}] \param{addr} non è un multiplo delle dimensioni di + una pagina. + \item[\errcode{ENOMEM}] o \param{addr}$+$\param{length} eccede la dimensione + della memoria usata dal processo o l'intervallo di indirizzi specificato + non è mappato. \end{errlist}} \end{funcproto} @@ -1393,11 +1393,11 @@ singole sezioni di memoria sono rispettivamente \funcd{mlock} e {Entrambe le funzioni ritornano $0$ in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} + \item[\errcode{EINVAL}] \param{len} non è un valore positivo. \item[\errcode{ENOMEM}] alcuni indirizzi dell’intervallo specificato non corrispondono allo spazio di indirizzi del processo o si è superato il limite di \const{RLIMIT\_MEMLOCK} per un processo non privilegiato (solo per kernel a partire dal 2.6.9). - \item[\errcode{EINVAL}] \param{len} non è un valore positivo. \item[\errcode{EPERM}] il processo non è privilegiato (per kernel precedenti il 2.6.9) o si ha un limite nullo per \const{RLIMIT\_MEMLOCK} e il processo non è privilegiato (per kernel a partire dal 2.6.9). @@ -1521,8 +1521,8 @@ rispettivi prototipi sono: caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione. \item[\errcode{EINVAL}] \param{boundary} non è una potenza di due. + \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione. \end{errlist}} \end{funcproto} @@ -1553,9 +1553,9 @@ prototipo è: caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione. \item[\errcode{EINVAL}] \param{alignment} non è potenza di due e multiplo di \code{sizeof(void *)}. + \item[\errcode{ENOMEM}] non c'è memoria sufficiente per l'allocazione. \end{errlist}} \end{funcproto} @@ -1831,7 +1831,7 @@ inoltre inizializza alcune \index{variabili!globali} variabili globali: \end{itemize*} In fig.~\ref{fig:proc_options_code} si è mostrata la sezione del programma -\file{ForkTest.c}, che useremo nel prossimo capitolo per effettuare dei test +\file{fork\_test.c}, che useremo nel prossimo capitolo per effettuare dei test sulla creazione dei processi, deputata alla decodifica delle opzioni a riga di comando da esso supportate. @@ -2116,10 +2116,10 @@ suo prototipo è: {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{ENOMEM}] non c'è memoria sufficiente per aggiungere una nuova - variabile all'ambiente. \item[\errcode{EINVAL}] \param{name} è \val{NULL} o una stringa di lunghezza nulla o che contiene il carattere ``\texttt{=}''. + \item[\errcode{ENOMEM}] non c'è memoria sufficiente per aggiungere una nuova + variabile all'ambiente. \end{errlist}} \end{funcproto} @@ -2302,12 +2302,14 @@ usando variabili globali o dichiarate come \direct{extern},\footnote{la \subsection{Il passaggio di un numero variabile di argomenti} \label{sec:proc_variadic} +\index{funzioni!variadic|(} + Come vedremo nei capitoli successivi, non sempre è possibile specificare un numero fisso di argomenti per una funzione. Lo standard ISO C prevede nella -sua sintassi la possibilità di definire delle \index{variadic} -\textit{variadic function} che abbiano un numero variabile di argomenti, -attraverso l'uso nella dichiarazione della funzione dello speciale costrutto -``\texttt{...}'', che viene chiamato \textit{ellipsis}. +sua sintassi la possibilità di definire delle \textit{variadic function} che +abbiano un numero variabile di argomenti, attraverso l'uso nella dichiarazione +della funzione dello speciale costrutto ``\texttt{...}'', che viene chiamato +\textit{ellipsis}. Lo standard però non provvede a livello di linguaggio alcun meccanismo con cui dette funzioni possono accedere ai loro argomenti. L'accesso viene pertanto @@ -2323,11 +2325,11 @@ adeguati. L'uso di una \textit{variadic function} prevede quindi tre punti: a seguire quelli addizionali. \end{itemize*} -Lo standard ISO C prevede che una \index{variadic} \textit{variadic function} -abbia sempre almeno un argomento fisso. Prima di effettuare la dichiarazione -deve essere incluso l'apposito \textit{header file} \file{stdarg.h}; un -esempio di dichiarazione è il prototipo della funzione \func{execl} che -vedremo in sez.~\ref{sec:proc_exec}: +Lo standard ISO C prevede che una \textit{variadic function} abbia sempre +almeno un argomento fisso. Prima di effettuare la dichiarazione deve essere +incluso l'apposito \textit{header file} \file{stdarg.h}; un esempio di +dichiarazione è il prototipo della funzione \func{execl} che vedremo in +sez.~\ref{sec:proc_exec}: \includecodesnip{listati/exec_sample.c} in questo caso la funzione prende due argomenti fissi ed un numero variabile di altri argomenti, che andranno a costituire gli elementi successivi al primo @@ -2515,6 +2517,7 @@ valore speciale per l'ultimo argomento, come fa ad esempio \func{execl} che usa un puntatore \val{NULL} per indicare la fine della lista degli argomenti (vedi sez.~\ref{sec:proc_exec}). +\index{funzioni!variadic|)} \subsection{Il controllo di flusso non locale} \label{sec:proc_longjmp}