+Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
+tre variabili di tipo \type{FILE *} che possono essere usate come tutte le
+altre, ad esempio si può 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");
+\end{lstlisting}
+ma in altri sistemi possono essere definite come macro, se si hanno problemi
+di portabilità e si vuole essere sicuri, diventa opportuno usare la funzione
+\func{freopen}.
+
+
+\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, in particolare per quello che
+riguarda l'aspetto della scrittura dei dati sul file.
+
+I caratteri che vengono scritti su uno stream normalmente vengono accumulati
+in un buffer e poi trasmessi in blocco in maniera asincrona rispetto alla
+scrittura (quello che viene chiamato il \textit{flush} dei dati) tutte le
+volte che il buffer viene riempito. Un comportamento analogo avviene anche in
+lettura (cioè dal file viene letto un blocco di dati, anche se se ne sono
+richiesti una quantità inferiore), ma la cosa ovviamente ha rilevanza
+inferiore, dato che i dati letti sono sempre gli stessi; in caso di scrittura
+invece, quando si ha un accesso contemporaneo allo stesso file (ad esempio da
+parte di un altro processo) si potranno vedere solo le parti effettivamente
+scritte, e non quelle ancora presenti nel buffer.
+
+Allo stesso modo, se si sta facendo dell'input/output interattivo bisognerà
+tenere presente le caratteristiche delle operazioni di \textit{flush} dei
+dati, poiché non è detto che ad una scrittura sullo stream corrisponda una
+immediata scrittura sul dispositivo.
+
+Per risondere ad esigenze diverse, lo standard definisce tre distinte modalità
+in cui può essere eseguita la bufferizzazione, delle quali occorre essere ben
+consapevoli, specie in caso di lettura e scrittura da dispositivi interattivi:
+\begin{itemize}
+\item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
+ caratteri vengono trasmessi direttamente al file non appena possibile
+ (effettuando immediatamente una \func{write}).
+\item \textit{line buffered}: in questo caso i caratteri vengono normalmente
+ 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 inoltre 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
+ancora 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 del file o del dispositivo scelto.
+
+La modalità \textit{line buffered} è quella che necessita di maggiori
+chiarimenti e attenzioni per quel che concerne il suo funzionamento. Come già
+accennato nella descrizione, \emph{di norma} i dati vengono inviati al kernel
+alla ricezione di un carattere di a capo; questo non è vero in tutti i casi,
+infatti, dato che le dimensioni del buffer usato dalle librerie sono fisse, se
+le si eccedono si può avere un \textit{flush} dei dati anche prima che sia
+stato inviato un carattere di \textit{newline}.
+
+Un secondo punto da tenere presente, particolarmente quando si ha a che fare
+con I/O interattivo, è che quando si effettua una lettura su uno stream che
+comporta l'accesso al kernel\footnote{questo vuol dire sempre se lo stream da
+ cui si legge è in modalità \textit{unbuffered}} viene anche eseguito il
+\textit{flush} di tutti i buffer degli stream in scrittura.
+
+In \secref{sec:file_buffering_ctrl} vedremo come la libreria definisca delle
+opportune funzioni per controllare le modalità di bufferizzazione ed il
+\textit{flush} dei dati.
+