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