X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=206fb8e8aa38898aadf059a99b7f1dc09d0bb79c;hp=797ecfbf9e4eccfeddc55ff2c59c4798b9121466;hb=fc2954a94ffab07871f49e2432d5223f55840fbf;hpb=fb1020bd2b32afc135baa00f2443bb0ceed3520a diff --git a/fileadv.tex b/fileadv.tex index 797ecfb..206fb8e 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -2730,8 +2730,6 @@ mappatura che gi \itindend{memory~mapping} - - \subsection{I/O vettorizzato: \func{readv} e \func{writev}} \label{sec:file_multiple_io} @@ -3138,7 +3136,6 @@ file destinazione. Il passo successivo (\texttt{\small 18--22}), quello di destinazione (\texttt{\small 23--27}) ed infine (\texttt{\small 28--31}) la \textit{pipe} che verrà usata come buffer. - \begin{figure}[!htbp] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -3293,29 +3290,61 @@ all'altra (o $-1$ in caso di errore), un valore nullo indica che non ci sono byte disponibili da copiare (la funzione in questo caso non si blocca, a differenza di quanto avverrebbe per una normale lettura). Un esempio di realizzazione del comando \texttt{tee} usando questa funzione, ripreso da -quello fornito nella pagina di manuale, è riportato in fig.. +quello fornito nella pagina di manuale e dall'esempio allegato al pacth +originale, è riportato in fig.~\ref{fig:tee_example}. Il programma consente di +copiare il contenuto dello standard input sullo standard output e su un file +specificato come argomento, il codice completo si trova nel file +\texttt{tee.c} dei sorgenti allegati alla guida. +% TODO verificare funzionamento, su Ubuntu Feisty non va... +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includecodesample{listati/tee.c} + \end{minipage} + \normalsize + \caption{Esempio di codice che usa \func{tee} per copiare i dati dello + standard input sullo standard output e su un file.} + \label{fig:tee_example} +\end{figure} -Infine come nota finale riguardo \func{splice}, \func{vmsplice} e \func{tee} -occorre sottolineare che benché si sia parlato finora di trasferimenti o copie -di dati in realtà nella loro implementazione non è affatto detto che questi -vengono effettivamente spostati o copiati, il kernel infatti realizza le -\textit{pipe} come un insieme di puntatori\footnote{per essere precisi si - tratta di un semplice buffer circolare, un buon articolo sul tema si trova - su \href{http://lwn.net/Articles/118750/} +La prima parte del programma (\texttt{\small 10--35}) si cura semplicemente di +controllare (\texttt{\small 11--14}) che sia stato fornito almeno un argomento +(il nome del file su cui scrivere), di aprirlo ({\small 15--19}) e che sia lo +standard input (\texttt{\small 20--27}) che lo standard output (\texttt{\small + 28--35}) corripondano ad una \textit{pipe}. + +Il ciclo principale (\texttt{\small 37--58}) inizia con la chiamata a +\func{tee} che duplica il contenuto dello standard input sullo standard output +(\texttt{\small 39}), questa parte è del tutto analoga ad una lettura ed +infatti come nell'esempio di fig.~\ref{fig:splice_example} si controlla il +valore di ritorno della funzione in \var{len}; se questo è nullo significa che +non ci sono più dati da leggere e si chiude il ciclo (\texttt{\small 40}), se +è negativo c'è stato un errore, ed allora si ripete la chiamata se questo è +dovuto ad una interruzione (\texttt{\small 42--44}) o si stampa un messaggio +di errore e si esce negli altri casi (\texttt{\small 44--47}). + +Una volta completata la copia dei dati sullo standard output si possono +estrarre dalla standard input e scrivere sul file, di nuovo su usa un ciclo di +scrittura (\texttt{\small 50--58}) in cui si ripete una chiamata a +\func{splice} (\texttt{\small 51}) fintanto che non si sono scritti tutti i +\var{len} byte copiati in precedenza con \func{tee} (il funzionamento è +identico all'analogo ciclo di scrittura del precedente esempio di +fig.~\ref{fig:splice_example}). + +Infine una nota finale riguardo \func{splice}, \func{vmsplice} e \func{tee}: +occorre sottolineare che benché finora si sia parlato di trasferimenti o copie +di dati in realtà nella implementazione di queste system call non è affatto +detto che i dati vengono effettivamente spostati o copiati, il kernel infatti +realizza le \textit{pipe} come un insieme di puntatori\footnote{per essere + precisi si tratta di un semplice buffer circolare, un buon articolo sul tema + si trova su \href{http://lwn.net/Articles/118750/} {\texttt{http://lwn.net/Articles/118750/}}.} alle pagine di memoria interna che contengono i dati, per questo una volta che i dati sono presenti nella memoria del kernel tutto quello che viene fatto è creare i suddetti puntatori -ed aumentare il numero di referenze, pertanto anche con \func{tee} non viene -mai copiato nessun byte, vengono semplicemente copiati i puntatori. - - -% TODO documentare le funzioni tee e splice -% http://kerneltrap.org/node/6505 e http://lwn.net/Articles/178199/ e -% http://lwn.net/Articles/179492/ e http://lwn.net/Articles/181169 -% e http://en.wikipedia.org/wiki/Splice_(system_call) - +ed aumentare il numero di referenze; questo significa che anche con \func{tee} +non viene mai copiato nessun byte, vengono semplicemente copiati i puntatori. @@ -3335,12 +3364,13 @@ specifiche dei singoli programmi, che avendo una conoscenza diretta di come verranno usati i file, possono necessitare di effettuare delle ottimizzazioni specifiche, relative alle proprie modalità di I/O sugli stessi. Tratteremo in questa sezione una serie funzioni che consentono ai programmi di ottimizzare -il loro accesso ai dati dei file. +il loro accesso ai dati dei file e controllare la gestione del relativo +\textit{caching}. + -% TODO documentare \func{madvise} -% TODO documentare \func{mincore} % TODO documentare \func{posix\_fadvise} +% TODO documentare \func{readahead} % vedi http://insights.oetiker.ch/linux/fadvise.html % questo tread? http://www.ussg.iu.edu/hypermail/linux/kernel/0703.1/0032.html @@ -3378,7 +3408,7 @@ in cui diversi processi scrivono, mescolando in maniera imprevedibile il loro output sul file. In tutti questi casi il \textit{file locking} è la tecnica che permette di -evitare le \textit{race condition} \itindex{race~condition}, attraverso una +evitare le \itindex{race~condition} \textit{race condition}, attraverso una serie di funzioni che permettono di bloccare l'accesso al file da parte di altri processi, così da evitare le sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.