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