From: Simone Piccardi Date: Mon, 14 Mar 2005 19:37:19 +0000 (+0000) Subject: Correzioni suggerite da Fabio Rossi, e altre cose trovate nel frattempo. X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=3b7696e141a7c9c5d9ddec1654aa2a1108350bde Correzioni suggerite da Fabio Rossi, e altre cose trovate nel frattempo. --- diff --git a/ChangeLog b/ChangeLog index 03132de..db8860b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-3-14 Simone Piccardi,,, + + * correzioni multiple da Fabio Rossi. + 2005-02-28 Simone Piccardi * ipc.tex: correzione typo segnalato da M. Maischberger. diff --git a/fileadv.tex b/fileadv.tex index dc527d3..9e2bf77 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -173,7 +173,7 @@ sez.~\ref{sec:TCP_urgent_data}). Dato che in genere non si tengono mai sotto controllo fino a \const{FD\_SETSIZE} file contemporaneamente la funzione richiede di -specificare qual'è il numero massimo dei file descriptor indicati nei tre +specificare qual è il numero massimo dei file descriptor indicati nei tre insiemi precedenti. Questo viene fatto per efficienza, per evitare di passare e far controllare al kernel una quantità di memoria superiore a quella necessaria. Questo limite viene indicato tramite l'argomento \param{n}, che @@ -495,7 +495,7 @@ percentuale) sono diventati attivi. Tuttavia con l'implementazione classica dei segnali questa modalità di I/O presenta notevoli problemi, dato che non è possibile determinare, quando i -file descriptor sono più di uno, qual'è quello responsabile dell'emissione del +file descriptor sono più di uno, qual è quello responsabile dell'emissione del segnale. Inoltre dato che i segnali normali non si accodano (si ricordi quanto illustrato in sez.~\ref{sec:sig_notification}), in presenza di più file descriptor attivi contemporaneamente, più segnali emessi nello stesso momento @@ -1102,7 +1102,7 @@ specificato come maschera binaria ottenuta dall'OR di uno o pi riportati in tab.~\ref{tab:file_mmap_flag}; il valore specificato deve essere compatibile con la modalità di accesso con cui si è aperto il file. -L'argomento \param{flags} specifica infine qual'è il tipo di oggetto mappato, +L'argomento \param{flags} specifica infine qual è il tipo di oggetto mappato, le opzioni relative alle modalità con cui è effettuata la mappatura e alle modalità con cui le modifiche alla memoria mappata vengono condivise o mantenute private al processo che le ha effettuate. Deve essere specificato diff --git a/fileunix.tex b/fileunix.tex index 6f192a8..bfac2a5 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -371,7 +371,7 @@ valore pi introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.} -Questa caratteristica permette di prevedere qual'è il valore del file +Questa caratteristica permette di prevedere qual è il valore del file descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da alcune applicazioni per sostituire i file corrispondenti ai file standard visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard @@ -1006,7 +1006,7 @@ disponibile. Dato che questa è l'operazione più comune, è prevista una diversa versione della funzione, \funcd{dup2}, che permette di specificare esplicitamente -qual'è il valore di file descriptor che si vuole avere come duplicato; il suo +qual è il valore di file descriptor che si vuole avere come duplicato; il suo prototipo è: \begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)} diff --git a/img/argv_argc.dia b/img/argv_argc.dia index a435b47..7889ffe 100644 Binary files a/img/argv_argc.dia and b/img/argv_argc.dia differ diff --git a/ipc.tex b/ipc.tex index 7f664ab..503792b 100644 --- a/ipc.tex +++ b/ipc.tex @@ -98,7 +98,7 @@ capo della pipe, l'altro pu Tutto ciò ci mostra come sia immediato realizzare un meccanismo di comunicazione fra processi attraverso una pipe, utilizzando le proprietà -ordinarie dei file, ma ci mostra anche qual'è il principale\footnote{Stevens +ordinarie dei file, ma ci mostra anche qual è il principale\footnote{Stevens in \cite{APUE} riporta come limite anche il fatto che la comunicazione è unidirezionale, ma in realtà questo è un limite facilmente superabile usando una coppia di pipe.} limite nell'uso delle pipe. È necessario infatti che i diff --git a/netlayer.tex b/netlayer.tex index baeb06a..db190ee 100644 --- a/netlayer.tex +++ b/netlayer.tex @@ -1096,7 +1096,7 @@ Le estensioni definite al momento sono le seguenti: \end{itemize} La presenza di opzioni è rilevata dal valore del campo \textit{next header} -che indica qual'è l'intestazione successiva a quella di IPv6; in assenza di +che indica qual è l'intestazione successiva a quella di IPv6; in assenza di opzioni questa sarà l'intestazione di un protocollo di trasporto del livello superiore, per cui il campo assumerà lo stesso valore del campo \textit{protocol} di IPv4, altrimenti assumerà il valore dell'opzione diff --git a/network.tex b/network.tex index 4cab8cf..86bdeab 100644 --- a/network.tex +++ b/network.tex @@ -739,7 +739,7 @@ piccoli che possono essere trasmessi attraverso l'interfaccia. \end{table} La MTU più piccola fra due stazioni viene in genere chiamata \textit{path - MTU}, che dice qual'è la lunghezza massima oltre la quale un pacchetto + MTU}, che dice qual è la lunghezza massima oltre la quale un pacchetto inviato da una stazione ad un'altra verrebbe senz'altro frammentato. Si tenga conto che non è affatto detto che la \textit{path MTU} sia la stessa in entrambe le direzioni, perché l'instradamento può essere diverso nei due diff --git a/process.tex b/process.tex index d59f968..f2c4f73 100644 --- a/process.tex +++ b/process.tex @@ -374,8 +374,8 @@ seguenti segmenti: 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 BSS (da \textit{block started by - symbol}). La sua dimensione è fissa. + Storicamente questa seconda parte del segmento dati viene chiamata BSS (da + \textit{Block Started by Symbol}). La sua dimensione è fissa. \item Lo \textit{heap}. Tecnicamente lo si può considerare l'estensione del segmento dati, a cui di solito è posto giusto di seguito. È qui che avviene @@ -401,7 +401,7 @@ seguenti segmenti: \begin{figure}[htb] \centering - \includegraphics[height=12cm]{img/memory_layout} + \includegraphics[height=11cm]{img/memory_layout} \caption{Disposizione tipica dei segmenti di memoria di un processo.} \label{fig:proc_mem_layout} \end{figure} @@ -603,14 +603,13 @@ funzioni di libreria una propria versione (che pu specializzata per il debugging). Esistono varie librerie che forniscono dei sostituti opportuni delle routine di allocazione in grado, senza neanche ricompilare il programma,\footnote{esempi sono \textit{Dmalloc} - \href{http://dmalloc.com/}{http://dmalloc.com/} di Gray Watson ed + \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. - -\subsection{La funzione \func{alloca}} -\label{sec:proc_mem_alloca} +\subsection{Le funzioni \func{alloca}, \func{brk} e \func{sbrk}} +\label{sec:proc_mem_sbrk_alloca} Una possibile alternativa all'uso di \func{malloc}, che non soffre dei problemi di \textit{memory leak}\index{\textit{memory~leak}} descritti in @@ -666,9 +665,6 @@ Questo cui torneremo in sez.~\ref{sec:proc_auto_var}. -\subsection{Le funzioni \func{brk} e \func{sbrk}} -\label{sec:proc_mem_sbrk} - Queste due funzioni vengono utilizzate soltanto quando è necessario effettuare direttamente la gestione della memoria associata allo spazio dati di un processo, ad esempio qualora si debba implementare la propria versione delle @@ -902,7 +898,7 @@ di ambiente \cmd{IFS}. \begin{figure}[htb] \centering - \includegraphics[width=11cm]{img/argv_argc} + \includegraphics[width=13cm]{img/argv_argc} \caption{Esempio dei valori di \param{argv} e \param{argc} generati nella scansione di una riga di comando.} \label{fig:proc_argv_argc} @@ -921,7 +917,7 @@ questo meccanismo In generale un programma Unix riceve da linea di comando sia gli argomenti che le opzioni, queste ultime sono standardizzate per essere riconosciute come tali: un elemento di \param{argv} che inizia con il carattere \texttt{'-'} e -che non sia un singolo \texttt{'-'} o un \texttt{'--'} viene considerato +che non sia un singolo \texttt{'-'} o un \texttt{'-{}-'} viene considerato un'opzione. In genere le opzioni sono costituite da una lettera singola (preceduta dal carattere \cmd{'-'}) e possono avere o no un parametro associato; un comando tipico può essere quello mostrato in @@ -960,7 +956,7 @@ che indica che non ci sono pi dichiarata in \param{optstring} viene ritornato il carattere \texttt{'?'} mentre se un opzione che lo richiede non è seguita da un parametro viene ritornato il carattere \texttt{':'}, infine se viene incontrato il valore -\texttt{'--'} la scansione viene considerata conclusa, anche se vi sono altri +\texttt{'-{}-'} la scansione viene considerata conclusa, anche se vi sono altri elementi di \param{argv} che cominciano con il carattere \texttt{'-'}. \begin{figure}[htb] @@ -1050,7 +1046,7 @@ pi fig.~\ref{fig:proc_envirno_list}. \begin{figure}[htb] \centering - \includegraphics[width=11cm]{img/environ_var} + \includegraphics[width=13cm]{img/environ_var} \caption{Esempio di lista delle variabili di ambiente.} \label{fig:proc_envirno_list} \end{figure} @@ -1308,21 +1304,23 @@ Come vedremo nei capitoli successivi, non sempre numero fisso di argomenti per una funzione. Lo standard ISO C prevede nella sua sintassi la possibilità di definire delle \textit{variadic function}\index{variadic} che abbiano un numero variabile di argomenti, -attraverso l'uso della \textit{ellipsis} \code{...} nella dichiarazione della -funzione; ma non provvede a livello di linguaggio alcun meccanismo con cui -dette funzioni possono accedere ai loro argomenti. - -L'accesso viene invece realizzato dalle librerie standard che provvedono gli -strumenti adeguati. L'uso delle \textit{variadic function} prevede tre punti: -\begin{itemize*} +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 +realizzato a livello delle librerie standard del C che provvedono gli +strumenti adeguati. L'uso di una \textit{variadic function} prevede quindi +tre punti: +\begin{itemize} \item \textsl{Dichiarare} la funzione come \textit{variadic} usando un prototipo che contenga una \textit{ellipsis}. -\item \textsl{Definire} la funzione come \textit{variadic} usando lo stesso +\item \textsl{Definire} la funzione come \textit{variadic} usando la stessa \textit{ellipsis}, ed utilizzare le apposite macro che consentono la gestione di un numero variabile di argomenti. -\item \textsl{Chiamare} la funzione specificando prima gli argomenti fissi, e - a seguire gli addizionali. -\end{itemize*} +\item \textsl{Invocare} la funzione specificando prima gli argomenti fissi, ed + a seguire quelli addizionali. +\end{itemize} Lo standard ISO C prevede che una \textit{variadic function}\index{variadic} abbia sempre almeno un argomento fisso; prima di effettuare la dichiarazione @@ -1352,7 +1350,7 @@ L'unica modalit sequenziale; essi verranno estratti dallo stack secondo l'ordine in cui sono stati scritti. Per fare questo in \file{stdarg.h} sono definite delle apposite macro; la procedura da seguire è la seguente: -\begin{enumerate*} +\begin{enumerate} \item Inizializzare un puntatore alla lista degli argomenti di tipo \macro{va\_list} attraverso la macro \macro{va\_start}. \item Accedere ai vari argomenti opzionali con chiamate successive alla macro @@ -1360,7 +1358,7 @@ macro; la procedura da seguire il secondo e così via. \item Dichiarare la conclusione dell'estrazione degli argomenti invocando la macro \macro{va\_end}. -\end{enumerate*} +\end{enumerate} in generale è perfettamente legittimo richiedere meno argomenti di quelli che potrebbero essere stati effettivamente forniti, e nella esecuzione delle \macro{va\_arg} ci si può fermare in qualunque momento ed i restanti argomenti @@ -1486,15 +1484,15 @@ programma: quello dell'uscita in caso di errore. \index{salto~non-locale|(} -Il C però non consente di effettuare un salto ad -una etichetta definita in un'altra funzione, per cui se l'errore avviene in -una funzione, e la sua gestione ordinaria è in un'altra, occorre usare quello -che viene chiamato un \textsl{salto non-locale}. Il caso classico in cui si -ha questa necessità, citato sia da \cite{APUE} che da \cite{glibc}, è quello -di un programma nel cui corpo principale vengono letti dei dati in ingresso -sui quali viene eseguita, tramite una serie di funzioni di analisi, una -scansione dei contenuti da si ottengono le indicazioni per l'esecuzione delle -opportune operazioni. +Il C però non consente di effettuare un salto ad una etichetta definita in +un'altra funzione, per cui se l'errore avviene in una funzione, e la sua +gestione ordinaria è in un'altra, occorre usare quello che viene chiamato un +\textsl{salto non-locale}. Il caso classico in cui si ha questa necessità, +citato sia in \cite{APUE} che in \cite{glibc}, è quello di un programma nel +cui corpo principale vengono letti dei dati in ingresso sui quali viene +eseguita, tramite una serie di funzioni di analisi, una scansione dei +contenuti, da cui si ottengono le indicazioni per l'esecuzione di opportune +operazioni. Dato che l'analisi può risultare molto complessa, ed opportunamente suddivisa in fasi diverse, la rilevazione di un errore nei dati in ingresso può accadere @@ -1575,10 +1573,10 @@ pertanto non si pu chiamate a questa funzione sono sicure solo in uno dei seguenti casi: \begin{itemize} \item come espressione di controllo in un comando condizionale, di selezione - o di iterazione (come \code{if}, \code{switch} o \code{while}). + o di iterazione (come \code{if}, \code{switch} o \code{while}); \item come operando per un operatore di uguaglianza o confronto in una espressione di controllo di un comando condizionale, di selezione o di - iterazione. + iterazione; \item come operando per l'operatore di negazione (\code{!}) in una espressione di controllo di un comando condizionale, di selezione o di iterazione. \item come espressione a sé stante. diff --git a/prochand.tex b/prochand.tex index 8414fb2..a663b9f 100644 --- a/prochand.tex +++ b/prochand.tex @@ -852,7 +852,7 @@ Al ritorno della funzione lo stato di terminazione del figlio viene salvato nella variabile puntata da \param{status} e tutte le risorse del kernel relative al processo (vedi sez.~\ref{sec:proc_termination}) vengono rilasciate. Nel caso un processo abbia più figli il valore di ritorno (il \acr{pid} del -figlio) permette di identificare qual'è quello che è uscito. +figlio) permette di identificare qual è quello che è uscito. Questa funzione ha il difetto di essere poco flessibile, in quanto ritorna all'uscita di un qualunque processo figlio. Nelle occasioni in cui è diff --git a/session.tex b/session.tex index 2d8734d..c042e91 100644 --- a/session.tex +++ b/session.tex @@ -291,7 +291,7 @@ dal quale ricevono gli eventuali segnali da tastiera. A tale scopo lo standard POSIX.1 prevede che ad ogni sessione possa essere associato un terminale di controllo; in Linux questo viene realizzato -mantenendo fra gli attributi di ciascun processo anche qual'è il suo terminale +mantenendo fra gli attributi di ciascun processo anche qual è il suo terminale di controllo. \footnote{Lo standard POSIX.1 non specifica nulla riguardo l'implementazione; in Linux anch'esso viene mantenuto nella solita struttura \struct{task\_struct}, nel campo \var{tty}.} In generale ogni processo @@ -358,7 +358,7 @@ condizioni di errore.\footnote{la shell in genere notifica comunque un \func{waitpid}.} Se però si bloccano o ignorano i due segnali citati, le funzioni di lettura e scrittura falliranno con un errore di \errcode{EIO}. -Un processo può controllare qual'è il gruppo di \textit{foreground} associato +Un processo può controllare qual è il gruppo di \textit{foreground} associato ad un terminale con la funzione \funcd{tcgetpgrp}, il cui prototipo è: \begin{functions} \headdecl{unistd.h} \headdecl{termios.h} diff --git a/sockctrl.tex b/sockctrl.tex index 79505d4..479533c 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1938,7 +1938,7 @@ socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}. Dato che il tipo di dati varia a seconda dell'opzione scelta, occorrerà -individuare qual'è quello che deve essere usato, ed utilizzare le opportune +individuare qual è quello che deve essere usato, ed utilizzare le opportune variabili. La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se diff --git a/tcpsock.tex b/tcpsock.tex index aaa7914..1c55fd3 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -88,7 +88,7 @@ stabilisce la connessione. % Una analogia citata da R. Stevens per la connessione TCP è quella con il % sistema del telefono. La funzione \texttt{socket} può essere considerata % l'equivalente di avere un telefono. La funzione \texttt{bind} è analoga al -% dire alle altre persone qual'è il proprio numero di telefono perché possano +% dire alle altre persone qual è il proprio numero di telefono perché possano % chiamare. La funzione \texttt{listen} è accendere il campanello del telefono % per sentire le chiamate in arrivo. La funzione \texttt{connect} richiede di % conoscere il numero di chi si vuole chiamare. La funzione \texttt{accept} è @@ -1182,7 +1182,7 @@ ritornata da \func{accept}), all'esecuzione di \func{exec} verr memoria l'immagine del programma eseguito, che a questo punto perde ogni riferimento ai valori tornati da \func{accept}. Il socket descriptor però resta aperto, e se si è seguita una opportuna convenzione per rendere noto al -programma eseguito qual'è il socket connesso, \footnote{ad esempio il solito +programma eseguito qual è il socket connesso, \footnote{ad esempio il solito \cmd{inetd} fa sempre in modo che i file descriptor 0, 1 e 2 corrispondano al socket connesso.} quest'ultimo potrà usare la funzione \func{getpeername} per determinare l'indirizzo remoto del client.