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