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