+serie di funzioni che permettono di controllare il comportamento degli stream;
+se non si è specificato nulla, la modalità di buffering viene decisa
+autonomamente sulla base del tipo di file sottostante, ed i buffer vengono
+allocati automaticamente.
+
+Però una volta che si sia aperto lo stream (ma prima di aver compiuto
+operazioni su di esso) è possibile intervenire sulle modalità di buffering; la
+funzione che permette di controllare la bufferizzazione è \func{setvbuf}, il
+suo prototipo è:
+\begin{prototype}{stdio.h}{int setvbuf(FILE *stream, char *buf, int mode,
+ size\_t size)}
+
+ Imposta la bufferizzazione dello stream \param{stream} nella modalità
+ indicata da \param{mode}, usando \param{buf} come buffer di lunghezza
+ \param{size}.
+
+ \bodydesc{Restituisce zero in caso di successo, ed un valore qualunque in
+ caso di errore, nel qual caso \var{errno} viene impostata opportunamente.}
+\end{prototype}
+
+La funzione permette di controllare tutti gli aspetti della bufferizzazione;
+l'utente può specificare un buffer da usare al posto di quello allocato dal
+sistema passandone alla funzione l'indirizzo in \param{buf} e la dimensione in
+\param{size}.
+
+Ovviamente se si usa un buffer specificato dall'utente questo deve essere
+stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo
+stream. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la
+chiusura del file; ma fintanto che il file è usato all'interno di una
+funzione, può anche essere usata una variabile automatica. In \file{stdio.h} è
+definita la macro \const{BUFSIZ}, che indica le dimensioni generiche del
+buffer di uno stream; queste vengono usate dalla funzione \func{setbuf}. Non
+è detto però che tale dimensione corrisponda sempre al valore ottimale (che
+può variare a seconda del dispositivo).
+
+Dato che la procedura di allocazione manuale è macchinosa, comporta dei rischi
+(come delle scritture accidentali sul buffer) e non assicura la scelta delle
+dimensioni ottimali, è sempre meglio lasciare allocare il buffer alle funzioni
+di libreria, che sono in grado di farlo in maniera ottimale e trasparente
+all'utente (in quanto la disallocazione avviene automaticamente). Inoltre
+siccome alcune implementazioni usano parte del buffer per mantenere delle
+informazioni di controllo, non è detto che le dimensioni dello stesso
+coincidano con quelle su cui viene effettuato l'I/O.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Valore} & \textbf{Modalità} \\
+ \hline
+ \hline
+ \const{\_IONBF} & \textit{unbuffered}\\
+ \const{\_IOLBF} & \textit{line buffered}\\
+ \const{\_IOFBF} & \textit{fully buffered}\\
+ \hline
+ \end{tabular}
+ \caption{Valori del parametro \param{mode} di \func{setvbuf}
+ per l'impostazione delle modalità di bufferizzazione.}
+ \label{tab:file_stream_buf_mode}
+\end{table}
+
+Per evitare che \func{setvbuf} imposti il buffer basta passare un valore
+\val{NULL} per \param{buf} e la funzione ignorerà il parametro \param{size}
+usando il buffer allocato automaticamente dal sistema. Si potrà comunque
+modificare la modalità di bufferizzazione, passando in \param{mode} uno degli
+opportuni valori elencati in \tabref{tab:file_stream_buf_mode}. Qualora si
+specifichi la modalità non bufferizzata i valori di \param{buf} e \param{size}
+vengono sempre ignorati.
+
+Oltre a \func{setvbuf} le \acr{glibc} definiscono altre tre funzioni per la
+gestione della bufferizzazione di uno stream: \func{setbuf}, \func{setbuffer}
+e \func{setlinebuf}; i loro prototipi sono:
+\begin{functions}
+ \headdecl{stdio.h}
+
+ \funcdecl{void setbuf(FILE *stream, char *buf)} Disabilita la
+ bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
+ come buffer di dimensione \const{BUFSIZ} in modalità \textit{fully buffered}.
+
+ \funcdecl{void setbuffer(FILE *stream, char *buf, size\_t size)} Disabilita
+ la bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
+ come buffer di dimensione \param{size} in modalità \textit{fully buffered}.
+
+ \funcdecl{void setlinebuf(FILE *stream)} Pone lo stream in modalità
+ \textit{line buffered}.
+\end{functions}
+\noindent tutte queste funzioni sono realizzate con opportune chiamate a
+\func{setvbuf} e sono definite solo per compatibilità con le vecchie librerie
+BSD. Infine le \acr{glibc} provvedono le funzioni non standard\footnote{anche
+ queste funzioni sono originarie di Solaris.} \func{\_\_flbf} e
+\func{\_\_fbufsize} che permettono di leggere le proprietà di bufferizzazione
+di uno stream; i cui prototipi sono:
+\begin{functions}
+ \headdecl{stdio\_ext.h}
+
+ \funcdecl{int \_\_flbf(FILE *stream)} Restituisce un valore diverso da zero
+ se \param{stream} è in modalità \textit{line buffered}.
+
+ \funcdecl{size\_t \_\_fbufsize(FILE *stream)} Restituisce le dimensioni del
+ buffer di \param{stream}.
+\end{functions}
+
+Come già accennato, indipendentemente dalla modalità di bufferizzazione
+scelta, si può forzare lo scarico dei dati sul file con la funzione
+\func{fflush}, il suo prototipo è:
+\begin{prototype}{stdio.h}{int fflush(FILE *stream)}
+
+ Forza la scrittura di tutti i dati bufferizzati dello stream \param{stream}.
+
+ \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
+ errore, impostando \var{errno} a \errval{EBADF} se \param{stream} non è
+ aperto o non è aperto in scrittura, o ad uno degli errori di
+ \func{write}.}
+\end{prototype}
+\noindent anche di questa funzione esiste una analoga
+\func{fflush\_unlocked}\footnote{accessibile definendo \macro{\_BSD\_SOURCE} o
+ \macro{\_SVID\_SOURCE} o \macro{\_GNU\_SOURCE}.} che non effettua il blocco
+dello stream.
+
+Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
+stream aperti. Esistono però circostanze, ad esempio quando si vuole essere
+sicuri che sia stato eseguito tutto l'output su terminale, in cui serve poter
+effettuare lo scarico dei dati solo per gli stream in modalità line buffered;
+per questo motivo le \acr{glibc} supportano una estensione di Solaris, la
+funzione \func{\_flushlbf}, il cui prototipo è:
+\begin{prototype}{stdio-ext.h}{void \_flushlbf(void)}
+ Forza la scrittura di tutti i dati bufferizzati degli stream in modalità
+ line buffered.
+\end{prototype}
+
+Si ricordi comunque che lo scarico dei dati dai buffer effettuato da queste
+funzioni non comporta la scrittura di questi su disco; se si vuole che il
+kernel dia effettivamente avvio alle operazioni di scrittura su disco occorre
+usare \func{sync} o \func{fsync} (si veda~\secref{sec:file_sync}).
+
+Infine esistono anche circostanze in cui si vuole scartare tutto l'output
+pendente; per questo si può usare \func{fpurge}, il cui prototipo è:
+\begin{prototype}{stdio.h}{int fpurge(FILE *stream)}
+
+ Cancella i buffer di input e di output dello stream \param{stream}.
+
+ \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
+ errore.}
+\end{prototype}
+
+La funzione scarta tutti i dati non ancora scritti (se il file è aperto in
+scrittura), e tutto l'input non ancora letto (se è aperto in lettura),
+compresi gli eventuali caratteri rimandati indietro con \func{ungetc}.