Si prosegue con le questioni relative alla bufferizzazione
[gapil.git] / filestd.tex
index 3810f04e066b6cae089a01ba4529bce4afbc8578..43cc123b5a2c54eb190a9e61ef8bdc15bcf467aa 100644 (file)
@@ -4,7 +4,7 @@
 Esamineremo in questo capitolo l'interfaccia standard ANSI C per i file,
 quella che viene comunemente detta interfaccia degli \textit{stream}.
 Dopo una breve sezione introduttiva tratteremo le funzioni base per la
 Esamineremo in questo capitolo l'interfaccia standard ANSI C per i file,
 quella che viene comunemente detta interfaccia degli \textit{stream}.
 Dopo una breve sezione introduttiva tratteremo le funzioni base per la
-gestione dell'input/output, mentre tratteremo le caratteristiche più aanzate
+gestione dell'input/output, mentre tratteremo le caratteristiche più avanzate
 dell'interfaccia nell'ultima sezione.
 
 
 dell'interfaccia nell'ultima sezione.
 
 
@@ -36,9 +36,9 @@ I/O con i file descriptor, evidenziando come le prestazioni ottimali si
 ottengano quando il buffer dei dati ha la stessa dimensione dei blocchi del
 filesystem (il valore dato dal campo \var{st\_blksize} di \var{fstat}).
 
 ottengano quando il buffer dei dati ha la stessa dimensione dei blocchi del
 filesystem (il valore dato dal campo \var{st\_blksize} di \var{fstat}).
 
-In questo caso se il porgrammatore non si cura di effettuare le operazioni in
+In questo caso se il programmatore non si cura di effettuare le operazioni in
 blocchi di dimensioni adeguate, le prestazioni possono deteriorarsi in maniera
 blocchi di dimensioni adeguate, le prestazioni possono deteriorarsi in maniera
-evidetne. L'interfaccia degli stream provvede da sola la gestione dei dettagli
+evidente. L'interfaccia degli stream provvede da sola la gestione dei dettagli
 della bufferizzazione e dell'esecuzione delle operazioni di lettura e
 scrittura effettive in blocchi di dimensioni appropriate all'ottenimento della
 massima efficienza.
 della bufferizzazione e dell'esecuzione delle operazioni di lettura e
 scrittura effettive in blocchi di dimensioni appropriate all'ottenimento della
 massima efficienza.
@@ -98,7 +98,7 @@ tre stream sono definiti nell'header \file{stdio.h} e sono:
 
 Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
 tre variabili che possono essere usate come tutte le altre, ad esempio si può
 
 Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
 tre variabili che possono essere usate come tutte le altre, ad esempio si può
-effettuare una redirezione dell'ouput di un programma con il semplice codice:
+effettuare una redirezione dell'output di un programma con il semplice codice:
 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
     fclose (stdout);
     stdout = fopen ("standard-output-file", "w");
 \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
     fclose (stdout);
     stdout = fopen ("standard-output-file", "w");
@@ -110,13 +110,70 @@ usata \func{freopen}.
 \subsection{Le modalità di bufferizzazione}
 \label{sec:file_buffering}
 
 \subsection{Le modalità di bufferizzazione}
 \label{sec:file_buffering}
 
+La bufferizzazione è una delle caratteristiche principali della interfaccia
+degli stream; lo scopo è quello di ridurre al minimo il numero di system call
+(\func{read} o \func{write}) eseguite nelle operazioni di input/output. Questa
+funzionalità è assicurata automaticamente dalla libreria, ma costituisce anche
+una degli aspetti più comunemente fraintesi.
+
+I caratteri che vengono scritti su uno stream normalmente vengono accumulati e
+poi trasmessi in blocco in maniera asincrona (quello che viene chiamato il
+\textit{flush} dei dati) quando il buffer è pieno, questo tipo di
+comportamento vale anche per la lettura (cioè dal file viene letto un blocco
+di dati, anche se se ne sono richiesti una quantità inferiore).  
+
+Se si sta facendo dell'input/output interattivo però bisogna tenere presente
+le caratteristiche con cui viene effettuata la bufferizzazione, pena il
+rischio di non vedere apparire l'output o di ottenere degli effetti
+indesiderati nella visualizzazione.
+
+Per questo motivo, la libreria definisce tre distinte modalità di
+bufferizzazione, adatte a situazioni diverse, di cui occorre essere ben
+consapevoli:
+\begin{itemize}
+\item \textit{unbuffered}: in questa modalità i caratteri non sono
+  bufferizzati e vengono trasmessi individualmente al file non appena
+  possibile (effettuando immediatamente una \func{write}).
+\item \textit{line buffered}: in questo caso i caratteri vengono trasmessi
+  al file in blocco ogni volta che viene incontrato un carattere di
+  \textit{newline} (il carattere ASCII \verb|\n|).
+\item \textit{fully buffered}: in questo caso i caratteri vengono trasmessi da
+  e verso il file in blocchi di dimensione opportuna.
+\end{itemize}
+
+Lo standard ANSI C specifica soltanto che lo standard output e lo standard
+input siano aperti in modalità \textit{fully buffered} quando non fanno
+riferimento ad un dispositivo interattivo, e che lo standard error non sia mai
+aperto in modalità \textit{fully buffered}.
+
+Linux, come BSD e SVr4, specifica il comportamento di default in maniera più
+precisa, e cioè impone che lo standard error sia sempre \textit{unbuffered}
+(in modo che i messaggi di errore siano mostrati il più rapidamente possibile)
+e che standard input e standard output siano aperti in modalità \textit{line
+  buffered} quando sono associati ad un terminale (od altro dispositivo
+interattivo) ed in modalità \textit{fully buffered} altrimenti.
+
+Il comportamento specificato per standard input e standard output vale anche
+per tutti i nuovi stream aperti da un processo; la selezione comunque avviene
+automaticamente, e la libreria apre lo stream nella modalità più opportuna a
+seconda file o al dispositivo scelto.
+
+La modalità \textit{line buffered} è quella passibile di maggiori
+fraintendimenti, la descrizione che se ne è data infatti non è precisa, dato
+che le dimensioni del buffer di I/O sono fisse e se le si eccedono può essere
+effettuato un \textit{flush} dei dati anche prima che si sia inviato un
+carattere di \textit{newline}.
+
+
+
 
 \section{Funzioni base}
 \label{sec:file_ansi_base_func}
 
 Esamineremo in questa sezione le funzioni base dell'interfaccia degli stream,
 
 \section{Funzioni base}
 \label{sec:file_ansi_base_func}
 
 Esamineremo in questa sezione le funzioni base dell'interfaccia degli stream,
-che provvedono le modalità per crearli, e le funzioni disponibili per leggere,
-scrivere e compiere le varie operazioni connesse all'uso dei file.
+analoghe a quelle di \secref{sec:file_base_func} per i file descriptor. In
+particolare vedremo come aprire, leggere, scrivere e cambiare la posizione
+corrente in uno stream.
 
 
 \subsection{Apertura di uno stream}
 
 
 \subsection{Apertura di uno stream}