%% 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",
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 è
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
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}),
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
}
{Entrambe le funzioni restituiscono il puntatore alla zona di memoria allocata
in caso di successo e \val{NULL} in caso di fallimento, nel qual caso
- \var{errno} assumerà il valore \errval{ENOMEM}.}
+ \var{errno} assumerà il valore \errcode{ENOMEM}.}
\end{funcproto}
In genere si usano \func{malloc} e \func{calloc} per allocare dinamicamente
\fdesc{Cambia la dimensione di un'area di memoria precedentemente allocata.}
} {La funzione ritorna il puntatore alla zona di memoria allocata in caso
di successo e \val{NULL} per un errore, nel qual caso \var{errno}
- assumerà il valore \errval{ENOMEM}.}
+ assumerà il valore \errcode{ENOMEM}.}
\end{funcproto}
La funzione vuole come primo argomento il puntatore restituito da una
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
\fdesc{Sposta la fine del segmento dati del processo.}
}
{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
- nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}.}
+ nel qual caso \var{errno} assumerà il valore \errcode{ENOMEM}.}
\end{funcproto}
La funzione è un'interfaccia all'omonima \textit{system call} ed imposta
}
{La funzione ritorna il puntatore all'inizio della nuova zona di memoria
allocata in caso di successo e \val{NULL} per un errore, nel qual
- caso \var{errno} assumerà il valore \errval{ENOMEM}.}
+ caso \var{errno} assumerà il valore \errcode{ENOMEM}.}
\end{funcproto}
La funzione incrementa la dimensione dello \itindex{heap} \textit{heap} di un
{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}
{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).
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}
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}
\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.
{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}
\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
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
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}