b2a3c18d754a6119f182f48c0c5714538dd2c652
[gapil.git] / filestd.tex
1 %% filestd.tex
2 %%
3 %% Copyright (C) 2000-2006 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \chapter{I file: l'interfaccia standard ANSI C}
12 \label{cha:files_std_interface}
13
14 Esamineremo in questo capitolo l'interfaccia standard ANSI C per i file,
15 quella che viene comunemente detta interfaccia degli \textit{stream}.  Dopo
16 una breve sezione introduttiva tratteremo le funzioni base per la gestione
17 dell'input/output, mentre tratteremo le caratteristiche più avanzate
18 dell'interfaccia nell'ultima sezione.
19
20
21 \section{Introduzione}
22 \label{sec:file_stream_intro}
23
24 Come visto in cap.~\ref{cha:file_unix_interface} le operazioni di I/O sui file
25 sono gestibili a basso livello con l'interfaccia standard unix, che ricorre
26 direttamente alle system call messe a disposizione dal kernel.
27
28 Questa interfaccia però non provvede le funzionalità previste dallo standard
29 ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria,
30 queste, insieme alle altre funzioni definite dallo standard, vengono a
31 costituire il nucleo\footnote{queste funzioni sono state implementate la prima
32   volta da Ritchie nel 1976 e da allora sono rimaste sostanzialmente
33   immutate.} delle \acr{glibc}.
34
35
36 \subsection{I \textit{file stream}}
37 \label{sec:file_stream}
38
39 \index{file!stream|(}
40 Come più volte ribadito, l'interfaccia dei file descriptor è un'interfaccia di
41 basso livello, che non provvede nessuna forma di formattazione dei dati e
42 nessuna forma di bufferizzazione per ottimizzare le operazioni di I/O.
43
44 In \cite{APUE} Stevens descrive una serie di test sull'influenza delle
45 dimensioni del blocco di dati (l'argomento \param{buf} di \func{read} e
46 \func{write}) nell'efficienza nelle operazioni di I/O con i file descriptor,
47 evidenziando come le prestazioni ottimali si ottengano a partire da dimensioni
48 del buffer dei dati pari a quelle dei blocchi del filesystem (il valore dato
49 dal campo \var{st\_blksize} di \struct{stat}), che di norma corrispondono alle
50 dimensioni dei settori fisici in cui è suddiviso il disco.
51
52 Se il programmatore non si cura di effettuare le operazioni in blocchi di
53 dimensioni adeguate, le prestazioni sono inferiori.  La caratteristica
54 principale dell'interfaccia degli stream è che essa provvede da sola alla
55 gestione dei dettagli della bufferizzazione e all'esecuzione delle operazioni
56 di lettura e scrittura in blocchi di dimensioni appropriate all'ottenimento
57 della massima efficienza.
58
59 Per questo motivo l'interfaccia viene chiamata anche interfaccia dei
60 \textit{file stream}, dato che non è più necessario doversi preoccupare
61 dei dettagli della comunicazione con il tipo di hardware sottostante
62 (come nel caso della dimensione dei blocchi del filesystem), ed un file
63 può essere sempre considerato come composto da un flusso continuo (da
64 cui il nome \textit{stream}) di dati.
65
66 A parte i dettagli legati alla gestione delle operazioni di lettura e
67 scrittura (sia per quel che riguarda la bufferizzazione, che le
68 formattazioni), i file stream restano del tutto equivalenti ai file descriptor
69 (sui quali sono basati), ed in particolare continua a valere quanto visto in
70 sez.~\ref{sec:file_sharing} a proposito dell'accesso condiviso ed in
71 sez.~\ref{sec:file_access_control} per il controllo di accesso.
72 \index{file!stream|)}
73
74
75 \subsection{Gli oggetti \type{FILE}}
76 \label{sec:file_FILE}
77
78
79 Per ragioni storiche la struttura di dati che rappresenta uno stream è stata
80 chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di libreria e
81 contengono tutte le informazioni necessarie a gestire le operazioni sugli
82 stream, come la posizione corrente, lo stato del buffer e degli indicatori di
83 stato e di fine del file.
84
85 Per questo motivo gli utenti non devono mai utilizzare direttamente o allocare
86 queste strutture (che sono dei \textsl{tipi opachi}\index{tipo!opaco}) ma
87 usare sempre puntatori del tipo \texttt{FILE *} ottenuti dalla libreria stessa
88 (tanto che in certi casi il termine di puntatore a file è diventato sinonimo
89 di stream).  Tutte le funzioni della libreria che operano sui file accettano
90 come argomenti solo variabili di questo tipo, che diventa accessibile
91 includendo l'header file \file{stdio.h}.
92
93
94 \subsection{Gli stream standard}
95 \label{sec:file_std_stream}
96
97 Ai tre file descriptor standard (vedi sez.~\ref{sec:file_std_descr})
98 aperti per ogni processo, corrispondono altrettanti stream, che
99 rappresentano i canali standard di input/output prestabiliti; anche
100 questi tre stream sono identificabili attraverso dei nomi simbolici
101 definiti nell'header \file{stdio.h} che sono:
102
103 \begin{basedescript}{\desclabelwidth{3.0cm}}
104 \item[\var{FILE *stdin}] Lo \textit{standard input} cioè lo stream da
105   cui il processo riceve ordinariamente i dati in ingresso. Normalmente
106   è associato dalla shell all'input del terminale e prende i caratteri
107   dalla tastiera.
108 \item[\var{FILE *stdout}] Lo \textit{standard output} cioè lo stream su
109   cui il processo invia ordinariamente i dati in uscita. Normalmente è
110   associato dalla shell all'output del terminale e scrive sullo schermo.
111 \item[\var{FILE *stderr}] Lo \textit{standard error} cioè lo stream su
112   cui il processo è supposto inviare i messaggi di errore. Normalmente
113   anch'esso è associato dalla shell all'output del terminale e scrive
114   sullo schermo.
115 \end{basedescript}
116
117 Nelle \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
118 tre variabili di tipo \type{FILE}\texttt{ *} che possono essere usate come
119 tutte le altre, ad esempio si può effettuare una redirezione dell'output di un
120 programma con il semplice codice: \includecodesnip{listati/redir_stdout.c} ma
121 in altri sistemi queste variabili possono essere definite da macro, e se si
122 hanno problemi di portabilità e si vuole essere sicuri, diventa opportuno
123 usare la funzione \func{freopen}.
124
125
126 \subsection{Le modalità di bufferizzazione}
127 \label{sec:file_buffering}
128
129 La bufferizzazione è una delle caratteristiche principali dell'interfaccia
130 degli stream; lo scopo è quello di ridurre al minimo il numero di system call
131 (\func{read} o \func{write}) eseguite nelle operazioni di input/output. Questa
132 funzionalità è assicurata automaticamente dalla libreria, ma costituisce anche
133 uno degli aspetti più comunemente fraintesi, in particolare per quello che
134 riguarda l'aspetto della scrittura dei dati sul file.
135
136 I caratteri che vengono scritti su di uno stream normalmente vengono
137 accumulati in un buffer e poi trasmessi in blocco\footnote{questa operazione
138   viene usualmente chiamata \textsl{scaricamento} dei dati, dal termine
139   inglese \textit{flush}.} tutte le volte che il buffer viene riempito, in
140 maniera asincrona rispetto alla scrittura. Un comportamento analogo avviene
141 anche in lettura (cioè dal file viene letto un blocco di dati, anche se ne
142 sono richiesti una quantità inferiore), ma la cosa ovviamente ha rilevanza
143 inferiore, dato che i dati letti sono sempre gli stessi. In caso di scrittura
144 invece, quando si ha un accesso contemporaneo allo stesso file (ad esempio da
145 parte di un altro processo) si potranno vedere solo le parti effettivamente
146 scritte, e non quelle ancora presenti nel buffer.
147
148 Per lo stesso motivo, in tutte le situazioni in cui si sta facendo
149 dell'input/output interattivo, bisognerà tenere presente le caratteristiche
150 delle operazioni di scaricamento dei dati, poiché non è detto che ad una
151 scrittura sullo stream corrisponda una immediata scrittura sul dispositivo (la
152 cosa è particolarmente evidente quando con le operazioni di input/output su
153 terminale).
154
155 Per rispondere ad esigenze diverse, lo standard definisce tre distinte
156 modalità in cui può essere eseguita la bufferizzazione, delle quali
157 occorre essere ben consapevoli, specie in caso di lettura e scrittura da
158 dispositivi interattivi:
159 \begin{itemize}
160 \item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
161   caratteri vengono trasmessi direttamente al file non appena possibile
162   (effettuando immediatamente una \func{write}).
163 \item \textit{line buffered}: in questo caso i caratteri vengono
164   normalmente trasmessi al file in blocco ogni volta che viene
165   incontrato un carattere di \textit{newline} (il carattere ASCII
166   \verb|\n|).
167 \item \textit{fully buffered}: in questo caso i caratteri vengono
168   trasmessi da e verso il file in blocchi di dimensione opportuna.
169 \end{itemize}
170
171 Lo standard ANSI C specifica inoltre che lo standard output e lo
172 standard input siano aperti in modalità \textit{fully buffered} quando
173 non fanno riferimento ad un dispositivo interattivo, e che lo standard
174 error non sia mai aperto in modalità \textit{fully buffered}.
175
176 Linux, come BSD e SVr4, specifica il comportamento predefinito in maniera
177 ancora più precisa, e cioè impone che lo standard error sia sempre
178 \textit{unbuffered} (in modo che i messaggi di errore siano mostrati il più
179 rapidamente possibile) e che standard input e standard output siano aperti in
180 modalità \textit{line buffered} quando sono associati ad un terminale (od
181 altro dispositivo interattivo) ed in modalità \textit{fully buffered}
182 altrimenti.
183
184 Il comportamento specificato per standard input e standard output vale anche
185 per tutti i nuovi stream aperti da un processo; la selezione comunque avviene
186 automaticamente, e la libreria apre lo stream nella modalità più opportuna a
187 seconda del file o del dispositivo scelto.
188
189 La modalità \textit{line buffered} è quella che necessita di maggiori
190 chiarimenti e attenzioni per quel che concerne il suo funzionamento. Come già
191 accennato nella descrizione, \emph{di norma} i dati vengono inviati al kernel
192 alla ricezione di un carattere di \textsl{a capo} (\textit{newline}); questo
193 non è vero in tutti i casi, infatti, dato che le dimensioni del buffer usato
194 dalle librerie sono fisse, se le si eccedono si può avere uno scarico dei dati
195 anche prima che sia stato inviato un carattere di \textit{newline}.
196
197 Un secondo punto da tenere presente, particolarmente quando si ha a che fare
198 con I/O interattivo, è che quando si effettua una lettura da uno stream che
199 comporta l'accesso al kernel\footnote{questo vuol dire che lo stream da cui si
200   legge è in modalità \textit{unbuffered}.} viene anche eseguito lo scarico di
201 tutti i buffer degli stream in scrittura.
202
203 In sez.~\ref{sec:file_buffering_ctrl} vedremo come la libreria definisca delle
204 opportune funzioni per controllare le modalità di bufferizzazione e lo scarico
205 dei dati.
206
207
208
209 \section{Funzioni base}
210 \label{sec:file_ansi_base_func}
211
212 Esamineremo in questa sezione le funzioni base dell'interfaccia degli stream,
213 analoghe a quelle di sez.~\ref{sec:file_base_func} per i file descriptor. In
214 particolare vedremo come aprire, leggere, scrivere e cambiare la posizione
215 corrente in uno stream.
216
217
218 \subsection{Apertura e chiusura di uno stream}
219 \label{sec:file_fopen}
220
221 Le funzioni che si possono usare per aprire uno stream sono solo tre:
222 \funcd{fopen}, \funcd{fdopen} e \funcd{freopen},\footnote{\func{fopen} e
223   \func{freopen} fanno parte dello standard ANSI C, \func{fdopen} è parte
224   dello standard POSIX.1.} i loro prototipi sono:
225 \begin{functions}
226   \headdecl{stdio.h}
227   \funcdecl{FILE *fopen(const char *path, const char *mode)}
228   Apre il file specificato da \param{path}.
229   \funcdecl{FILE *fdopen(int fildes, const char *mode)}
230   Associa uno stream al file descriptor \param{fildes}.
231   \funcdecl{FILE *freopen(const char *path, const char *mode, FILE *stream)}
232   Apre il file specificato da \param{path} associandolo allo stream
233   specificato da \param{stream}, se questo è già aperto prima lo chiude.
234   
235   \bodydesc{Le funzioni ritornano un puntatore valido in caso di successo e
236     \val{NULL} in caso di errore, in tal caso \var{errno} assumerà il valore
237     ricevuto dalla funzione sottostante di cui è fallita l'esecuzione.
238   
239     Gli errori pertanto possono essere quelli di \func{malloc} per tutte
240     e tre le funzioni, quelli \func{open} per \func{fopen}, quelli di
241     \func{fcntl} per \func{fdopen} e quelli di \func{fopen},
242     \func{fclose} e \func{fflush} per \func{freopen}.}
243 \end{functions}
244
245 Normalmente la funzione che si usa per aprire uno stream è \func{fopen},
246 essa apre il file specificato nella modalità specificata da
247 \param{mode}, che è una stringa che deve iniziare con almeno uno dei
248 valori indicati in tab.~\ref{tab:file_fopen_mode} (sono possibili varie
249 estensioni che vedremo in seguito).
250
251 L'uso più comune di \func{freopen} è per redirigere uno dei tre file
252 standard (vedi sez.~\ref{sec:file_std_stream}): il file \param{path} viene
253 associato a \param{stream} e se questo è uno stream già aperto viene
254 preventivamente chiuso.
255
256 Infine \func{fdopen} viene usata per associare uno stream ad un file
257 descriptor esistente ottenuto tramite una altra funzione (ad esempio con una
258 \func{open}, una \func{dup}, o una \func{pipe}) e serve quando si vogliono
259 usare gli stream con file come le fifo o i socket, che non possono essere
260 aperti con le funzioni delle librerie standard del C.
261
262 \begin{table}[htb]
263   \centering
264   \footnotesize
265   \begin{tabular}[c]{|l|p{8cm}|}
266     \hline
267     \textbf{Valore} & \textbf{Significato}\\
268     \hline
269     \hline
270     \texttt{r} & Il file viene aperto, l'accesso viene posto in sola
271                  lettura, lo stream è posizionato all'inizio del file.\\
272     \texttt{r+}& Il file viene aperto, l'accesso viene posto in lettura e
273                  scrittura, lo stream è posizionato all'inizio del file. \\
274 %    \hline
275     \texttt{w} & Il file viene aperto e troncato a lunghezza nulla (o
276                  creato se non esiste), l'accesso viene posto in sola
277                  scrittura, lo  stream è posizionato all'inizio del file.\\
278     \texttt{w+}& Il file viene aperto e troncato a lunghezza nulla (o
279                  creato se non esiste), l'accesso viene posto in scrittura e
280                  lettura, lo stream è posizionato all'inizio del file.\\
281 %    \hline
282     \texttt{a} & Il file viene aperto (o creato se non esiste) in
283                  \itindex{append~mode} \textit{append mode}, l'accesso viene
284                  posto in sola scrittura.\\
285     \texttt{a+}& Il file viene aperto (o creato se non esiste) in
286                  \itindex{append~mode} \textit{append mode}, l'accesso viene
287                  posto in lettura e scrittura.\\
288     \hline
289     \texttt{b} & specifica che il file è binario, non ha alcun effetto. \\
290     \texttt{x} & l'apertura fallisce se il file esiste già. \\
291     \hline
292   \end{tabular}
293   \caption{Modalità di apertura di uno stream dello standard ANSI C che
294     sono sempre presenti in qualunque sistema POSIX.}
295   \label{tab:file_fopen_mode}
296 \end{table}
297
298 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
299 diversi per \param{mode}, ma in tab.~\ref{tab:file_fopen_mode} si sono
300 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
301 il carattere \texttt{b} (come ultimo carattere o nel mezzo agli altri per
302 le stringhe di due caratteri) che in altri sistemi operativi serve a
303 distinguere i file binari dai file di testo; in un sistema POSIX questa
304 distinzione non esiste e il valore viene accettato solo per
305 compatibilità, ma non ha alcun effetto.
306
307 Le \acr{glibc} supportano alcune estensioni, queste devono essere sempre
308 indicate dopo aver specificato il \param{mode} con uno dei valori di
309 tab.~\ref{tab:file_fopen_mode}. L'uso del carattere \texttt{x} serve per
310 evitare di sovrascrivere un file già esistente (è analoga all'uso
311 dell'opzione \const{O\_EXCL} in \func{open}), se il file specificato già
312 esiste e si aggiunge questo carattere a \param{mode} la \func{fopen}
313 fallisce. 
314
315 Un'altra estensione serve a supportare la localizzazione, quando si
316 aggiunge a \param{mode} una stringa della forma \verb|",ccs=STRING"| il
317 valore \verb|STRING| è considerato il nome di una codifica dei caratteri
318 e \func{fopen} marca il file per l'uso dei caratteri estesi e abilita le
319 opportune funzioni di conversione in lettura e scrittura.
320
321 Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono
322 essere compatibili con quelli con cui il file descriptor è stato aperto.
323 Inoltre i modi \cmd{w} e \cmd{w+} non troncano il file. La posizione nello
324 stream viene impostata a quella corrente nel file descriptor, e le variabili
325 di errore e di fine del file (vedi sez.~\ref{sec:file_io}) sono cancellate. Il
326 file non viene duplicato e verrà chiuso alla chiusura dello stream.
327
328 I nuovi file saranno creati secondo quanto visto in
329 sez.~\ref{sec:file_ownership_management} ed avranno i permessi di accesso
330 impostati al valore
331 \code{S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IWGRP|S\_IROTH|S\_IWOTH} (pari a
332 \val{0666}) modificato secondo il valore di \acr{umask} per il processo (si
333 veda sez.~\ref{sec:file_perm_management}).
334
335 In caso di file aperti in lettura e scrittura occorre ricordarsi che c'è
336 di mezzo una bufferizzazione; per questo motivo lo standard ANSI C
337 richiede che ci sia un'operazione di posizionamento fra un'operazione
338 di output ed una di input o viceversa (eccetto il caso in cui l'input ha
339 incontrato la fine del file), altrimenti una lettura può ritornare anche
340 il risultato di scritture precedenti l'ultima effettuata. 
341
342 Per questo motivo è una buona pratica (e talvolta necessario) far seguire ad
343 una scrittura una delle funzioni \func{fflush}, \func{fseek}, \func{fsetpos} o
344 \func{rewind} prima di eseguire una rilettura; viceversa nel caso in cui si
345 voglia fare una scrittura subito dopo aver eseguito una lettura occorre prima
346 usare una delle funzioni \func{fseek}, \func{fsetpos} o \func{rewind}. Anche
347 un'operazione nominalmente nulla come \code{fseek(file, 0, SEEK\_CUR)} è
348 sufficiente a garantire la sincronizzazione.
349
350 Una volta aperto lo stream, si può cambiare la modalità di bufferizzazione
351 (si veda sez.~\ref{sec:file_buffering_ctrl}) fintanto che non si è effettuato
352 alcuna operazione di I/O sul file.
353
354 Uno stream viene chiuso con la funzione \funcd{fclose} il cui prototipo è:
355 \begin{prototype}{stdio.h}{int fclose(FILE *stream)}
356   Chiude lo stream \param{stream}. 
357   
358   \bodydesc{Restituisce 0 in caso di successo e \val{EOF} in caso di errore,
359     nel qual caso imposta \var{errno} a \errval{EBADF} se il file descriptor
360     indicato da \param{stream} non è valido, o uno dei valori specificati
361     dalla sottostante funzione che è fallita (\func{close}, \func{write} o
362     \func{fflush}).}
363 \end{prototype}
364
365 La funzione effettua lo scarico di tutti i dati presenti nei buffer di uscita
366 e scarta tutti i dati in ingresso; se era stato allocato un buffer per lo
367 stream questo verrà rilasciato. La funzione effettua lo scarico solo per i
368 dati presenti nei buffer in user space usati dalle \acr{glibc}; se si vuole
369 essere sicuri che il kernel forzi la scrittura su disco occorrerà effettuare
370 una \func{sync} (vedi sez.~\ref{sec:file_sync}).
371
372 Linux supporta anche una altra funzione, \funcd{fcloseall}, come estensione
373 GNU implementata dalle \acr{glibc}, accessibile avendo definito
374 \macro{\_GNU\_SOURCE}, il suo prototipo è:
375 \begin{prototype}{stdio.h}{int fcloseall(void)}
376   Chiude tutti gli stream. 
377   
378   \bodydesc{Restituisce 0 se non ci sono errori ed \val{EOF} altrimenti.}
379 \end{prototype}
380 \noindent la funzione esegue lo scarico dei dati bufferizzati in uscita
381 e scarta quelli in ingresso, chiudendo tutti i file. Questa funzione è
382 provvista solo per i casi di emergenza, quando si è verificato un errore
383 ed il programma deve essere abortito, ma si vuole compiere qualche altra
384 operazione dopo aver chiuso i file e prima di uscire (si ricordi quanto
385 visto in sez.~\ref{sec:proc_exit}).
386
387
388 \subsection{Lettura e scrittura su uno stream}
389 \label{sec:file_io}
390
391 Una delle caratteristiche più utili dell'interfaccia degli stream è la
392 ricchezza delle funzioni disponibili per le operazioni di lettura e
393 scrittura sui file. Sono infatti previste ben tre diverse modalità
394 modalità di input/output non formattato:
395 \begin{enumerate*}
396 \item\textsl{binario} in cui legge/scrive un blocco di dati alla
397   volta, vedi sez.~\ref{sec:file_binary_io}.
398 \item\textsl{a caratteri} in cui si legge/scrive un carattere alla
399   volta (con la bufferizzazione gestita automaticamente dalla libreria),
400   vedi sez.~\ref{sec:file_char_io}.
401 \item\textsl{di linea} in cui si legge/scrive una linea alla volta (terminata
402   dal carattere di newline \verb|'\n'|), vedi sez.~\ref{sec:file_line_io}.
403 \end{enumerate*}
404 ed inoltre la modalità di input/output formattato.
405
406 A differenza dell'interfaccia dei file descriptor, con gli stream il
407 raggiungimento della fine del file è considerato un errore, e viene
408 notificato come tale dai valori di uscita delle varie funzioni. Nella
409 maggior parte dei casi questo avviene con la restituzione del valore
410 intero (di tipo \ctyp{int}) \val{EOF}\footnote{la costante deve essere
411   negativa, le \acr{glibc} usano -1, altre implementazioni possono avere
412   valori diversi.}  definito anch'esso nell'header \file{stdlib.h}.
413
414 Dato che le funzioni dell'interfaccia degli stream sono funzioni di libreria
415 che si appoggiano a delle system call, esse non impostano direttamente la
416 variabile \var{errno}, che mantiene il valore impostato dalla system call che
417 ha riportato l'errore.
418
419 Siccome la condizione di end-of-file è anch'essa segnalata come errore, nasce
420 il problema di come distinguerla da un errore effettivo; basarsi solo sul
421 valore di ritorno della funzione e controllare il valore di \var{errno}
422 infatti non basta, dato che quest'ultimo potrebbe essere stato impostato in
423 una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i dettagli del
424 funzionamento di \var{errno}).
425
426 Per questo motivo tutte le implementazioni delle librerie standard
427 mantengono per ogni stream almeno due flag all'interno dell'oggetto
428 \type{FILE}, il flag di \textit{end-of-file}, che segnala che si è
429 raggiunta la fine del file in lettura, e quello di errore, che segnala
430 la presenza di un qualche errore nelle operazioni di input/output;
431 questi due flag possono essere riletti dalle funzioni \funcd{feof} e
432 \funcd{ferror}, i cui prototipi sono:
433 \begin{functions}
434   \headdecl{stdio.h}
435   \funcdecl{int feof(FILE *stream)}
436   Controlla il flag di end-of-file di \param{stream}.
437   \funcdecl{int ferror(FILE *stream)}
438   Controlla il flag di errore di \param{stream}.
439   
440   \bodydesc{Entrambe le funzioni ritornano un valore diverso da zero se
441     i relativi flag sono impostati.}
442 \end{functions}
443 \noindent si tenga presente comunque che la lettura di questi flag segnala
444 soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una
445 qualunque operazione sullo stream, il controllo quindi deve essere effettuato
446 ogni volta che si chiama una funzione di libreria.
447
448 Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando
449 la funzione \funcd{clearerr}, il cui prototipo è:
450 \begin{prototype}{stdio.h}{void clearerr(FILE *stream)}
451   Cancella i flag di errore ed end-of-file di \param{stream}. 
452 \end{prototype}
453 \noindent in genere si usa questa funzione una volta che si sia identificata e
454 corretta la causa di un errore per evitare di mantenere i flag attivi, così da
455 poter rilevare una successiva ulteriore condizione di errore. Di questa
456 funzione esiste una analoga \func{clearerr\_unlocked} che non esegue il blocco
457 dello stream (vedi sez.~\ref{sec:file_stream_thread}).
458
459
460 \subsection{Input/output binario}
461 \label{sec:file_binary_io}
462
463 La prima modalità di input/output non formattato ricalca quella della
464 interfaccia dei file descriptor, e provvede semplicemente la scrittura e la
465 lettura dei dati da un buffer verso un file e viceversa. In generale questa è
466 la modalità che si usa quando si ha a che fare con dati non formattati. Le due
467 funzioni che si usano per l'I/O binario sono \funcd{fread} ed \funcd{fwrite};
468 i loro prototipi sono:
469 \begin{functions}
470   \headdecl{stdio.h} 
471   
472   \funcdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE
473     *stream)}
474   
475   \funcdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t
476     nmemb, FILE *stream)}
477   
478   Rispettivamente leggono e scrivono \param{nmemb} elementi di dimensione
479   \param{size} dal buffer \param{ptr} al file \param{stream}.
480   
481   \bodydesc{Entrambe le funzioni ritornano il numero di elementi letti o
482     scritti, in caso di errore o fine del file viene restituito un numero di
483     elementi inferiore al richiesto.}
484 \end{functions}
485
486 In genere si usano queste funzioni quando si devono trasferire su file
487 blocchi di dati binari in maniera compatta e veloce; un primo caso di uso
488 tipico è quello in cui si salva un vettore (o un certo numero dei suoi
489 elementi) con una chiamata del tipo:
490 \includecodesnip{listati/WriteVect.c}
491 in questo caso devono essere specificate le dimensioni di ciascun
492 elemento ed il numero di quelli che si vogliono scrivere. Un secondo
493 caso è invece quello in cui si vuole trasferire su file una struttura;
494 si avrà allora una chiamata tipo:
495 \includecodesnip{listati/WriteStruct.c}
496 in cui si specifica la dimensione dell'intera struttura ed un solo
497 elemento. 
498
499 In realtà quello che conta nel trasferimento dei dati sono le dimensioni
500 totali, che sono sempre pari al prodotto \code{size * nelem}; la sola
501 differenza è che le funzioni non ritornano il numero di byte scritti,
502 ma il numero di elementi.
503
504 La funzione \func{fread} legge sempre un numero intero di elementi, se
505 incontra la fine del file l'oggetto letto parzialmente viene scartato
506 (lo stesso avviene in caso di errore). In questo caso la posizione dello
507 stream viene impostata alla fine del file (e non a quella corrispondente
508 alla quantità di dati letti).
509
510 In caso di errore (o fine del file per \func{fread}) entrambe le
511 funzioni restituiscono il numero di oggetti effettivamente letti o
512 scritti, che sarà inferiore a quello richiesto. Contrariamente a quanto
513 avviene per i file descriptor, questo segnala una condizione di errore e
514 occorrerà usare \func{feof} e \func{ferror} per stabilire la natura del
515 problema.
516
517 Benché queste funzioni assicurino la massima efficienza per il
518 salvataggio dei dati, i dati memorizzati attraverso di esse presentano
519 lo svantaggio di dipendere strettamente dalla piattaforma di sviluppo
520 usata ed in genere possono essere riletti senza problemi solo dallo
521 stesso programma che li ha prodotti.
522
523 Infatti diversi compilatori possono eseguire ottimizzazioni diverse delle
524 strutture dati e alcuni compilatori (come il \cmd{gcc}) possono anche
525 scegliere se ottimizzare l'occupazione di spazio, impacchettando più
526 strettamente i dati, o la velocità inserendo opportuni \textit{padding} per
527 l'allineamento dei medesimi generando quindi output binari diversi. Inoltre
528 altre incompatibilità si possono presentare quando entrano in gioco differenze
529 di architettura hardware, come la dimensione del bus o la modalità di
530 ordinamento dei bit o il formato delle variabili in floating point.
531
532 Per questo motivo quando si usa l'input/output binario occorre sempre prendere
533 le opportune precauzioni (in genere usare un formato di più alto livello che
534 permetta di recuperare l'informazione completa), per assicurarsi che versioni
535 diverse del programma siano in grado di rileggere i dati tenendo conto delle
536 eventuali differenze.
537
538 Le \acr{glibc} definiscono altre due funzioni per l'I/O binario,
539 \funcd{fread\_unlocked} e \funcd{fwrite\_unlocked} che evitano il lock
540 implicito dello stream, usato per dalla librerie per la gestione delle
541 applicazioni multi-thread (si veda sez.~\ref{sec:file_stream_thread} per i
542 dettagli), i loro prototipi sono:
543 \begin{functions}
544   \headdecl{stdio.h}
545   
546   \funcdecl{size\_t fread\_unlocked(void *ptr, size\_t size, size\_t
547     nmemb, FILE *stream)}
548   
549   \funcdecl{size\_t fwrite\_unlocked(const void *ptr, size\_t size,
550     size\_t nmemb, FILE *stream)}
551   
552   \bodydesc{Le funzioni sono identiche alle analoghe \func{fread} e
553     \func{fwrite} ma non acquisiscono il lock implicito sullo stream.}
554 \end{functions}
555 \noindent entrambe le funzioni sono estensioni GNU previste solo dalle
556 \acr{glibc}.
557
558
559 \subsection{Input/output a caratteri}
560 \label{sec:file_char_io}
561
562 La seconda modalità di input/output è quella a caratteri, in cui si
563 trasferisce un carattere alla volta.  Le funzioni per la lettura a
564 caratteri sono tre, \funcd{fgetc}, \funcd{getc} e \funcd{getchar}, i
565 rispettivi prototipi sono:
566 \begin{functions}
567   \headdecl{stdio.h} 
568
569   \funcdecl{int getc(FILE *stream)} Legge un byte da \param{stream} e lo
570   restituisce come intero. In genere è implementata come una macro. 
571   
572   \funcdecl{int fgetc(FILE *stream)} Legge un byte da \param{stream} e lo
573   restituisce come intero. È sempre una funzione.
574   
575   \funcdecl{int getchar(void)} Equivalente a \code{getc(stdin)}.
576   
577   \bodydesc{Tutte queste funzioni leggono un byte alla volta, che viene
578     restituito come intero; in caso di errore o fine del file il valore
579     di ritorno è \val{EOF}.}
580 \end{functions}
581
582 A parte \func{getchar}, che si usa in genere per leggere un carattere da
583 tastiera, le altre due funzioni sono sostanzialmente equivalenti. La
584 differenza è che \func{getc} è ottimizzata al massimo e normalmente
585 viene implementata con una macro, per cui occorre stare attenti a cosa
586 le si passa come argomento, infatti \param{stream} può essere valutato
587 più volte nell'esecuzione, e non viene passato in copia con il
588 meccanismo visto in sez.~\ref{sec:proc_var_passing}; per questo motivo se
589 si passa un'espressione si possono avere effetti indesiderati.
590
591 Invece \func{fgetc} è assicurata essere sempre una funzione, per questo motivo
592 la sua esecuzione normalmente è più lenta per via dell'overhead della
593 chiamata, ma è altresì possibile ricavarne l'indirizzo, che può essere passato
594 come argomento ad un altra funzione (e non si hanno i problemi accennati in
595 precedenza nel tipo di argomento).
596
597 Le tre funzioni restituiscono tutte un \ctyp{unsigned char} convertito
598 ad \ctyp{int} (si usa \ctyp{unsigned char} in modo da evitare
599 l'espansione del segno). In questo modo il valore di ritorno è sempre
600 positivo, tranne in caso di errore o fine del file.
601
602 Nelle estensioni GNU che provvedono la localizzazione sono definite tre
603 funzioni equivalenti alle precedenti, \funcd{getwc}, \funcd{fgetwc} e
604 \funcd{getwchar}, che invece di un carattere di un byte restituiscono un
605 carattere in formato esteso (cioè di tipo \ctyp{wint\_t}), il loro prototipo
606 è:
607 \begin{functions}
608   \headdecl{stdio.h} 
609   \headdecl{wchar.h} 
610   
611   \funcdecl{wint\_t getwc(FILE *stream)} Legge un carattere esteso da
612   \param{stream}. In genere è implementata come una macro.
613   
614   \funcdecl{wint\_t fgetwc(FILE *stream)} Legge un carattere esteso da
615   \param{stream} È una sempre una funzione.
616   
617   \funcdecl{wint\_t getwchar(void)} Equivalente a \code{getwc(stdin)}.
618   
619   \bodydesc{Tutte queste funzioni leggono un carattere alla volta, in
620     caso di errore o fine del file il valore di ritorno è \const{WEOF}.}
621 \end{functions}
622
623 Per scrivere un carattere si possono usare tre funzioni, analoghe alle
624 precedenti usate per leggere: \funcd{putc}, \funcd{fputc} e \funcd{putchar}; i
625 loro prototipi sono:
626 \begin{functions}
627   \headdecl{stdio.h} 
628   
629   \funcdecl{int putc(int c, FILE *stream)} Scrive il carattere \param{c}
630   su \param{stream}. In genere è implementata come una macro.
631   
632   \funcdecl{int fputc(FILE *stream)} Scrive il carattere \param{c} su
633   \param{stream}. È una sempre una funzione.
634   
635   \funcdecl{int putchar(void)} Equivalente a \code{putc(stdin)}.
636   
637   \bodydesc{Le funzioni scrivono sempre un carattere alla volta, il cui
638     valore viene restituito in caso di successo; in caso di errore o
639     fine del file il valore di ritorno è \val{EOF}.}
640 \end{functions}
641
642 Tutte queste funzioni scrivono sempre un byte alla volta, anche se prendono
643 come argomento un \ctyp{int} (che pertanto deve essere ottenuto con un cast da
644 un \ctyp{unsigned char}). Anche il valore di ritorno è sempre un intero; in
645 caso di errore o fine del file il valore di ritorno è \val{EOF}.
646
647 Come nel caso dell'I/O binario con \func{fread} e \func{fwrite} le \acr{glibc}
648 provvedono come estensione, per ciascuna delle funzioni precedenti,
649 un'ulteriore funzione, il cui nome è ottenuto aggiungendo un
650 \code{\_unlocked}, che esegue esattamente le stesse operazioni, evitando però
651 il lock implicito dello stream.
652
653 Per compatibilità con SVID sono inoltre provviste anche due funzioni,
654 \funcd{getw} e \funcd{putw}, da usare per leggere e scrivere una \textit{word}
655 (cioè due byte in una volta); i loro prototipi sono:
656 \begin{functions}
657   \headdecl{stdio.h} 
658   
659   \funcdecl{int getw(FILE *stream)} Legge una parola da \param{stream}.
660   \funcdecl{int putw(int w, FILE *stream)} Scrive la parola \param{w} su
661   \param{stream}.
662   
663   \bodydesc{Le funzioni restituiscono la parola \param{w}, o \val{EOF}
664     in caso di errore o di fine del file.}
665 \end{functions}
666
667 Le funzioni leggono e scrivono una \textit{word} di due byte, usando comunque
668 una variabile di tipo \ctyp{int}; il loro uso è deprecato in favore dell'uso
669 di \func{fread} e \func{fwrite}, in quanto non è possibile distinguere il
670 valore -1 da una condizione di errore che restituisce \val{EOF}.
671
672 Uno degli usi più frequenti dell'input/output a caratteri è nei programmi di
673 \textit{parsing} in cui si analizza il testo; in questo contesto diventa utile
674 poter analizzare il carattere successivo da uno stream senza estrarlo
675 effettivamente (la tecnica è detta \textit{peeking ahead}) in modo che il
676 programma possa regolarsi avendo dato una \textsl{sbirciatina} a quello che
677 viene dopo.
678
679 Nel nostro caso questo tipo di comportamento può essere realizzato prima
680 leggendo il carattere, e poi rimandandolo indietro, cosicché ridiventi
681 disponibile per una lettura successiva; la funzione che inverte la
682 lettura si chiama \funcd{ungetc} ed il suo prototipo è:
683 \begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
684   Rimanda indietro il carattere \param{c}, con un cast a \ctyp{unsigned
685     char}, sullo stream \param{stream}.
686
687   \bodydesc{La funzione ritorna \param{c} in caso di successo e
688   \val{EOF} in caso di errore.}
689 \end{prototype}
690 \noindent benché lo standard ANSI C preveda che l'operazione possa
691 essere ripetuta per un numero arbitrario di caratteri, alle
692 implementazioni è richiesto di garantire solo un livello; questo è
693 quello che fa la \acr{glibc}, che richiede che avvenga un'altra
694 operazione fra due \func{ungetc} successive.
695
696 Non è necessario che il carattere che si manda indietro sia l'ultimo che
697 si è letto, e non è necessario neanche avere letto nessun carattere
698 prima di usare \func{ungetc}, ma di norma la funzione è intesa per
699 essere usata per rimandare indietro l'ultimo carattere letto.
700
701 Nel caso \param{c} sia un \val{EOF} la funzione non fa nulla, e
702 restituisce sempre \val{EOF}; così si può usare \func{ungetc} anche
703 con il risultato di una lettura alla fine del file.
704
705 Se si è alla fine del file si può comunque rimandare indietro un
706 carattere, il flag di end-of-file verrà automaticamente cancellato
707 perché c'è un nuovo carattere disponibile che potrà essere riletto
708 successivamente.
709
710 Infine si tenga presente che \func{ungetc} non altera il contenuto del
711 file, ma opera esclusivamente sul buffer interno. Se si esegue una
712 qualunque delle operazioni di riposizionamento (vedi
713 sez.~\ref{sec:file_fseek}) i caratteri rimandati indietro vengono
714 scartati.
715
716
717 \subsection{Input/output di linea}
718 \label{sec:file_line_io}
719
720 La terza ed ultima modalità di input/output non formattato è quella di linea,
721 in cui si legge o si scrive una riga alla volta; questa è una modalità molto
722 usata per l'I/O da terminale, ma è anche quella che presenta le
723 caratteristiche più controverse.
724
725 Le funzioni previste dallo standard ANSI C per leggere una linea sono
726 sostanzialmente due, \funcd{gets} e \funcd{fgets}, i cui rispettivi
727 prototipi sono:
728 \begin{functions}
729   \headdecl{stdio.h} 
730   
731   \funcdecl{char *gets(char *string)} Scrive su \param{string} una
732   linea letta da \var{stdin}.
733   
734   \funcdecl{char *fgets(char *string, int size, FILE *stream)}
735   Scrive su \param{string} la linea letta da \param{stream} per un
736   massimo di \param{size} byte.
737   
738   \bodydesc{Le funzioni restituiscono l'indirizzo \param{string} in caso
739     di successo o \val{NULL} in caso di errore.}
740 \end{functions}
741
742 Entrambe le funzioni effettuano la lettura (dal file specificato \func{fgets},
743 dallo standard input \func{gets}) di una linea di caratteri (terminata dal
744 carattere \textit{newline}, \verb|'\n'|, quello mappato sul tasto di ritorno a
745 capo della tastiera), ma \func{gets} sostituisce \verb|'\n'| con uno zero,
746 mentre \func{fgets} aggiunge uno zero dopo il \textit{newline}, che resta
747 dentro la stringa. Se la lettura incontra la fine del file (o c'è un errore)
748 viene restituito un \val{NULL}, ed il buffer \param{buf} non viene toccato.
749 L'uso di \func{gets} è deprecato e deve essere assolutamente evitato; la
750 funzione infatti non controlla il numero di byte letti, per cui nel caso la
751 stringa letta superi le dimensioni del buffer, si avrà un \textit{buffer
752   overflow}\itindex{buffer~overflow}, con sovrascrittura della memoria del
753 processo adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio
754   e con molta efficacia nell'ormai famoso articolo di Aleph1 \cite{StS}.}
755
756 Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non
757 autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare
758 una stringa sufficientemente lunga ed opportunamente forgiata per
759 sovrascrivere gli indirizzi di ritorno nello \itindex{stack} \textit{stack}
760 (supposto che la \func{gets} sia stata chiamata da una subroutine), in modo da
761 far ripartire l'esecuzione nel codice inviato nella stringa stessa (in genere
762 uno \textit{shell code} cioè una sezione di programma che lancia una shell).
763
764 La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto
765 prende in input la dimensione del buffer \param{size}, che non verrà mai
766 ecceduta in lettura. La funzione legge fino ad un massimo di \param{size}
767 caratteri (newline compreso), ed aggiunge uno zero di terminazione; questo
768 comporta che la stringa possa essere al massimo di \code{size-1} caratteri.  Se
769 la linea eccede la dimensione del buffer verranno letti solo \code{size-1}
770 caratteri, ma la stringa sarà sempre terminata correttamente con uno zero
771 finale; sarà possibile leggere i rimanenti caratteri in una chiamata
772 successiva.
773
774 Per la scrittura di una linea lo standard ANSI C prevede altre due
775 funzioni, \funcd{fputs} e \funcd{puts}, analoghe a quelle di lettura, i
776 rispettivi prototipi sono:
777 \begin{functions}
778   \headdecl{stdio.h} 
779   
780   \funcdecl{int puts(const char *string)} Scrive su \var{stdout} la
781   linea \param{string}.
782   
783   \funcdecl{int fputs(const char *string, FILE *stream)} Scrive su
784   \param{stream} la linea \param{string}.
785   
786   \bodydesc{Le funzioni restituiscono un valore non negativo in caso di
787     successo o \val{EOF} in caso di errore.}
788 \end{functions}
789
790 Dato che in questo caso si scrivono i dati in uscita \func{puts} non ha i
791 problemi di \func{gets} ed è in genere la forma più immediata per scrivere
792 messaggi sullo standard output; la funzione prende una stringa terminata da
793 uno zero ed aggiunge automaticamente il ritorno a capo. La differenza con
794 \func{fputs} (a parte la possibilità di specificare un file diverso da
795 \var{stdout}) è che quest'ultima non aggiunge il newline, che deve essere
796 previsto esplicitamente.
797
798 Come per le analoghe funzioni di input/output a caratteri, anche per l'I/O di
799 linea esistono delle estensioni per leggere e scrivere linee di caratteri
800 estesi, le funzioni in questione sono \funcd{fgetws} e \funcd{fputws} ed i
801 loro prototipi sono:
802 \begin{functions}
803   \headdecl{wchar.h} 
804   \funcdecl{wchar\_t *fgetws(wchar\_t *ws, int n, FILE *stream)}
805   Legge un massimo di \param{n} caratteri estesi dal file
806   \param{stream} al buffer \param{ws}.
807   
808   \funcdecl{int fputws(const wchar\_t *ws, FILE *stream)} Scrive la
809   linea \param{ws} di caratteri estesi sul file \param{stream}.
810   
811   \bodydesc{Le funzioni ritornano rispettivamente \param{ws} o un numero
812     non negativo in caso di successo e \val{NULL} o \val{EOF} in
813     caso di errore o fine del file.}
814 \end{functions}
815
816 Il comportamento di queste due funzioni è identico a quello di \func{fgets} e
817 \func{fputs}, a parte il fatto che tutto (numero di caratteri massimo,
818 terminatore della stringa, newline) è espresso in termini di caratteri estesi
819 anziché di normali caratteri ASCII.
820
821 Come per l'I/O binario e quello a caratteri, anche per l'I/O di linea le
822 \acr{glibc} supportano una serie di altre funzioni, estensioni di tutte quelle
823 illustrate finora (eccetto \func{gets} e \func{puts}), che eseguono
824 esattamente le stesse operazioni delle loro equivalenti, evitando però il lock
825 implicito dello stream (vedi sez.~\ref{sec:file_stream_thread}). Come per le
826 altre forma di I/O, dette funzioni hanno lo stesso nome della loro analoga
827 normale, con l'aggiunta dell'estensione \code{\_unlocked}.
828
829 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
830 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
831 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può
832 comunque dare risultati ambigui se l'input contiene degli zeri; questi
833 infatti saranno scritti sul buffer di uscita e la stringa in output
834 apparirà come più corta dei byte effettivamente letti. Questa è una
835 condizione che è sempre possibile controllare (deve essere presente un
836 newline prima della effettiva conclusione della stringa presente nel
837 buffer), ma a costo di una complicazione ulteriore della logica del
838 programma. Lo stesso dicasi quando si deve gestire il caso di stringa
839 che eccede le dimensioni del buffer.
840
841 Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due nuove
842 funzioni per la gestione dell'input/output di linea, il cui uso permette di
843 risolvere questi problemi. L'uso di queste funzioni deve essere attivato
844 definendo la macro \macro{\_GNU\_SOURCE} prima di includere \file{stdio.h}. La
845 prima delle due, \funcd{getline}, serve per leggere una linea terminata da un
846 newline, esattamente allo stesso modo di \func{fgets}, il suo prototipo è:
847 \begin{prototype}{stdio.h}
848   {ssize\_t getline(char **buffer, size\_t *n, FILE *stream)} Legge una linea
849   dal file \param{stream} copiandola sul buffer indicato da \param{buffer}
850   riallocandolo se necessario (l'indirizzo del buffer e la sua dimensione
851   vengono sempre riscritte).
852
853   \bodydesc{La funzione ritorna il numero di caratteri letti in caso di
854   successo e -1 in caso di errore o di raggiungimento della fine del
855   file.}
856 \end{prototype}
857
858 La funzione permette di eseguire una lettura senza doversi preoccupare della
859 eventuale lunghezza eccessiva della stringa da leggere. Essa prende come primo
860 argomento l'indirizzo del puntatore al buffer su cui si vuole copiare la
861 linea. Quest'ultimo \emph{deve} essere stato allocato in precedenza con una
862 \func{malloc} (non si può passare l'indirizzo di un puntatore ad una variabile
863 locale); come secondo argomento la funzione vuole l'indirizzo della variabile
864 contenente le dimensioni del buffer suddetto.
865
866 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
867 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
868 dimensione ed il nuovo puntatore vengono restituiti indietro (si noti infatti
869 come per entrambi gli argomenti si siano usati dei
870 \itindex{value~result~argument}\textit{value result argument}, passando dei
871 puntatori anziché i valori delle variabili, secondo la tecnica spiegata in
872 sez.~\ref{sec:proc_var_passing}).
873
874 Se si passa alla funzione l'indirizzo di un puntatore impostato a \val{NULL} e
875 \var{*n} è zero, la funzione provvede da sola all'allocazione della memoria
876 necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un
877 puntatore all'inizio del testo della linea letta. Un esempio di codice può
878 essere il seguente: 
879 \includecodesnip{listati/getline.c} 
880 e per evitare \textit{memory leak}\itindex{memory~leak} occorre ricordarsi di
881 liberare \var{ptr} con una \func{free}.
882
883 Il valore di ritorno della funzione indica il numero di caratteri letti
884 dallo stream (quindi compreso il newline, ma non lo zero di
885 terminazione); questo permette anche di distinguere eventuali zeri letti
886 dallo stream da quello inserito dalla funzione per terminare la linea.
887 Se si è alla fine del file e non si è potuto leggere nulla o c'è stato
888 un errore la funzione restituisce -1.
889
890 La seconda estensione GNU è una generalizzazione di \func{getline} per
891 poter usare come separatore un carattere qualsiasi, la funzione si
892 chiama \funcd{getdelim} ed il suo prototipo è:
893 \begin{prototype}{stdio.h}
894 {ssize\_t getdelim(char **buffer, size\_t *n, int delim, FILE *stream)} 
895   Identica a \func{getline} solo che usa \param{delim} al posto del
896   carattere di newline come separatore di linea.
897 \end{prototype}
898
899 Il comportamento di \func{getdelim} è identico a quello di \func{getline} (che
900 può essere implementata da questa passando \verb|'\n'| come valore di
901 \param{delim}).
902
903
904 \subsection{L'input/output formattato}
905 \label{sec:file_formatted_io}
906
907 L'ultima modalità di input/output è quella formattata, che è una delle
908 caratteristiche più utilizzate delle librerie standard del C; in genere questa
909 è la modalità in cui si esegue normalmente l'output su terminale poiché
910 permette di stampare in maniera facile e veloce dati, tabelle e messaggi.
911
912 L'output formattato viene eseguito con una delle 13 funzioni della famiglia
913 \func{printf}; le tre più usate sono \funcd{printf}, \funcd{fprintf} e
914 \funcd{sprintf}, i cui prototipi sono:
915 \begin{functions}
916   \headdecl{stdio.h} 
917   \funcdecl{int printf(const char *format, ...)} Stampa su \file{stdout}
918   gli argomenti, secondo il formato specificato da \param{format}.
919   
920   \funcdecl{int fprintf(FILE *stream, const char *format, ...)}  Stampa
921   su \param{stream} gli argomenti, secondo il formato specificato da
922   \param{format}.
923   
924   \funcdecl{int sprintf(char *str, const char *format, ...)} Stampa
925   sulla stringa \param{str} gli argomenti, secondo il formato
926   specificato da \param{format}.
927
928   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
929 \end{functions}
930 \noindent le prime due servono per stampare su file (lo standard output o
931 quello specificato) la terza permette di stampare su una stringa, in genere
932 l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se non si ha la
933 sicurezza assoluta sulle dimensioni del risultato della stampa, eccedere le
934 dimensioni di \param{str}, con conseguente sovrascrittura di altre variabili e
935 possibili \textit{buffer overflow}\itindex{buffer~overflow}; per questo motivo
936 si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo è:
937 \begin{prototype}{stdio.h}
938 {snprintf(char *str, size\_t size, const char *format, ...)} 
939   Identica a \func{sprintf}, ma non scrive su \param{str} più di
940   \param{size} caratteri.
941 \end{prototype}
942
943 La parte più complessa delle funzioni di scrittura formattata è il formato
944 della stringa \param{format} che indica le conversioni da fare, e da cui
945 deriva anche il numero degli argomenti che dovranno essere passati a seguire
946 (si noti come tutte queste funzioni siano \textit{variadic}\index{variadic},
947 prendendo un numero di argomenti variabile che dipende appunto da quello che
948 si è specificato in \param{format}).
949
950 \begin{table}[htb]
951   \centering
952   \footnotesize
953   \begin{tabular}[c]{|l|l|p{10cm}|}
954     \hline
955     \textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
956     \hline
957     \hline
958    \cmd{\%d} &\ctyp{int}         & Stampa un numero intero in formato decimale
959                                    con segno \\
960    \cmd{\%i} &\ctyp{int}         & Identico a \cmd{\%i} in output, \\
961    \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale\\
962    \cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato
963                                    decimale senza segno \\
964    \cmd{\%x}, 
965    \cmd{\%X} &\ctyp{unsigned int}& Stampano un intero in formato esadecimale,
966                                    rispettivamente con lettere minuscole e
967                                    maiuscole. \\
968    \cmd{\%f} &\ctyp{double}      & Stampa un numero in virgola mobile con la
969                                    notazione a virgola fissa \\
970    \cmd{\%e}, 
971    \cmd{\%E} &\ctyp{double} & Stampano un numero in virgola mobile con la
972                               notazione esponenziale, rispettivamente con
973                               lettere minuscole e maiuscole. \\
974    \cmd{\%g}, 
975    \cmd{\%G} &\ctyp{double} & Stampano un numero in virgola mobile con la
976                               notazione più appropriate delle due precedenti,
977                               rispettivamente con lettere minuscole e
978                               maiuscole. \\
979    \cmd{\%a}, 
980    \cmd{\%A} &\ctyp{double} & Stampano un numero in virgola mobile in
981                               notazione esadecimale frazionaria\\
982    \cmd{\%c} &\ctyp{int}    & Stampa un carattere singolo\\
983    \cmd{\%s} &\ctyp{char *} & Stampa una stringa \\
984    \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore\\
985    \cmd{\%n} &\ctyp{\&int}  & Prende il numero di caratteri stampati finora\\
986    \cmd{\%\%}&              & Stampa un \% \\
987     \hline
988   \end{tabular}
989   \caption{Valori possibili per gli specificatori di conversione in una
990     stringa di formato di \func{printf}.} 
991   \label{tab:file_format_spec}
992 \end{table}
993
994 La stringa è costituita da caratteri normali (tutti eccetto \texttt{\%}), che
995 vengono passati invariati all'output, e da direttive di conversione, in cui
996 devono essere sempre presenti il carattere \texttt{\%}, che introduce la
997 direttiva, ed uno degli specificatori di conversione (riportati in
998 tab.~\ref{tab:file_format_spec}) che la conclude.
999
1000 \begin{table}[htb]
1001   \centering
1002   \footnotesize
1003   \begin{tabular}[c]{|l|p{10cm}|}
1004     \hline
1005     \textbf{Valore} & \textbf{Significato}\\
1006     \hline
1007     \hline
1008     \val{\#} & Chiede la conversione in forma alternativa. \\
1009     \val{0}  & La conversione è riempita con zeri alla sinistra del valore.\\
1010     \val{-}  & La conversione viene allineata a sinistra sul bordo del campo.\\
1011     \val{' '}& Mette uno spazio prima di un numero con segno di valore 
1012                positivo\\
1013     \val{+}  & Mette sempre il segno ($+$ o $-$) prima di un numero.\\
1014     \hline
1015   \end{tabular}
1016   \caption{I valori dei flag per il formato di \func{printf}}
1017   \label{tab:file_format_flag}
1018 \end{table}
1019
1020 Il formato di una direttiva di conversione prevede una serie di possibili
1021 elementi opzionali oltre al \cmd{\%} e allo specificatore di conversione. In
1022 generale essa è sempre del tipo:
1023 \begin{center}
1024 \begin{verbatim}
1025 % [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
1026 \end{verbatim}
1027 \end{center}
1028 in cui tutti i valori tranne il \val{\%} e lo specificatore di conversione
1029 sono opzionali (e per questo sono indicati fra parentesi quadre); si possono
1030 usare più elementi opzionali, nel qual caso devono essere specificati in
1031 questo ordine:
1032 \begin{itemize*}
1033 \item uno specificatore del parametro da usare (terminato da un \val{\$}),
1034 \item uno o più flag (i cui valori possibili sono riassunti in
1035   tab.~\ref{tab:file_format_flag}) che controllano il formato di stampa della
1036   conversione,
1037 \item uno specificatore di larghezza (un numero decimale), eventualmente
1038   seguito (per i numeri in virgola mobile) da un specificatore di precisione
1039   (un altro numero decimale),
1040 \item uno specificatore del tipo di dato, che ne indica la dimensione (i cui
1041   valori possibili sono riassunti in tab.~\ref{tab:file_format_type}).
1042 \end{itemize*}
1043
1044
1045 Dettagli ulteriori sulle varie opzioni possono essere trovati nella pagina di
1046 manuale di \func{printf} e nella documentazione delle \acr{glibc}.
1047
1048 \begin{table}[htb]
1049   \centering
1050   \footnotesize
1051   \begin{tabular}[c]{|l|p{10cm}|}
1052     \hline
1053     \textbf{Valore} & \textbf{Significato} \\
1054     \hline
1055     \hline
1056     \cmd{hh} & una conversione intera corrisponde a un \ctyp{char} con o senza
1057                segno, o il puntatore per il numero dei parametri \cmd{n} è di 
1058                tipo \ctyp{char}.\\
1059     \cmd{h}  & una conversione intera corrisponde a uno \ctyp{short} con o 
1060                senza segno, o il puntatore per il numero dei parametri \cmd{n}
1061                è di tipo \ctyp{short}.\\
1062     \cmd{l}  & una conversione intera corrisponde a un \ctyp{long} con o 
1063                senza segno, o il puntatore per il numero dei parametri \cmd{n}
1064                è di tipo \ctyp{long}, o il carattere o la stringa seguenti
1065                sono in formato esteso.\\ 
1066     \cmd{ll} & una conversione intera corrisponde a un \ctyp{long long} con o 
1067                senza segno, o il puntatore per il numero dei parametri \cmd{n}
1068                è di tipo \ctyp{long long}.\\
1069     \cmd{L}  & una conversione in virgola mobile corrisponde a un
1070                \ctyp{double}.\\
1071     \cmd{q}  & sinonimo di \cmd{ll}.\\
1072     \cmd{j}  & una conversione intera corrisponde a un \type{intmax\_t} o 
1073                \type{uintmax\_t}.\\
1074     \cmd{z}  & una conversione intera corrisponde a un \type{size\_t} o 
1075                \type{ssize\_t}.\\
1076     \cmd{t}  & una conversione intera corrisponde a un \type{ptrdiff\_t}.\\
1077     \hline
1078   \end{tabular}
1079   \caption{Il modificatore di tipo di dato per il formato di \func{printf}}
1080   \label{tab:file_format_type}
1081 \end{table}
1082
1083 Una versione alternativa delle funzioni di output formattato, che permettono
1084 di usare il puntatore ad una lista di argomenti (vedi
1085 sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf}, \funcd{vfprintf} e
1086 \funcd{vsprintf}, i cui prototipi sono:
1087 \begin{functions}
1088   \headdecl{stdio.h} 
1089   
1090   \funcdecl{int vprintf(const char *format, va\_list ap)} Stampa su
1091   \var{stdout} gli argomenti della lista \param{ap}, secondo il formato
1092   specificato da \param{format}.
1093   
1094   \funcdecl{int vfprintf(FILE *stream, const char *format, va\_list ap)}
1095   Stampa su \param{stream} gli argomenti della lista \param{ap}, secondo il
1096   formato specificato da \param{format}.
1097   
1098   \funcdecl{int vsprintf(char *str, const char *format, va\_list ap)} Stampa
1099   sulla stringa \param{str} gli argomenti della lista \param{ap}, secondo il
1100   formato specificato da \param{format}.
1101
1102   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
1103 \end{functions}
1104 \noindent con queste funzioni diventa possibile selezionare gli argomenti che
1105 si vogliono passare ad una funzione di stampa, passando direttamente la lista
1106 tramite l'argomento \param{ap}. Per poter far questo ovviamente la lista degli
1107 argomenti dovrà essere opportunamente trattata (l'argomento è esaminato in
1108 sez.~\ref{sec:proc_variadic}), e dopo l'esecuzione della funzione l'argomento
1109 \param{ap} non sarà più utilizzabile (in generale dovrebbe essere eseguito un
1110 \code{va\_end(ap)} ma in Linux questo non è necessario). 
1111
1112 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
1113 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
1114 scritti sulla stringa di destinazione:
1115 \begin{prototype}{stdio.h}
1116 {vsnprintf(char *str, size\_t size, const char *format, va\_list ap)} 
1117   Identica a \func{vsprintf}, ma non scrive su \param{str} più di
1118   \param{size} caratteri.
1119 \end{prototype}
1120 \noindent in modo da evitare possibili buffer
1121 overflow\itindex{buffer~overflow}.
1122
1123
1124 Per eliminare alla radice questi problemi, le \acr{glibc} supportano una
1125 specifica estensione GNU che alloca dinamicamente tutto lo spazio necessario;
1126 l'estensione si attiva al solito definendo \macro{\_GNU\_SOURCE}, le due
1127 funzioni sono \funcd{asprintf} e \funcd{vasprintf}, ed i rispettivi prototipi
1128 sono:
1129 \begin{functions}
1130   \headdecl{stdio.h} 
1131     
1132   \funcdecl{int asprintf(char **strptr, const char *format, ...)}  Stampa gli
1133   argomenti specificati secondo il formato specificato da \param{format} su
1134   una stringa allocata automaticamente all'indirizzo \param{*strptr}.
1135   
1136   \funcdecl{int vasprintf(char **strptr, const char *format, va\_list ap)}
1137   Stampa gli argomenti della lista \param{ap} secondo il formato specificato
1138   da \param{format} su una stringa allocata automaticamente all'indirizzo
1139   \param{*strptr}.
1140
1141   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
1142 \end{functions}
1143
1144 Entrambe le funzioni prendono come argomento \param{strptr} che deve essere
1145 l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà
1146 restituito (si ricordi quanto detto in sez.~\ref{sec:proc_var_passing} a
1147 proposito dei \itindex{value~result~argument}\textit{value result argument})
1148 l'indirizzo della stringa allocata automaticamente dalle funzioni. Occorre
1149 inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando
1150 la stringa non serve più, onde evitare \textit{memory
1151   leak}\itindex{memory~leak}.
1152
1153 Infine una ulteriore estensione GNU definisce le due funzioni \func{dprintf} e
1154 \func{vdprintf}, che prendono un file descriptor al posto dello stream. Altre
1155 estensioni permettono di scrivere con caratteri estesi. Anche queste funzioni,
1156 il cui nome è generato dalle precedenti funzioni aggiungendo una \texttt{w}
1157 davanti a \texttt{print}, sono trattate in dettaglio nella documentazione delle
1158 \acr{glibc}.
1159
1160 In corrispondenza alla famiglia di funzioni \func{printf} che si usano per
1161 l'output formattato, l'input formattato viene eseguito con le funzioni della
1162 famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf},
1163 \funcd{fscanf} e \funcd{sscanf}, i cui prototipi sono:
1164 \begin{functions}
1165   \headdecl{stdio.h} \funcdecl{int scanf(const char *format, ...)} Esegue una
1166   scansione di \file{stdin} cercando una corrispondenza di quanto letto con il
1167   formato dei dati specificato da \param{format}, ed effettua le relative
1168   conversione memorizzando il risultato negli argomenti seguenti.
1169   
1170   \funcdecl{int fscanf(FILE *stream, const char *format, ...)}  Analoga alla
1171   precedente, ma effettua la scansione su \param{stream}.
1172   
1173   \funcdecl{int sscanf(char *str, const char *format, ...)} Analoga alle
1174   precedenti, ma effettua la scansione dalla stringa \param{str}.
1175   
1176   \bodydesc{Le funzioni ritornano il numero di elementi assegnati. Questi
1177     possono essere in numero inferiore a quelli specificati, ed anche zero.
1178     Quest'ultimo valore significa che non si è trovata corrispondenza. In caso
1179     di errore o fine del file viene invece restituito \val{EOF}.}
1180 \end{functions}
1181 \noindent e come per le analoghe funzioni di scrittura esistono le relative
1182 \func{vscanf}, \func{vfscanf} \func{vsscanf} che usano un puntatore ad una
1183 lista di argomenti.
1184
1185 Tutte le funzioni della famiglia delle \func{scanf} vogliono come argomenti i
1186 puntatori alle variabili che dovranno contenere le conversioni; questo è un
1187 primo elemento di disagio in quanto è molto facile dimenticarsi di questa
1188 caratteristica.
1189
1190 Le funzioni leggono i caratteri dallo stream (o dalla stringa) di input ed
1191 eseguono un confronto con quanto indicato in \param{format}, la sintassi di
1192 questo argomento è simile a quella usata per l'analogo di \func{printf}, ma ci
1193 sono varie differenze.  Le funzioni di input infatti sono più orientate verso
1194 la lettura di testo libero che verso un input formattato in campi fissi. Uno
1195 spazio in \param{format} corrisponde con un numero qualunque di caratteri di
1196 separazione (che possono essere spazi, tabulatori, virgole ecc.), mentre
1197 caratteri diversi richiedono una corrispondenza esatta. Le direttive di
1198 conversione sono analoghe a quelle di \func{printf} e si trovano descritte in
1199 dettaglio nelle pagine di manuale e nel manuale delle \acr{glibc}.
1200
1201 Le funzioni eseguono la lettura dall'input, scartano i separatori (e gli
1202 eventuali caratteri diversi indicati dalla stringa di formato) effettuando le
1203 conversioni richieste; in caso la corrispondenza fallisca (o la funzione non
1204 sia in grado di effettuare una delle conversioni richieste) la scansione viene
1205 interrotta immediatamente e la funzione ritorna lasciando posizionato lo
1206 stream al primo carattere che non corrisponde.
1207
1208 Data la notevole complessità di uso di queste funzioni, che richiedono molta
1209 cura nella definizione delle corrette stringhe di formato e sono facilmente
1210 soggette ad errori, e considerato anche il fatto che è estremamente macchinoso
1211 recuperare in caso di fallimento nelle corrispondenze, l'input formattato non
1212 è molto usato. In genere infatti quando si ha a che fare con un input
1213 relativamente semplice si preferisce usare l'input di linea ed effettuare
1214 scansione e conversione di quanto serve direttamente con una delle funzioni di
1215 conversione delle stringhe; se invece il formato è più complesso diventa più
1216 facile utilizzare uno strumento come \cmd{flex}\footnote{il programma
1217   \cmd{flex}, è una implementazione libera di \cmd{lex} un generatore di
1218   analizzatori lessicali. Per i dettagli si può fare riferimento al manuale
1219   \cite{flex}.} per generare un analizzatore lessicale o il
1220 \cmd{bison}\footnote{il programma \cmd{bison} è un clone del generatore di
1221   parser \cmd{yacc}, maggiori dettagli possono essere trovati nel relativo
1222   manuale \cite{bison}.} per generare un parser.
1223
1224
1225 \subsection{Posizionamento su uno stream}
1226 \label{sec:file_fseek}
1227
1228 Come per i file descriptor anche per gli stream è possibile spostarsi
1229 all'interno di un file per effettuare operazioni di lettura o scrittura in un
1230 punto prestabilito; sempre che l'operazione di riposizionamento sia supportata
1231 dal file sottostante lo stream, quando cioè si ha a che fare con quello che
1232 viene detto un file ad \textsl{accesso casuale}.\footnote{dato che in un
1233   sistema Unix esistono vari tipi di file, come le fifo ed i file di
1234   dispositivo\index{file!di~dispositivo}, non è scontato che questo sia sempre
1235   vero.}
1236
1237 In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel file è
1238 espressa da un intero positivo, rappresentato dal tipo \type{off\_t}, il
1239 problema è che alcune delle funzioni usate per il riposizionamento sugli
1240 stream originano dalle prime versioni di Unix, in cui questo tipo non era
1241 ancora stato definito, e che in altri sistemi non è detto che la posizione su
1242 un file venga sempre rappresentata con il numero di caratteri dall'inizio (ad
1243 esempio in VMS può essere rappresentata come numero di record, più l'offset
1244 rispetto al record corrente).
1245
1246 Tutto questo comporta la presenza di diverse funzioni che eseguono
1247 sostanzialmente le stesse operazioni, ma usano argomenti di tipo diverso. Le
1248 funzioni tradizionali usate per il riposizionamento della posizione in uno
1249 stream sono \funcd{fseek} e \funcd{rewind} i cui prototipi sono:
1250 \begin{functions}
1251   \headdecl{stdio.h} 
1252   
1253   \funcdecl{int fseek(FILE *stream, long offset, int whence)} Sposta la
1254   posizione nello stream secondo quanto specificato tramite \param{offset}
1255   e \param{whence}.  
1256
1257   \funcdecl{void rewind(FILE *stream)} Riporta la posizione nello stream
1258   all'inizio del file.
1259 \end{functions}
1260
1261 L'uso di \func{fseek} è del tutto analogo a quello di \func{lseek} per i file
1262 descriptor, e gli argomenti, a parte il tipo, hanno lo stesso significato; in
1263 particolare \param{whence} assume gli stessi valori già visti in
1264 sez.~\ref{sec:file_lseek}.  La funzione restituisce 0 in caso di successo e -1
1265 in caso di errore.  La funzione \func{rewind} riporta semplicemente la
1266 posizione corrente all'inizio dello stream, ma non esattamente equivalente ad
1267 una \code{fseek(stream, 0L, SEEK\_SET)} in quanto vengono cancellati anche i
1268 flag di errore e fine del file.
1269
1270 Per ottenere la posizione corrente si usa invece la funzione \funcd{ftell}, il
1271 cui prototipo è:
1272 \begin{prototype}{stdio.h}{long ftell(FILE *stream)} 
1273   Legge la posizione attuale nello stream \param{stream}.
1274   
1275   \bodydesc{La funzione restituisce la posizione corrente, o -1 in caso
1276     di fallimento, che può esser dovuto sia al fatto che il file non
1277     supporta il riposizionamento che al fatto che la posizione non può
1278     essere espressa con un \ctyp{long int}}
1279 \end{prototype}
1280 \noindent la funzione restituisce la posizione come numero di byte
1281 dall'inizio dello stream. 
1282
1283 Queste funzioni esprimono tutte la posizione nel file come un \ctyp{long int}.
1284 Dato che (ad esempio quando si usa un filesystem indicizzato a 64 bit) questo
1285 può non essere possibile lo standard POSIX ha introdotto le nuove funzioni
1286 \funcd{fgetpos} e \funcd{fsetpos}, che invece usano il nuovo tipo
1287 \type{fpos\_t}, ed i cui prototipi sono:
1288 \begin{functions}
1289   \headdecl{stdio.h} 
1290   
1291   \funcdecl{int fsetpos(FILE *stream, fpos\_t *pos)} Imposta la posizione
1292   corrente nello stream \param{stream} al valore specificato da \param{pos}.
1293   
1294   \funcdecl{int fgetpos(FILE *stream, fpos\_t *pos)} Legge la posizione
1295   corrente nello stream \param{stream} e la scrive in \param{pos}.
1296   
1297   \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
1298     errore.}
1299 \end{functions}
1300
1301 In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni
1302 \func{fseeko} e \func{ftello}, che sono assolutamente identiche alle
1303 precedenti \func{fseek} e \func{ftell} ma hanno argomenti di tipo
1304 \type{off\_t} anziché di tipo \ctyp{long int}.
1305
1306
1307
1308 \section{Funzioni avanzate}
1309 \label{sec:file_stream_adv_func}
1310
1311 In questa sezione esamineremo alcune funzioni avanzate che permettono di
1312 eseguire operazioni particolari sugli stream, come leggerne gli attributi,
1313 controllarne le modalità di bufferizzazione, gestire direttamente i lock
1314 impliciti per la programmazione multi thread.
1315
1316
1317 \subsection{Le funzioni di controllo}
1318 \label{sec:file_stream_cntrl}
1319
1320 Al contrario di quanto avviene con i file descriptor, le librerie standard del
1321 C non prevedono nessuna funzione come la \func{fcntl} per il controllo degli
1322 attributi dei file. Però, dato che ogni stream si appoggia ad un file
1323 descriptor, si può usare la funzione \funcd{fileno} per ottenere quest'ultimo,
1324 il prototipo della funzione è:
1325 \begin{prototype}{stdio.h}{int fileno(FILE *stream)}
1326   Legge il file descriptor sottostante lo stream \param{stream}.
1327   
1328   \bodydesc{Restituisce il numero del file descriptor in caso di successo, e
1329     -1 qualora \param{stream} non sia valido, nel qual caso imposta
1330     \var{errno} a \errval{EBADF}.}
1331 \end{prototype}
1332 \noindent ed in questo modo diventa possibile usare direttamente \func{fcntl}.
1333
1334 Questo permette di accedere agli attributi del file descriptor sottostante lo
1335 stream, ma non ci dà nessuna informazione riguardo alle proprietà dello stream
1336 medesimo.  Le \acr{glibc} però supportano alcune estensioni derivate da
1337 Solaris, che permettono di ottenere informazioni utili.
1338
1339 Ad esempio in certi casi può essere necessario sapere se un certo stream è
1340 accessibile in lettura o scrittura. In genere questa informazione non è
1341 disponibile, e si deve ricordare come il file è stato aperto. La cosa può
1342 essere complessa se le operazioni vengono effettuate in una subroutine, che a
1343 questo punto necessiterà di informazioni aggiuntive rispetto al semplice
1344 puntatore allo stream; questo può essere evitato con le due funzioni
1345 \funcd{\_\_freadable} e \funcd{\_\_fwritable} i cui prototipi sono:
1346 \begin{functions}
1347   \headdecl{stdio\_ext.h}
1348   \funcdecl{int \_\_freadable(FILE *stream)}
1349   Restituisce un valore diverso da zero se \param{stream} consente la lettura.
1350
1351   \funcdecl{int \_\_fwritable(FILE *stream)}  
1352   Restituisce un valore diverso da zero se \param{stream} consente la
1353   scrittura.
1354 \end{functions}
1355 \noindent che permettono di ottenere questa informazione.
1356
1357 La conoscenza dell'ultima operazione effettuata su uno stream aperto è utile
1358 in quanto permette di trarre conclusioni sullo stato del buffer e del suo
1359 contenuto. Altre due funzioni, \funcd{\_\_freading} e \funcd{\_\_fwriting}
1360 servono a tale scopo, il loro prototipo è:
1361 \begin{functions}
1362   \headdecl{stdio\_ext.h}
1363   \funcdecl{int \_\_freading(FILE *stream)}
1364   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
1365   lettura o se l'ultima operazione è stata di lettura.
1366
1367   \funcdecl{int \_\_fwriting(FILE *stream)}  
1368   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
1369   scrittura o se l'ultima operazione è stata di scrittura.
1370 \end{functions}
1371
1372 Le due funzioni permettono di determinare di che tipo è stata l'ultima
1373 operazione eseguita su uno stream aperto in lettura/scrittura; ovviamente se
1374 uno stream è aperto in sola lettura (o sola scrittura) la modalità dell'ultima
1375 operazione è sempre determinata; l'unica ambiguità è quando non sono state
1376 ancora eseguite operazioni, in questo caso le funzioni rispondono come se una
1377 operazione ci fosse comunque stata.
1378
1379
1380 \subsection{Il controllo della bufferizzazione}
1381 \label{sec:file_buffering_ctrl}
1382
1383 Come accennato in sez.~\ref{sec:file_buffering} le librerie definiscono una
1384 serie di funzioni che permettono di controllare il comportamento degli stream;
1385 se non si è specificato nulla, la modalità di buffering viene decisa
1386 autonomamente sulla base del tipo di file sottostante, ed i buffer vengono
1387 allocati automaticamente.
1388
1389 Però una volta che si sia aperto lo stream (ma prima di aver compiuto
1390 operazioni su di esso) è possibile intervenire sulle modalità di buffering; la
1391 funzione che permette di controllare la bufferizzazione è \funcd{setvbuf}, il
1392 suo prototipo è:
1393 \begin{prototype}{stdio.h}{int setvbuf(FILE *stream, char *buf, int mode, 
1394     size\_t size)}
1395   
1396   Imposta la bufferizzazione dello stream \param{stream} nella modalità
1397   indicata da \param{mode}, usando \param{buf} come buffer di lunghezza
1398   \param{size}.
1399   
1400   \bodydesc{Restituisce zero in caso di successo, ed un valore qualunque in
1401     caso di errore, nel qual caso \var{errno} viene impostata opportunamente.}
1402 \end{prototype}
1403
1404 La funzione permette di controllare tutti gli aspetti della bufferizzazione;
1405 l'utente può specificare un buffer da usare al posto di quello allocato dal
1406 sistema passandone alla funzione l'indirizzo in \param{buf} e la dimensione in
1407 \param{size}. 
1408
1409 Ovviamente se si usa un buffer specificato dall'utente questo deve essere
1410 stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo
1411 stream. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la
1412 chiusura del file; ma fintanto che il file è usato all'interno di una
1413 funzione, può anche essere usata una variabile automatica. In \file{stdio.h} è
1414 definita la macro \const{BUFSIZ}, che indica le dimensioni generiche del
1415 buffer di uno stream; queste vengono usate dalla funzione \func{setbuf}.  Non
1416 è detto però che tale dimensione corrisponda sempre al valore ottimale (che
1417 può variare a seconda del dispositivo).
1418
1419 Dato che la procedura di allocazione manuale è macchinosa, comporta dei rischi
1420 (come delle scritture accidentali sul buffer) e non assicura la scelta delle
1421 dimensioni ottimali, è sempre meglio lasciare allocare il buffer alle funzioni
1422 di libreria, che sono in grado di farlo in maniera ottimale e trasparente
1423 all'utente (in quanto la deallocazione avviene automaticamente). Inoltre
1424 siccome alcune implementazioni usano parte del buffer per mantenere delle
1425 informazioni di controllo, non è detto che le dimensioni dello stesso
1426 coincidano con quelle su cui viene effettuato l'I/O.
1427
1428 \begin{table}[htb]
1429   \centering
1430   \footnotesize
1431     \begin{tabular}[c]{|l|l|}
1432       \hline
1433       \textbf{Valore} & \textbf{Modalità} \\
1434       \hline
1435       \hline
1436       \const{\_IONBF} & \textit{unbuffered}\\
1437       \const{\_IOLBF} & \textit{line buffered}\\
1438       \const{\_IOFBF} & \textit{fully buffered}\\
1439       \hline
1440     \end{tabular}
1441     \caption{Valori dell'argomento \param{mode} di \func{setvbuf} 
1442       per l'impostazione delle modalità di bufferizzazione.}
1443   \label{tab:file_stream_buf_mode}
1444 \end{table}
1445
1446 Per evitare che \func{setvbuf} imposti il buffer basta passare un valore
1447 \val{NULL} per \param{buf} e la funzione ignorerà l'argomento \param{size}
1448 usando il buffer allocato automaticamente dal sistema.  Si potrà comunque
1449 modificare la modalità di bufferizzazione, passando in \param{mode} uno degli
1450 opportuni valori elencati in tab.~\ref{tab:file_stream_buf_mode}. Qualora si
1451 specifichi la modalità non bufferizzata i valori di \param{buf} e \param{size}
1452 vengono sempre ignorati.
1453
1454 Oltre a \func{setvbuf} le \acr{glibc} definiscono altre tre funzioni per la
1455 gestione della bufferizzazione di uno stream: \funcd{setbuf}, \funcd{setbuffer}
1456 e \funcd{setlinebuf}; i loro prototipi sono:
1457 \begin{functions}
1458   \headdecl{stdio.h} 
1459   
1460   \funcdecl{void setbuf(FILE *stream, char *buf)} Disabilita la
1461   bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
1462   come buffer di dimensione \const{BUFSIZ} in modalità \textit{fully buffered}.
1463   
1464   \funcdecl{void setbuffer(FILE *stream, char *buf, size\_t size)} Disabilita
1465   la bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
1466   come buffer di dimensione \param{size} in modalità \textit{fully buffered}.
1467   
1468   \funcdecl{void setlinebuf(FILE *stream)} Pone lo stream in modalità
1469   \textit{line buffered}.
1470 \end{functions}
1471 \noindent tutte queste funzioni sono realizzate con opportune chiamate a
1472 \func{setvbuf} e sono definite solo per compatibilità con le vecchie librerie
1473 BSD. Infine le \acr{glibc} provvedono le funzioni non standard\footnote{anche
1474   queste funzioni sono originarie di Solaris.} \funcd{\_\_flbf} e
1475 \funcd{\_\_fbufsize} che permettono di leggere le proprietà di bufferizzazione
1476 di uno stream; i cui prototipi sono:
1477 \begin{functions}
1478   \headdecl{stdio\_ext.h} 
1479   
1480   \funcdecl{int \_\_flbf(FILE *stream)} Restituisce un valore diverso da zero
1481   se \param{stream} è in modalità \textit{line buffered}.
1482   
1483   \funcdecl{size\_t \_\_fbufsize(FILE *stream)} Restituisce le dimensioni del
1484   buffer di \param{stream}.
1485 \end{functions}
1486
1487 Come già accennato, indipendentemente dalla modalità di bufferizzazione
1488 scelta, si può forzare lo scarico dei dati sul file con la funzione
1489 \funcd{fflush}, il suo prototipo è:
1490 \begin{prototype}{stdio.h}{int fflush(FILE *stream)}
1491   
1492   Forza la scrittura di tutti i dati bufferizzati dello stream \param{stream}.
1493   
1494   \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
1495     errore, impostando \var{errno} a \errval{EBADF} se \param{stream} non è
1496     aperto o non è aperto in scrittura, o ad uno degli errori di
1497     \func{write}.}
1498 \end{prototype}
1499 \noindent anche di questa funzione esiste una analoga
1500 \func{fflush\_unlocked}\footnote{accessibile definendo \macro{\_BSD\_SOURCE} o
1501   \macro{\_SVID\_SOURCE} o \macro{\_GNU\_SOURCE}.} che non effettua il blocco
1502 dello stream.
1503
1504 Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
1505 stream aperti. Esistono però circostanze, ad esempio quando si vuole essere
1506 sicuri che sia stato eseguito tutto l'output su terminale, in cui serve poter
1507 effettuare lo scarico dei dati solo per gli stream in modalità line buffered;
1508 per questo motivo le \acr{glibc} supportano una estensione di Solaris, la
1509 funzione \funcd{\_flushlbf}, il cui prototipo è:
1510 \begin{prototype}{stdio-ext.h}{void \_flushlbf(void)}
1511   Forza la scrittura di tutti i dati bufferizzati degli stream in modalità
1512   line buffered.
1513 \end{prototype}
1514
1515 Si ricordi comunque che lo scarico dei dati dai buffer effettuato da queste
1516 funzioni non comporta la scrittura di questi su disco; se si vuole che il
1517 kernel dia effettivamente avvio alle operazioni di scrittura su disco occorre
1518 usare \func{sync} o \func{fsync} (si veda~sez.~\ref{sec:file_sync}).
1519
1520 Infine esistono anche circostanze in cui si vuole scartare tutto l'output
1521 pendente; per questo si può usare \funcd{fpurge}, il cui prototipo è:
1522 \begin{prototype}{stdio.h}{int fpurge(FILE *stream)}
1523  
1524   Cancella i buffer di input e di output dello stream \param{stream}.
1525   
1526   \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
1527     errore.}
1528 \end{prototype}
1529
1530 La funzione scarta tutti i dati non ancora scritti (se il file è aperto in
1531 scrittura), e tutto l'input non ancora letto (se è aperto in lettura),
1532 compresi gli eventuali caratteri rimandati indietro con \func{ungetc}.
1533
1534
1535 \subsection{Gli stream e i thread}
1536 \label{sec:file_stream_thread}
1537
1538 Gli stream possono essere usati in applicazioni multi-thread allo stesso
1539 modo in cui sono usati nelle applicazioni normali, ma si deve essere
1540 consapevoli delle possibili complicazioni anche quando non si usano i
1541 thread, dato che l'implementazione delle librerie è influenzata
1542 pesantemente dalle richieste necessarie per garantirne l'uso con i thread.
1543
1544 Lo standard POSIX richiede che le operazioni sui file siano atomiche rispetto
1545 ai thread, per questo le operazioni sui buffer effettuate dalle funzioni di
1546 libreria durante la lettura e la scrittura di uno stream devono essere
1547 opportunamente protette (in quanto il sistema assicura l'atomicità solo per le
1548 system call). Questo viene fatto associando ad ogni stream un opportuno blocco
1549 che deve essere implicitamente acquisito prima dell'esecuzione di qualunque
1550 operazione.
1551
1552 Ci sono comunque situazioni in cui questo non basta, come quando un thread
1553 necessita di compiere più di una operazione sullo stream atomicamente, per
1554 questo motivo le librerie provvedono anche delle funzioni \funcd{flockfile},
1555 \funcd{ftrylockfile} e \funcd{funlockfile}, che permettono la gestione
1556 esplicita dei blocchi sugli stream; esse sono disponibili definendo
1557 \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono:
1558 \begin{functions}
1559   \headdecl{stdio.h}
1560   
1561   \funcdecl{void flockfile(FILE *stream)} Esegue l'acquisizione del lock dello
1562   stream \param{stream}, bloccandosi se il lock non è disponibile.
1563   
1564   \funcdecl{int ftrylockfile(FILE *stream)} Tenta l'acquisizione del lock
1565   dello stream \param{stream}, senza bloccarsi se il lock non è disponibile.
1566   Ritorna zero in caso di acquisizione del lock, diverso da zero altrimenti.
1567   
1568   \funcdecl{void funlockfile(FILE *stream)} Rilascia il lock dello
1569   stream \param{stream}.
1570 \end{functions}
1571 \noindent con queste funzioni diventa possibile acquisire un blocco ed
1572 eseguire tutte le operazioni volute, per poi rilasciarlo. 
1573
1574 Ma, vista la complessità delle strutture di dati coinvolte, le operazioni di
1575 blocco non sono del tutto indolori, e quando il locking dello stream non è
1576 necessario (come in tutti i programmi che non usano i thread), tutta la
1577 procedura può comportare dei costi pesanti in termini di prestazioni. Per
1578 questo motivo abbiamo visto come alle usuali funzioni di I/O non formattato
1579 siano associate delle versioni \code{\_unlocked} (alcune previste dallo stesso
1580 standard POSIX, altre aggiunte come estensioni dalle \acr{glibc}) che possono
1581 essere usate quando il locking non serve\footnote{in certi casi dette funzioni
1582   possono essere usate, visto che sono molto più efficienti, anche in caso di
1583   necessità di locking, una volta che questo sia stato acquisito manualmente.}
1584 con prestazioni molto più elevate, dato che spesso queste versioni (come
1585 accade per \func{getc} e \func{putc}) sono realizzate come macro.
1586
1587 La sostituzione di tutte le funzioni di I/O con le relative versioni
1588 \code{\_unlocked} in un programma che non usa i thread è però un lavoro
1589 abbastanza noioso; per questo motivo le \acr{glibc} forniscono al
1590 programmatore pigro un'altra via\footnote{anche questa mutuata da estensioni
1591   introdotte in Solaris.} da poter utilizzare per disabilitare in blocco il
1592 locking degli stream: l'uso della funzione \funcd{\_\_fsetlocking}, il cui
1593 prototipo è:
1594 \begin{prototype}{stdio\_ext.h}{int \_\_fsetlocking (FILE *stream, int type)}
1595   Specifica o richiede a seconda del valore di \param{type} la modalità in cui
1596   le operazioni di I/O su \param{stream} vengono effettuate rispetto
1597   all'acquisizione implicita del blocco sullo stream.
1598
1599   \bodydesc{Restituisce lo stato di locking interno dello stream con uno dei
1600   valori \const{FSETLOCKING\_INTERNAL} o \const{FSETLOCKING\_BYCALLER}.}
1601 \end{prototype}
1602
1603 La funzione imposta o legge lo stato della modalità di operazione di uno stream
1604 nei confronti del locking a seconda del valore specificato con \param{type},
1605 che può essere uno dei seguenti:
1606 \begin{basedescript}{\desclabelwidth{4.0cm}}
1607 \item[\const{FSETLOCKING\_INTERNAL}] Lo stream userà da ora in poi il blocco
1608   implicito predefinito.
1609 \item[\const{FSETLOCKING\_BYCALLER}] Al ritorno della funzione sarà l'utente a
1610   dover gestire da solo il locking dello stream.
1611 \item[\const{FSETLOCKING\_QUERY}] Restituisce lo stato corrente della modalità
1612   di blocco dello stream.
1613 \end{basedescript}
1614
1615
1616 %%% Local Variables: 
1617 %%% mode: latex
1618 %%% TeX-master: "gapil"
1619 %%% End: 
1620
1621 % LocalWords:  stream cap system call kernel Ritchie glibc descriptor Stevens
1622 % LocalWords:  buf read write filesystem st blksize stat sez l'header stdio BSD
1623 % LocalWords:  nell'header stdin shell stdout stderr error freopen flush line
1624 % LocalWords:  unbuffered buffered newline fully SVr fopen fdopen POSIX const
1625 % LocalWords:  char path int fildes NULL errno malloc fcntl fclose fflush tab
1626 % LocalWords:  dup fifo socket append EXCL ccs STRING IRUSR IWUSR IRGRP IWGRP
1627 % LocalWords:  IROTH IWOTH umask fseek fsetpos rewind SEEK CUR EOF EBADF close
1628 % LocalWords:  sync fcloseall SOURCE void stdlib of feof ferror clearerr l'I ws
1629 % LocalWords:  unlocked fread fwrite size ptr nmemb nelem gcc padding point str
1630 % LocalWords:  lock thread fgetc getc getchar dell'overhead altresì unsigned ap
1631 % LocalWords:  getwc fgetwc getwchar wint wchar WEOF putc fputc putchar dell'I
1632 % LocalWords:  SVID getw putw parsing peeking ahead ungetc gets fgets string Di
1633 % LocalWords:  overflow Aleph stack fputs puts fgetws fputws getline ssize leak
1634 % LocalWords:  realloc value result argument memory getdelim delim printf short
1635 % LocalWords:  fprintf sprintf format snprintf variadic long double intmax list
1636 % LocalWords:  uintmax ptrdiff vprintf vfprintf vsprintf vsnprintf asprintf lex
1637 % LocalWords:  vasprintf strptr dprintf vdprintf print scanf fscanf sscanf flex
1638 % LocalWords:  vscanf vfscanf vsscanf bison parser yacc like off VMS whence pos
1639 % LocalWords:  lseek ftell fgetpos fpos fseeko ftello fileno Solaris freadable
1640 % LocalWords:  fwritable ext freading fwriting buffering setvbuf BUFSIZ setbuf
1641 % LocalWords:  IONBF IOLBF IOFBF setbuffer setlinebuf flbf fbufsize flushlbf hh
1642 % LocalWords:  fsync fpurge flockfile ftrylockfile funlockfile SAFE FUNCTIONS
1643 % LocalWords:  locking fsetlocking type BYCALLER QUERY ll