X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=5e30c7aa2b0a72c6dd88c07025e65f4b9c3811b7;hp=5e5fa6e55f8ff76ec56905945a01656994077e57;hb=dcf2c2df897955ff3503a7c426025457ab456fd7;hpb=ed54132fb0762894a86b100023f9d04fc4028975 diff --git a/process.tex b/process.tex index 5e5fa6e..5e30c7a 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", @@ -73,10 +73,10 @@ Il funzionamento di \cmd{ld-linux.so} è controllato da alcune variabili di ambiente e dal contenuto del file \conffile{/etc/ld.so.conf}, che consentono di elencare le directory un cui cercare le librerie e determinare quali verranno utilizzate. In particolare con la variabile di ambiente -\texttt{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a +\envvar{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a quelle di sistema in cui inserire versioni personali delle librerie che hanno la precedenza su quelle di sistema, mentre con la variabile di ambiente -\texttt{LD\_PRELOAD} si può passare direttamente una lista di file di librerie +\envvar{LD\_PRELOAD} si può passare direttamente una lista di file di librerie condivise da usare al posto di quelli di sistema. In questo modo è possibile effettuare lo sviluppo o il test di nuove librerie senza dover sostituire quelle di sistema. Ulteriori dettagli sono riportati nella pagina di manuale @@ -84,11 +84,11 @@ di \cmd{ld.so} e per un approfondimento dell'argomento si può consultare sez.~3.1.2 di \cite{AGL}. Una volta completate le operazioni di inizializzazione di \cmd{ld-linux.so}, il -sistema fa partire qualunque programma chiamando la funzione \func{main}. Sta +sistema fa partire qualunque programma chiamando la funzione \code{main}. Sta al programmatore chiamare così la funzione principale del programma da cui si suppone che inizi l'esecuzione. In ogni caso senza questa funzione lo stesso \textit{link-loader} darebbe luogo ad errori. Lo standard ISO C specifica che -la funzione \func{main} può non avere argomenti o prendere due argomenti che +la funzione \code{main} può non avere argomenti o prendere due argomenti che rappresentano gli argomenti passati da linea di comando (su cui torneremo in sez.~\ref{sec:proc_par_format}), in sostanza un prototipo che va sempre bene è il seguente: @@ -97,7 +97,7 @@ il seguente: \itindend{link-loader} In realtà nei sistemi Unix esiste un altro modo per definire la funzione -\func{main}, che prevede la presenza di un terzo argomento, \code{char +\code{main}, che prevede la presenza di un terzo argomento, \code{char *envp[]}, che fornisce l'\textsl{ambiente} del programma; questa forma però non è prevista dallo standard POSIX.1 per cui se si vogliono scrivere programmi portabili è meglio evitarla. Per accedere all'ambiente, come vedremo @@ -105,9 +105,9 @@ in sez.~\ref{sec:proc_environ} si usa in genere una variabile globale che viene sempre definita automaticamente. Ogni programma viene fatto partire mettendo in esecuzione il codice contenuto -nella funzione \func{main}, ogni altra funzione usata dal programma, che sia +nella funzione \code{main}, ogni altra funzione usata dal programma, che sia ottenuta da una libreria condivisa, o che sia direttamente definita nel -codice, dovrà essere invocata a partire dal codice di \func{main}. Nel caso di +codice, dovrà essere invocata a partire dal codice di \code{main}. Nel caso di funzioni definite nel programma occorre tenere conto che, nel momento stesso in cui si usano le librerie di sistema (vale a dire la \acr{glibc}) alcuni nomi sono riservati e non possono essere utilizzati. @@ -142,7 +142,7 @@ evitarli, in particolare questi sono: il controllo e la conversione del tipo di caratteri, \item i nomi che iniziano con ``\texttt{LC\_}'' e costituiti da lettere maiuscole che possono essere usato per macro attinenti la - localizzazione (vedi sez.~\ref{sec:proc_localization}), + localizzazione,% mettere in seguito (vedi sez.~\ref{sec:proc_localization}), \item nomi che iniziano con ``\texttt{SIG}'' o ``\texttt{SIG\_}'' e costituiti da lettere maiuscole che potrebbero essere usati per nuovi nomi di segnale (vedi sez.~\ref{sec:sig_classification}), @@ -213,25 +213,27 @@ definizioni. & ANSI C& POSIX& \\ \hline \hline - \file{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un - programma.\\ - \file{ctype.h} &$\bullet$& -- & Tipi standard.\\ - \file{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ - \file{errno.h} & -- &$\bullet$& Errori di sistema.\\ - \file{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ - \file{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ - \file{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ - \file{setjmp.h}&$\bullet$& -- & Salti non locali.\\ - \file{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ - \file{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti - variabili.\\ - \file{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI C.\\ - \file{stdlib.h}&$\bullet$& -- & Definizioni della libreria standard.\\ - \file{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ - \file{time.h} & -- &$\bullet$& Gestione dei tempi.\\ - \file{times.h} &$\bullet$& -- & Gestione dei tempi.\\ - \file{unistd.h}& -- &$\bullet$& Unix standard library.\\ - \file{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ + \headfile{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un + programma.\\ + \headfile{ctype.h} &$\bullet$& -- & Tipi standard.\\ + \headfile{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ + \headfile{errno.h} & -- &$\bullet$& Errori di sistema.\\ + \headfile{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ + \headfile{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ + \headfile{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ + \headfile{setjmp.h}&$\bullet$& -- & Salti non locali.\\ + \headfile{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ + \headfile{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti + variabili.\\ + \headfile{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI + C.\\ + \headfile{stdlib.h}&$\bullet$& -- & Definizioni della libreria + standard.\\ + \headfile{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ + \headfile{time.h} & -- &$\bullet$& Gestione dei tempi.\\ + \headfile{times.h} &$\bullet$& -- & Gestione dei tempi.\\ + \headfile{unistd.h}& -- &$\bullet$& Unix standard library.\\ + \headfile{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ \hline \end{tabular} \caption{Elenco dei principali \textit{header file} definiti dagli standard @@ -243,10 +245,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 \itindsub{pathname}{relativo} \textit{pathname} relativo: \includecodesnip{listati/main_include.c} Si tenga presente che oltre ai nomi riservati a livello generale di cui si è @@ -254,24 +257,24 @@ parlato in sez.~\ref{sec:proc_main}, alcuni di questi \textit{header file} riservano degli ulteriori identificativi, il cui uso sarà da evitare, ad esempio si avrà che: \begin{itemize*} -\item in \file{dirent.h} vengono riservati i nomi che iniziano con +\item in \headfile{dirent.h} vengono riservati i nomi che iniziano con ``\texttt{d\_}'' e costituiti da lettere minuscole, -\item in \file{fcntl.h} vengono riservati i nomi che iniziano con +\item in \headfile{fcntl.h} vengono riservati i nomi che iniziano con ``\texttt{l\_}'', ``\texttt{F\_}'',``\texttt{O\_}'' e ``\texttt{S\_}'', -\item in \file{limits.h} vengono riservati i nomi che finiscono in +\item in \headfile{limits.h} vengono riservati i nomi che finiscono in ``\texttt{\_MAX}'', -\item in \file{signal.h} vengono riservati i nomi che iniziano con +\item in \headfile{signal.h} vengono riservati i nomi che iniziano con ``\texttt{sa\_}'' e ``\texttt{SA\_}'', -\item in \file{sys/stat.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/stat.h} vengono riservati i nomi che iniziano con ``\texttt{st\_}'' e ``\texttt{S\_}'', -\item in \file{sys/times.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/times.h} vengono riservati i nomi che iniziano con ``\texttt{tms\_}'', -\item in \file{termios.h} vengono riservati i nomi che iniziano con +\item in \headfile{termios.h} vengono riservati i nomi che iniziano con ``\texttt{c\_}'', ``\texttt{V}'', ``\texttt{I}'', ``\texttt{O}'' e ``\texttt{TC}'' e con ``\texttt{B}'' seguito da un numero, -\item in \file{grp.h} vengono riservati i nomi che iniziano con +\item in \headfile{grp.h} vengono riservati i nomi che iniziano con ``\texttt{gr\_}'', -\item in \file{pwd.h}vengono riservati i nomi che iniziano con +\item in \headfile{pwd.h}vengono riservati i nomi che iniziano con ``\texttt{pw\_}'', \end{itemize*} @@ -348,7 +351,7 @@ dall'architettura,\footnote{in genere le vecchie \textit{system call} non ciascuna \textit{system call} viene in genere identificata da una costante nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso corrisponde anche alla omonima funzione di libreria. Queste costanti sono -definite nel file \texttt{sys/syscall.h}, ma si possono anche usare +definite nel file \headfile{sys/syscall.h}, ma si possono anche usare direttamente valori numerici. @@ -356,11 +359,11 @@ direttamente valori numerici. \label{sec:proc_conclusion} Normalmente un programma conclude la sua esecuzione quando si fa ritornare la -funzione \func{main}, si usa cioè l'istruzione \instruction{return} del +funzione \code{main}, si usa cioè l'istruzione \instruction{return} del linguaggio C all'interno della stessa, o se si richiede esplicitamente la chiusura invocando direttamente la funzione \func{exit}. Queste due modalità sono assolutamente equivalenti, dato che \func{exit} viene chiamata in maniera -trasparente anche quando \func{main} ritorna, passandogli come argomento il +trasparente anche quando \code{main} ritorna, passandogli come argomento il valore di ritorno (che essendo . La funzione \funcd{exit}, che è completamente generale, essendo definita dallo @@ -378,7 +381,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 @@ -386,18 +389,18 @@ vedremo a breve) che completa la terminazione del processo. \itindbeg{exit~status} -Il valore dell'argomento \param{status} o il valore di ritorno di \func{main}, +Il valore dell'argomento \param{status} o il valore di ritorno di \code{main}, costituisce quello che viene chiamato lo \textsl{stato di uscita} (l'\textit{exit status}) del processo. In generale si usa questo valore per fornire al processo padre (come vedremo in sez.~\ref{sec:proc_wait}) delle informazioni generiche sulla riuscita o il fallimento del programma appena terminato. -Anche se l'argomento \param{status} (ed il valore di ritorno di \func{main}) +Anche se l'argomento \param{status} (ed il valore di ritorno di \code{main}) sono numeri interi di tipo \ctyp{int}, si deve tener presente che il valore dello stato di uscita viene comunque troncato ad 8 bit, per cui deve essere sempre compreso fra 0 e 255. Si tenga presente che se si -raggiunge la fine della funzione \func{main} senza ritornare esplicitamente si +raggiunge la fine della funzione \code{main} senza ritornare esplicitamente si ha un valore di uscita indefinito, è pertanto consigliabile di concludere sempre in maniera esplicita detta funzione. @@ -421,7 +424,7 @@ un intero di valore generico può comportare il rischio, qualora si vada ad usare un multiplo di 256, di avere uno stato di uscita uguale a zero, che verrebbe interpretato come un successo. -Per questo motivo in \file{stdlib.h} sono definite, seguendo lo standard +Per questo motivo in \headfile{stdlib.h} sono definite, seguendo lo standard POSIX, le due costanti \const{EXIT\_SUCCESS} e \const{EXIT\_FAILURE}, da usare sempre per specificare lo stato di uscita di un processo. Su Linux, ed in generale in qualunque sistema POSIX, ad esse sono assegnati rispettivamente i @@ -431,7 +434,8 @@ valori 0 e 1. Una forma alternativa per effettuare una terminazione esplicita di un programma è quella di chiamare direttamente la \textit{system call} -\func{\_exit}, che restituisce il controllo direttamente al kernel, +\funcd{\_exit},\footnote{la stessa è definita anche come \funcd{\_Exit} in + \headfile{stdlib.h}.} che restituisce il controllo direttamente al kernel, concludendo immediatamente il processo, il suo prototipo è: \begin{funcproto}{ \fhead{unistd.h} \fdecl{void \_exit(int status)} @@ -442,8 +446,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}), @@ -479,7 +483,7 @@ programma,\footnote{nel caso di \func{atexit} lo standard POSIX.1-2001 richiede che siano registrabili almeno \const{ATEXIT\_MAX} funzioni (il valore può essere ottenuto con \func{sysconf}, vedi sez.~\ref{sec:sys_sysconf}).} sia per la chiamata ad \func{exit} che per il -ritorno di \func{main}. La prima funzione che si può utilizzare a tal fine è +ritorno di \code{main}. La prima funzione che si può utilizzare a tal fine è \funcd{atexit}, il cui prototipo è: \begin{funcproto}{ \fhead{stdlib.h} \fdecl{void (*function)(void)} @@ -524,11 +528,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 @@ -559,7 +563,7 @@ Allo stesso modo l'unico modo in cui un programma può concludere volontariamente la propria esecuzione è attraverso una chiamata alla \textit{system call} \func{\_exit}, sia che questa venga fatta esplicitamente, o in maniera indiretta attraverso l'uso di \func{exit} o il ritorno di -\func{main}. +\code{main}. Uno schema riassuntivo che illustra le modalità con cui si avvia e conclude normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. @@ -569,7 +573,7 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. % \includegraphics[width=9cm]{img/proc_beginend} \begin{tikzpicture}[>=stealth] \filldraw[fill=black!35] (-0.3,0) rectangle (12,1); - \draw(5.5,0.5) node {\large{kernel}}; + \draw(5.5,0.5) node {\large{\textsf{kernel}}}; \filldraw[fill=black!15] (1.5,2) rectangle (4,3); \draw (2.75,2.5) node {\texttt{ld-linux.so}}; @@ -596,9 +600,9 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. \draw[->] (4,4.5) -- node[anchor=south]{\texttt{exit}} (exit); \draw[->] (exit) -- node[anchor=east]{\texttt{\_exit}}(6.75,1); - \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{chiusura stream}; + \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{\textsf{chiusura stream}}; \draw[<->, dashed] (exithandler1) -- (exit); \draw[<->, dashed] (exithandler2) -- (exit); @@ -651,7 +655,7 @@ bit e di 8kb sulle alpha. Con le versioni più recenti del kernel è possibile anche utilizzare pagine di dimensioni maggiori (di 4Mb, dette \textit{huge page}), per sistemi con grandi quantitativi di memoria in cui l'uso di pagine troppo piccole comporta una perdita di prestazioni. In alcuni sistemi -la costante \const{PAGE\_SIZE}, definita in \file{limits.h}, indica la +la costante \const{PAGE\_SIZE}, definita in \headfile{limits.h}, indica la dimensione di una pagina in byte, con Linux questo non avviene e per ottenere questa dimensione si deve ricorrere alla funzione \func{getpagesize} (vedi sez.~\ref{sec:sys_memory_res}). @@ -927,8 +931,8 @@ semplicemente allocati \param{size} byte e l'area di memoria non viene inizializzata. Una volta che non sia più necessaria la memoria allocata dinamicamente deve -essere esplicitamente rilasciata usando la funzione \func{free},\footnote{le - glibc provvedono anche una funzione \func{cfree} definita per compatibilità +essere esplicitamente rilasciata usando la funzione \funcd{free},\footnote{le + glibc provvedono anche una funzione \funcm{cfree} definita per compatibilità con SunOS, che è deprecata.} il suo prototipo è: \begin{funcproto}{ @@ -999,7 +1003,7 @@ blocco di dati ridimensionato. La \acr{glibc} ha un'implementazione delle funzioni di allocazione che è controllabile dall'utente attraverso alcune variabili di ambiente (vedi sez.~\ref{sec:proc_environ}), in particolare diventa possibile tracciare -questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_} +questo tipo di errori usando la variabile di ambiente \envvar{MALLOC\_CHECK\_} che quando viene definita mette in uso una versione meno efficiente delle funzioni suddette, che però è più tollerante nei confronti di piccoli errori come quello dei \itindex{double~free} \textit{double~free} o i @@ -1074,11 +1078,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 +1265,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} @@ -1332,7 +1335,7 @@ automaticamente rimossi se si pone in esecuzione un altro programma con Il sistema pone dei limiti all'ammontare di memoria di un processo che può essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo -standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro +standard POSIX.1 richiede che sia definita in \headfile{unistd.h} la macro \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il \textit{memory locking}. @@ -1393,11 +1396,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 +1524,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} @@ -1536,9 +1539,9 @@ cosa che non è detto accada con altre implementazioni. Nessuna delle due funzioni ha una chiara standardizzazione e nessuna delle due compare in POSIX.1, inoltre ci sono indicazioni discordi sui file che ne contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in - \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e - \acr{libc5} la dichiarano in \texttt{malloc.h}, lo stesso vale per - \func{memalign} che in alcuni sistemi è dichiarata in \texttt{stdlib.h}.} + \headfile{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} + e \acr{libc5} la dichiarano in \headfile{malloc.h}, lo stesso vale per + \func{memalign} che in alcuni sistemi è dichiarata in \headfile{stdlib.h}.} per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo prototipo è: @@ -1553,9 +1556,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} @@ -1583,8 +1586,8 @@ allocazione,\footnote{entrambe queste operazioni causano in genere la Abbiamo visto in sez.~\ref{sec:proc_mem_lock} come una prima funzionalità di ausilio nella ricerca di questi errori sia l'uso della variabile di ambiente -\var{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei controlli -di consistenza sullo stato delle allocazioni di memoria eseguite con +\envvar{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei +controlli di consistenza sullo stato delle allocazioni di memoria eseguite con \func{malloc}, anche questa fornita come estensione specifica (e non standard) della \acr{glibc}, è quella di utilizzare la funzione \funcd{mcheck}, che deve essere chiamata prima di eseguire qualunque allocazione con \func{malloc}; il @@ -1690,7 +1693,7 @@ operazioni. Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando vengono lanciati e come accennato in sez.~\ref{sec:proc_main} questo viene effettuato attraverso gli argomenti \param{argc} e \param{argv} ricevuti nella -funzione \func{main} all'avvio del programma. Questi argomenti vengono passati +funzione \code{main} all'avvio del programma. Questi argomenti vengono passati al programma dalla shell o dal processo che esegue la \func{exec} (secondo le modalità che vedremo in sez.~\ref{sec:proc_exec}) quando questo viene messo in esecuzione. @@ -1777,7 +1780,7 @@ in \param{argv} la libreria standard del C fornisce la funzione \fhead{unistd.h} \fdecl{int getopt(int argc, char * const argv[], const char *optstring)} \fdesc{Esegue la scansione delle opzioni negli argomenti della funzione - \func{main}.} + \code{main}.} } {Ritorna il carattere che segue l'opzione, ``\texttt{:}'' se manca un parametro all'opzione, ``\texttt{?}'' se l'opzione è sconosciuta, e $-1$ se @@ -1785,7 +1788,7 @@ in \param{argv} la libreria standard del C fornisce la funzione \end{funcproto} Questa funzione prende come argomenti le due variabili \param{argc} e -\param{argv} che devono essere quelle passate come argomenti di \func{main} +\param{argv} che devono essere quelle passate come argomenti di \code{main} all'esecuzione del programma, ed una stringa \param{optstring} che indica quali sono le opzioni valide. La funzione effettua la scansione della lista degli argomenti ricercando ogni stringa che comincia con il carattere @@ -1831,7 +1834,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. @@ -1945,17 +1948,18 @@ configurazione. É di norma cura della shell, quando esegue un comando, passare queste variabili al programma messo in esecuzione attraverso un uso opportuno delle relative chiamate (si veda sez.~\ref{sec:proc_exec}). -La shell ad esempio ne usa molte per il suo funzionamento, come \texttt{PATH} +La shell ad esempio ne usa molte per il suo funzionamento, come \envvar{PATH} per indicare la lista delle directory in cui effettuare la ricerca dei comandi -o \texttt{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come -\texttt{HOME}, \texttt{USER}, ecc. sono invece definite al login (per i +o \envvar{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come +\envvar{HOME}, \envvar{USER}, ecc. sono invece definite al login (per i dettagli si veda sez.~\ref{sec:sess_login}), ed in genere è cura della propria distribuzione definire le opportune variabili di ambiente in uno script di avvio. Alcune servono poi come riferimento generico per molti programmi, come -\texttt{EDITOR} che indica l'editor preferito da invocare in caso di -necessità. Una in particolare, \texttt{LANG}, serve a controllare la -localizzazione del programma (su cui torneremo in -sez.~\ref{sec:proc_localization}) per adattarlo alla lingua ed alle convezioni +\envvar{EDITOR} che indica l'editor preferito da invocare in caso di +necessità. Una in particolare, \envvar{LANG}, serve a controllare la +localizzazione del programma +%(su cui torneremo in sez.~\ref{sec:proc_localization}) +per adattarlo alla lingua ed alle convezioni dei vari paesi. Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più @@ -2116,10 +2120,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} @@ -2180,20 +2184,20 @@ versione ``\textsl{sicura}'' da zero. \index{variabili!di~ambiente|)} -\subsection{La localizzazione} -\label{sec:proc_localization} +% \subsection{La localizzazione} +% \label{sec:proc_localization} -Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente -\texttt{LANG} sia usata per indicare ai processi il valore della cosiddetta -\textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie -di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} -che consente di gestire in maniera automatica sia la lingua in cui vengono -stampati i vari messaggi (come i messaggi associati agli errori che vedremo in -sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una -serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti -alfabetici, le espressioni della valute, ecc. +% Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente +% \envvar{LANG} sia usata per indicare ai processi il valore della cosiddetta +% \textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie +% di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} +% che consente di gestire in maniera automatica sia la lingua in cui vengono +% stampati i vari messaggi (come i messaggi associati agli errori che vedremo in +% sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una +% serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti +% alfabetici, le espressioni della valute, ecc. -Da finire. +% Da finire. % La localizzazione di un programma si può selezionare con la @@ -2302,12 +2306,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 +2329,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} \headfile{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 @@ -2359,7 +2365,7 @@ pertanto quella sequenziale, in cui vengono estratti dallo \itindex{stack} \textit{stack} secondo l'ordine in cui sono stati scritti nel prototipo della funzione. -Per fare questo in \file{stdarg.h} sono definite delle macro specifiche, +Per fare questo in \headfile{stdarg.h} sono definite delle macro specifiche, previste dallo standard ISO C89, che consentono di eseguire questa operazione. La prima di queste macro è \macro{va\_start}, che inizializza opportunamente una lista degli argomenti, la sua definizione è: @@ -2515,6 +2521,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} @@ -2755,7 +2762,7 @@ permetterebbe di eseguire questi cambiamenti. \includecodesample{listati/endian.c} \end{minipage} \normalsize - \caption{La funzione \func{endian}, usata per controllare il tipo di + \caption{La funzione \samplefunc{endian}, usata per controllare il tipo di architettura della macchina.} \label{fig:sock_endian_code} \end{figure}