Aggiunte fcloseall e funzioni GNU per lo stato dei file
[gapil.git] / filestd.tex
index 0ea99952c1e5c8d92b012badc22243e5463123ce..bbc7bc0ddf8fbece27978f3b4b85c4b606719fde 100644 (file)
@@ -126,19 +126,19 @@ 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
 
 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. 
+scrittura (quello che viene chiamato lo \textsl{scarico}, dall'ingelese 
+\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à
 
 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.
+tenere presente le caratteristiche delle operazioni di scarico dei dati,
+poiché non è detto che ad una scrittura sullo stream corrisponda una immediata
+scrittura sul dispositivo.
 
 Per rispondere ad esigenze diverse, lo standard definisce tre distinte modalità
 in cui può essere eseguita la bufferizzazione, delle quali occorre essere ben
 
 Per rispondere ad esigenze diverse, lo standard definisce tre distinte modalità
 in cui può essere eseguita la bufferizzazione, delle quali occorre essere ben
@@ -177,18 +177,18 @@ 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
 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}.
+le si eccedono si può avere uno scarico 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
 
 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. 
+  cui si legge è in modalità \textit{unbuffered}.} viene anche eseguito lo
+scarico di tutti i buffer degli stream in scrittura.
 
 In \secref{sec:file_buffering_ctrl} vedremo come la libreria definisca delle
 
 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.
+opportune funzioni per controllare le modalità di bufferizzazione e lo scarico
+dei dati.
 
 
 
 
 
 
@@ -207,7 +207,6 @@ corrente in uno stream.
 Le funzioni che permettono di aprire uno stream sono tre\footnote{\func{fopen}
   e \func{freopen} fanno parte dello standard ANSI C, \func{fdopen} è parte
 dello standard POSIX.1.}, i loro prototipi sono:
 Le funzioni che permettono di aprire uno stream sono tre\footnote{\func{fopen}
   e \func{freopen} fanno parte dello standard ANSI C, \func{fdopen} è parte
 dello standard POSIX.1.}, i loro prototipi sono:
-
 \begin{functions}
   \headdecl{stdio.h}
   \funcdecl{FILE * fopen(const char * path, const char *mode)}
 \begin{functions}
   \headdecl{stdio.h}
   \funcdecl{FILE * fopen(const char * path, const char *mode)}
@@ -308,6 +307,10 @@ usare una delle funzioni \func{fseek}, \func{fsetpos} o \func{rewind}. Anche
 una operazione nominalmente nulla come \func{fseek(file, 0, SEEK\_CUR)} è
 sufficiente a garantire la sincronizzazione.
 
 una operazione nominalmente nulla come \func{fseek(file, 0, SEEK\_CUR)} è
 sufficiente a garantire la sincronizzazione.
 
+Una volta aperto lo stream, si può cambiare la modalità di bufferizzazione
+(vedi \secref{sec:file_buffering_ctrl}) fintanto che non si è effettuato
+alcuna operazione di I/O sul file.
+
 Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo è:
 \begin{prototype}{stdio.h}{int fclose(FILE * stream)}
   Chiude lo stream \param{stream}. 
 Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo è:
 \begin{prototype}{stdio.h}{int fclose(FILE * stream)}
   Chiude lo stream \param{stream}. 
@@ -318,6 +321,26 @@ Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo 
   funzione che è fallita (\func{close}, \func{write} o \func{fflush}).
 \end{prototype}
 
   funzione che è fallita (\func{close}, \func{write} o \func{fflush}).
 \end{prototype}
 
+La funzione effettua uno scarico di tutti i dati presenti nei buffer di uscita
+e scarta tutti i dati in ingresso, se era stato allocato un buffer per lo
+stream questo verrà rilasciato. La funzione effettua lo scarico solo per i
+dati presenti nei buffer in user space usati dalle \acr{glibc}; se si essere
+sicuri che il kernel forzi la scrittura su disco occorrà effettuare . 
+
+Linux supporta, come estensione implementata dalle \acr{glibc}, anche una
+altra funzione, \func{fcloseall}, che serve a chiudere tutti i file, il suo
+prototipo è:
+\begin{prototype}{stdio.h}{int fcloseall(void)}
+  Chiude tutti gli stream. 
+  
+  Restituisce 0 se non ci sono errori ed \macro{EOF} altrimenti.
+\end{prototype}
+la funzione esegue lo scarico dei dati bufferizzati in uscita e scarta quelli
+in ingresso, chiudendo tutti i file. Questa funzione è provvista solo per i
+casi di emergenza, quando si è verificato un errore ed il programma deve
+essere abortito, ma si vuole compiere qualche altra operazione dopo aver
+chiuso i file e prima di uscire (si ricordi quanto visto in
+\secref{sec:proc_exit}).
 
 
 \subsection{Lettura e scrittura su uno stream}
 
 
 \subsection{Lettura e scrittura su uno stream}
@@ -343,6 +366,34 @@ Uno stream viene chiuso con la funzione \func{fclose} il cui prototipo 
 \section{Funzioni avanzate}
 \label{sec:file_stream_adv_func}
 
 \section{Funzioni avanzate}
 \label{sec:file_stream_adv_func}
 
+In questa sezione esamineremo le funzioni che permettono di controllare alcune
+caratteristiche più particolari degli stream, come la lettura degli attributi,
+le modalità di bufferizzazione, etc.
+
+
+\subsection{Le funzioni di controllo}
+\label{sec:file_stream_cntrl}
+
+Al contrario di quanto avviene con i file descriptor le librerie standard del
+C non prevedono nessuna funzione come la \func{fcntl} per la lettura degli
+attributi degli stream; le \acr{glibc} però supportano alcune estensioni
+derivate da Solaris, che permettono di ottenere informazioni utili.
+
+In certi casi può essere necessario sapere se un certo stream è accessibile in
+lettura o scrittura. In genere questa informazione non è disponibile, e si
+deve ricordare come il file è stato aperto. La cosa può essere complessa se le
+operazioni vengono effettuate un una subroutine, che a questo punto
+necessiterà di informazioni aggiuntive rispetto al semplice puntatore allo
+stream; questo può essere evitato con le due funzioni \func{\_\_freadable} e
+\func{\_\_fwritable} i cui prototipi sono:
+
+\begin{functions}
+  \headdecl{stdio\_ext.h}
+  \funcdecl{int \_\_freadable (FILE * stream)}
+  \funcdecl{int \_\_fwritable(FILE * stream)}
+\end{functions}
+
+
 
 \subsection{Il controllo della bufferizzazione}
 \label{sec:file_buffering_ctrl}
 
 \subsection{Il controllo della bufferizzazione}
 \label{sec:file_buffering_ctrl}
@@ -363,11 +414,3 @@ stream; se non si 
 \subsection{Efficienza}
 \label{sec:file_stream_efficiency}
 
 \subsection{Efficienza}
 \label{sec:file_stream_efficiency}
 
-
-
-
-
-
-
-
-