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