Rimossi vecchie versioni dei due capitoli sostituiti e altro materiale
[gapil.git] / fileio.tex
1 %% fileio.tex (merge fileunix.tex - filestd.tex)
2 %%
3 %% Copyright (C) 2000-2012 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{La gestione dell'I/O su file}
13 \label{cha:file_IO_interface}
14
15
16 Esamineremo in questo capitolo le due interfacce di programmazione che
17 consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa
18 del sistema, detta dei \itindex{file~descriptor} \textit{file descriptor}, che
19 viene fornita direttamente dalle \textit{system call} e che non prevede
20 funzionalità evolute come la bufferizzazione o funzioni di lettura o scrittura
21 formattata. Esamineremo poi anche l'interfaccia definita dallo standard ANSI
22 C, che viene chiamata dei \textit{file stream} o anche più brevemente degli
23 \textit{stream}. Per entrambe dopo una introduzione alle caratteristiche
24 generali tratteremo le funzioni base per la gestione dell'I/O, lasciando per
25 ultime le caratteristiche più avanzate.
26
27
28 \section{L'interfaccia dei \textit{file descriptor}}
29 \label{sec:file_unix_interface}
30
31
32 Come visto in sez.~\ref{sec:file_vfs_work} il kernel mette a disposione
33 tramite il \itindex{Virtual~File~System} \textit{Virtual File System} una
34 serie di \textit{system call} che consentono di operare sui file in maniera
35 generale. Abbiamo trattato quelle relative alla gestione delle proprietà dei
36 file nel precedente capitolo, vedremo quelle che si applicano al contenuto dei
37 file in questa sezione, iniziando con una breve introduzione sull'architettura
38 dei \textit{file descriptor} per poi trattare le funzioni di base e le
39 modalità con cui consentono di gestire i dati memorizzati sui file.
40
41
42 \subsection{I \textit{file descriptor}}
43 \label{sec:file_fd}
44
45 \itindbeg{file~descriptor} 
46
47 L'accesso al contenuto dei file viene effettuato, sia pure con differenze
48 nella realizzazione pratica, in maniera sostanzialmente identica in tutte le
49 implementazioni di un sistema unix-like, ricorrendo a quella che viene
50 chiamata l'interfaccia dei \textit{file descriptor}.
51
52 Per poter accedere al contenuto di un file occorre creare un canale di
53 comunicazione con il kernel che renda possibile operare su di esso. Questo si
54 fa aprendo il file con la funzione \func{open} (vedi sez.~\ref{sec:file_open})
55 che provvederà a localizzare \itindex{inode} l'inode del file e inizializzare
56 i puntatori che rendono disponibili le funzioni che il
57 \itindex{Virtual~File~System} VFS mette a disposizione (quelle di
58 tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il
59 file dovrà essere chiuso, e questo chiuderà il canale di comunicazione
60 impedendo ogni ulteriore operazione.
61
62 All'interno di ogni processo i file aperti sono identificati da un numero
63 intero non negativo, che viene chiamato \textit{file descriptor}.  Quando un
64 file viene aperto la funzione \func{open} restituisce questo numero, tutte le
65 ulteriori operazioni dovranno essere compiute specificando questo stesso
66 numero come argomento alle varie funzioni dell'interfaccia.
67
68 Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
69 kernel gestisce l'interazione fra processi e file.  Abbiamo già accennato in
70 sez.~\ref{sec:proc_hierarchy} come il kernel mantenga un elenco di tutti
71 processi nella cosiddetta \itindex{process~table} \textit{process table}. Lo
72 stesso, come accennato in sez.~\ref{sec:file_vfs_work}, vale anche per tutti i
73 file aperti, il cui elenco viene mantenuto nella cosiddetta
74 \itindex{file~table} \textit{file table}.
75
76 La \itindex{process~table} \textit{process table} è una tabella che contiene
77 una voce per ciascun processo attivo nel sistema. Ciascuna voce è costituita
78 dal puntatore a una struttura di tipo \kstruct{task\_struct} nella quale sono
79 raccolte tutte le informazioni relative al processo, fra queste informazioni
80 c'è anche il puntatore ad una ulteriore struttura di tipo
81 \kstruct{files\_struct},\footnote{la definizione corrente di questa struttura
82   si trova nel file \texttt{include/linux/fdtable.h} dei sorgenti del kernel,
83   quella mostrata in fig.~\ref{fig:file_proc_file} è una versione pesantemente
84   semplificata.} che contiene le informazioni relative ai file che il processo
85 ha aperto.
86
87 La \itindex{file~table} \textit{file table} è una tabella che contiene una
88 voce per ciascun file che è stato aperto nel sistema. Come accennato in
89 sez.~\ref{sec:file_vfs_work} per ogni file aperto viene allocata una struttura
90 \kstruct{file} e la \textit{file table} è costituita da un elenco di puntatori
91 a ciascuna di queste strutture, che, come illustrato in
92 fig.~\ref{fig:kstruct_file}, contengono le informazioni necessarie per la
93 gestione dei file, ed in particolare:
94 \begin{itemize*}
95 \item il flag di stato \itindex{file~status~flag} del file nel campo
96   \var{f\_flags}.
97 \item la posizione corrente nel file, il cosiddetto \textit{offset}, nel campo
98   \var{f\_pos}.
99 \item un puntatore alla struttura \kstruct{inode} che identifica
100   \itindex{inode} l'\textit{inode} del file.\footnote{nel kernel 2.4.x si è in
101     realtà passati ad un puntatore ad una struttura \kstruct{dentry} che punta
102     a sua volta \itindex{inode} all'\textit{inode} passando per la nuova
103     struttura del VFS.}
104 \item un puntatore \var{f\_op} alla tabella delle funzioni che si possono
105   usare sul file.\footnote{quelle della struttura \kstruct{file\_operation},
106     descritte sommariamente in tab.~\ref{tab:file_file_operations}.}
107 \end{itemize*}
108
109 \begin{figure}[!htb]
110   \centering
111   \includegraphics[width=12cm]{img/procfile}
112   \caption{Schema della architettura dell'accesso ai file attraverso
113   l'interfaccia dei \textit{file descriptor}.}
114   \label{fig:file_proc_file}
115 \end{figure}
116
117 In fig.~\ref{fig:file_proc_file} si è riportato uno schema semplificato in cui
118 è illustrata questa architettura, ed in cui si sono evidenziate le
119 interrelazioni fra la \itindex{file~table} \textit{file table}, la
120 \itindex{process~table} \textit{process table} e le varie strutture di dati
121 che il kernel mantiene per ciascun file e ciascun processo.
122
123 Come si può notare alla fine il collegamento che consente di porre in
124 relazione i file ed i processi è effettuato attraverso i dati mantenuti nella
125 struttura \kstruct{files\_struct}, essa infatti contiene alcune informazioni
126 essenziali come:
127 \begin{itemize*}
128 \item i flag relativi ai file aperti dal processo.
129 \item il numero di file aperti dal processo.
130 \item una tabella di puntatori alla relativa voce nella \itindex{file~table}
131   \textit{file table} per ciascun file aperto.
132 \end{itemize*}
133
134 In questa infrastruttura un \textit{file descriptor} non è altro che l'intero
135 positivo che indicizza quest'ultima tabella, grazie al quale si può recuperare
136 il puntatore alla struttura \kstruct{file} nella \itindex{file~table}
137 \textit{file table} corrispondente al file che è stato aperto dal processo e a
138 cui era stato assegnato questo indice. Ma una volta indicato col \textit{file
139   descriptor} qual'è la struttura \kstruct{file} nella \textit{file table}
140 corrispondente al file voluto, il kernel potrà usare le funzioni messe
141 disposizione dal VFS per eseguire sul file tutte le operazioni necessarie.
142
143 Il meccanismo dell'apertura dei file prevede che venga sempre fornito il primo
144 \textit{file descriptor} libero nella tabella, e per questo motivo essi
145 vengono assegnati in successione tutte le volte che si apre un nuovo file,
146 posto che non ne sia stato chiuso nessuno in precedenza.
147
148 In tutti i sistemi unix-like esiste poi una convenzione generale per cui ogni
149 processo viene lanciato dalla shell con almeno tre file aperti. Questi, per
150 quanto appena detto, avranno come \itindex{file~descriptor} \textit{file
151   descriptor} i valori 0, 1 e 2.  Benché questa sia soltanto una convenzione,
152 essa è seguita dalla gran parte delle applicazioni, e non aderirvi potrebbe
153 portare a gravi problemi di interoperabilità.
154
155 Il primo file è sempre associato al cosiddetto \itindex{standard~input}
156 \textit{standard input}, è cioè il file da cui un processo si aspetta di dover
157 leggere i dati in ingresso. Il secondo file è il cosiddetto
158 \itindex{standard~output} \textit{standard output}, cioè quello su cui ci si
159 aspetta di dover scrivere i dati in uscita. Il terzo è lo
160 \itindex{standard~error} \textit{standard error}, su cui vengono scritti i
161 dati relativi agli errori.  Nel caso della shell tutti questi file sono
162 associati al terminale di controllo, e corrispondono quindi alla lettura della
163 tastiera per l'ingresso e alla scrittura sul terminale per l'uscita.  Lo
164 standard POSIX.1 provvede, al posto dei valori numerici, tre costanti
165 simboliche, definite in tab.~\ref{tab:file_std_files}.
166
167 \begin{table}[htb]
168   \centering
169   \footnotesize
170   \begin{tabular}[c]{|l|l|}
171     \hline
172     \textbf{File} & \textbf{Significato} \\
173     \hline
174     \hline
175     \const{STDIN\_FILENO}  & \textit{file descriptor} dello \textit{standard
176       input} \\
177     \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
178       output} \\
179     \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
180       error}\\
181     \hline
182   \end{tabular}
183   \caption{Costanti definite in \headfile{unistd.h} per i file standard aperti 
184     alla creazione di ogni processo.}
185   \label{tab:file_std_files}
186 \end{table}
187
188 In fig.~\ref{fig:file_proc_file} si è rappresentata una situazione diversa
189 rispetto a quella usuale della shell, in cui tutti e tre questi file fanno
190 riferimento al terminale su cui si opera. Nell'esempio invece viene illustrata
191 la situazione di un programma in cui lo \itindex{standard~input}
192 \textit{standard input} è associato ad un file mentre lo
193 \itindex{standard~output} \textit{standard output} e lo
194 \itindex{standard~error} \textit{standard error} sono associati ad un altro
195 file.  Si noti poi come per questi ultimi le strutture \kstruct{file} nella
196 \itindex{file~table} \textit{file table}, pur essendo distinte, fanno
197 riferimento allo stesso \itindex{inode} \textit{inode}, dato che il file che è
198 stato aperto lo stesso. Questo è quello che avviene normalmente quando si apre
199 più volte lo stesso file.
200
201 Si ritrova quindi anche con le voci della \itindex{file~table} \textit{file
202   table} una situazione analoga di quella delle voci di una directory, con la
203 possibilità di avere più voci che fanno riferimento allo stesso
204 \itindex{inode} \textit{inode}. L'analogia è in realtà molto stretta perché
205 quando si cancella un file, il kernel verifica anche che non resti nessun
206 riferimento in una una qualunque voce della \itindex{file~table} \textit{file
207   table} prima di liberare le risorse ad esso associate e disallocare il
208 relativo \itindex{inode} \textit{inode}.
209
210 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
211 numero di file aperti era anche soggetto ad un limite massimo dato dalle
212 dimensioni del vettore di puntatori con cui era realizzata la tabella dei file
213 descriptor dentro \kstruct{files\_struct}; questo limite intrinseco nei kernel
214 più recenti non sussiste più, dato che si è passati da un vettore ad una
215 lista, ma restano i limiti imposti dall'amministratore (vedi
216 sez.~\ref{sec:sys_limits}).
217
218
219
220 \subsection{Apertura e creazione di un file}
221 \label{sec:file_open}
222
223 La funzione di sistema \funcd{open} è la principale funzione dell'interfaccia
224 di gestione dei file, quella che dato un \textit{pathname} consente di
225 ottenere un file descriptor ``\textsl{aprendo}'' il file
226 corrispondente,\footnote{è \func{open} che alloca \kstruct{file}, la inserisce
227   nella \itindex{file~table} \textit{file table} e crea il riferimento nella
228   \kstruct{files\_struct} del processo.} il suo prototipo è:
229
230 \begin{funcproto}{
231 \fhead{sys/types.h}
232 \fhead{sys/stat.h}
233 \fhead{fcntl.h}
234 \fdecl{int open(const char *pathname, int flags)}
235 \fdecl{int open(const char *pathname, int flags, mode\_t mode)}
236
237 \fdesc{Apre un file.} 
238 }
239
240 {La funzione ritorna il file descriptor in caso di successo e $-1$ per un
241   errore, nel qual caso \var{errno} assumerà uno dei valori:
242   \begin{errlist}
243   \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
244     \const{O\_CREAT} e \const{O\_EXCL}.
245   \item[\errcode{EINTR}] la funzione era bloccata ed è stata interrotta da un
246     segnale (vedi sez.~\ref{sec:sig_gen_beha}).
247   \item[\errcode{EISDIR}] \param{pathname} indica una directory e si è tentato
248     l'accesso in scrittura o in lettura/scrittura.
249   \item[\errcode{EFBIG}] il file è troppo grande per essere aperto (lo
250     standard richiederebbe \errval{EOVERFLOW}).
251   \item[\errcode{ELOOP}] si sono incontrati troppi collegamenti simbolici nel
252     risolvere \param{pathname} o si è indicato \const{O\_NOFOLLOW} e
253     \param{pathname} è un collegamento simbolico.
254   \item[\errcode{ENODEV}] \param{pathname} si riferisce a un file di
255     dispositivo che non esiste.
256   \item[\errcode{ENOENT}] \param{pathname} non esiste e non si è richiesto
257     \const{O\_CREAT}, o non esiste un suo componente. 
258   \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e
259     \param{pathname} non è una directory.
260   \item[\errcode{ENXIO}] si sono impostati \const{O\_NOBLOCK} o
261     \const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun
262     processo o \param{pathname} è un file di dispositivo ma il dispositivo è
263     assente.
264   \item[\errcode{EPERM}] si è specificato \const{O\_NOATIME} e non si è né
265     amministratori né proprietari del file.
266   \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
267     di un programma in esecuzione.
268   \item[\errcode{EWOULDBLOCK}] la funzione si sarebbe bloccata ma si è
269     richiesto \const{O\_NOBLOCK}.
270   \end{errlist}
271   ed inoltre \errval{EACCES}, \errval{EFAULT}, \errval{EMFILE},
272   \errval{ENAMETOOLONG}, \errval{ENFILE}, \errval{ENOMEM}, \errval{ENOSPC},
273   \errval{EROFS}, nel loro significato generico.}
274 \end{funcproto}
275
276 La funzione apre il file indicato da \param{pathname} nella modalità indicata da
277 \param{flags}. Essa può essere invocata in due modi diversi, specificando
278 opzionalmente un terzo argomento \param{mode}. Qualora il file non esista e
279 venga creato, questo argomento consente di indicare quali permessi dovranno
280 essergli assegnati. I valori possibili sono gli stessi già visti in
281 sez.~\ref{sec:file_perm_overview} e possono essere specificati come OR binario
282 delle costanti descritte in tab.~\ref{tab:file_bit_perm}. Questi permessi sono
283 comunque filtrati dal valore della \itindex{umask} \textit{umask} (vedi
284 sez.~\ref{sec:file_perm_management}) del processo.
285
286 La funzione restituisce sempre il primo file descriptor libero, e questa
287 caratteristica permette di prevedere qual è il valore del file descriptor che
288 si otterrà al ritorno di \func{open}, e viene spesso usata dalle applicazioni
289 per sostituire i file corrispondenti ai file standard visti in
290 tab.~\ref{tab:file_std_files}. Se ad esempio si chiude lo
291 \itindex{standard~input} \textit{standard input} e si apre subito dopo un
292 nuovo file questo diventerà il nuovo \itindex{standard~input} \textit{standard
293   input} (avrà cioè il file descriptor 0).
294
295 Al momento dell'apertura il nuovo file descriptor non è condiviso con nessun
296 altro processo (torneremo sul significato della condivisione dei file
297 descriptor, che in genere si ottiene dopo una \func{fork}, in
298 sez.~\ref{sec:file_sharing}) ed è impostato, come accennato in
299 sez.~\ref{sec:proc_exec}, per restare aperto attraverso una
300 \func{exec}. Inoltre la posizione sul file, il cosiddetto \textit{offset}, è
301 impostata all'inizio del file. Una volta aperto un file si potrà operare su di
302 esso direttamente tramite il file descriptor, e quanto avviene al
303 \textit{pathname} con cui lo si è aperto sarà del tutto ininfluente.
304
305 Il comportamento della funzione e le diverse modalità con cui può essere
306 aperto il file vengono controllati dall'argomento \param{flags} il cui valore
307 deve essere indicato come maschera binaria in cui ciascun bit ha un
308 significato specifico.  Alcuni di questi bit vanno anche a costituire i
309 cosiddetti \textsl{flag di stato} del file (o \itindex{file~status~flag}
310 \textit{file status flags}), che vengono mantenuti nel campo \var{f\_flags}
311 della struttura \kstruct{file} che abbiamo riportato anche in
312 fig.~\ref{fig:file_proc_file}).
313
314 Ciascun flag viene identificato da una apposita costante, ed il valore
315 di \param{flags} deve essere specificato come OR aritmetico di queste
316 costanti. I vari bit che si possono usare come componenti di \param{flags}
317 sono divisi in tre gruppi principali. Il primo gruppo è quello dei cosiddetti
318 flag delle \textsl{modalità di accesso} (o \textit{access mode flags}), che
319 specificano che tipo di accesso si effettuerà sul file, fra lettura, scrittura
320 e lettura/scrittura. Questa modalità deve essere indicata usando una delle
321 costanti di tab.~\ref{tab:open_access_mode_flag}.
322
323 \begin{table}[htb]
324   \centering
325   \footnotesize
326     \begin{tabular}[c]{|l|l|}
327       \hline
328       \textbf{Flag} & \textbf{Significato} \\
329       \hline
330       \hline
331       \const{O\_RDONLY} & Apre il file in sola lettura.\\
332       \const{O\_WRONLY} & Apre il file in sola scrittura.\\
333       \const{O\_RDWR}   & Apre il file sia in lettura che in scrittura.\\
334       \hline
335     \end{tabular}
336     \caption{Le tre costanti che identificano le modalità di accesso
337       nell'apertura di un file.}
338   \label{tab:open_access_mode_flag}
339 \end{table}
340
341 A differenza di tutti gli altri flag che vedremo in seguito, in questo caso
342 non si ha a che fare con singoli bit separati dell'argomento \param{flags}, ma
343 con un numero composto da due bit. Questo significa ad esempio che la
344 combinazione \code{\const{O\_RDONLY}|\const{O\_WRONLY}} non è affatto
345 equivalente a \const{O\_WRONLY}, e non deve essere usata.\footnote{in realtà
346   su Linux, dove i valori per le tre costanti di
347   tab.~\ref{tab:open_access_mode_flag} sono rispettivamente $0$, $1$ e $2$, il
348   valore $3$ viene usato con un significato speciale ed assolutamente fuori
349   standard, disponibile solo per i file di dispositivo e solo per alcuni
350   driver, in cui si richiede la verifica della capacità di accesso in lettura
351   e scrittura ma viene restituito un file descriptor che non può essere letto
352   o scritto, ma solo usato con una \func{ioctl} (vedi
353   sez.~\ref{sec:file_ioctl}).}
354
355 La modalità di accesso deve sempre essere specificata quando si apre un file,
356 il valore indicato in \param{flags} viene salvato nei
357 \itindex{file~status~flag} \textit{file status flags}, e può essere riletto
358 con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}), il relativo valore può
359 essere poi ottenuto un AND aritmetico della maschera binaria
360 \const{O\_ACCMODE}, ma non può essere modificato. Nella \acr{glibc} sono
361 definite inoltre \const{O\_READ} come sinonimo di \const{O\_RDONLY} e
362 \const{O\_WRITE} come sinonimo di \const{O\_WRONLY}.\footnote{si tratta di
363   definizioni completamente fuori standard, attinenti insieme a
364   \const{O\_EXEC}, che permetterebbe l'apertura di un file per l'esecuzione,
365   ad un non meglio precisato ``\textit{GNU system}''; pur essendo equivalenti
366   alle definizioni classiche non è comunque il caso di utilizzarle.}
367
368 Il secondo gruppo di flag è quello delle \textsl{modalità di
369   apertura},\footnote{la pagina di manuale di \func{open} parla di
370   \textit{file creation flags}, ma alcuni di questi flag non hanno nulla a che
371   fare con la creazione dei file, mentre il manuale dalla \acr{glibc} parla di
372   più correttamente di \textit{open-time flags}, dato che si tratta di flag il
373   cui significato ha senso solo al momento dell'apertura del file.} che
374 permettono di specificare alcune delle caratteristiche del comportamento di
375 \func{open} nel momento in viene eseguita per aprire un file. Questi flag
376 hanno effetto solo nella chiamata della funzione, non sono memorizzati fra i
377 \itindex{file~status~flag} \textit{file status flags} e non possono essere
378 riletti da \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}).
379
380 \begin{table}[htb]
381   \centering
382   \footnotesize
383     \begin{tabular}[c]{|l|p{10 cm}|}
384       \hline
385       \textbf{Flag} & \textbf{Significato} \\
386       \hline
387       \hline
388       \const{O\_CREAT} &    Se il file non esiste verrà creato, con le regole
389                             di titolarità del file viste in
390                             sez.~\ref{sec:file_ownership_management}. Se si
391                             imposta questo flag l'argomento \param{mode} deve
392                             essere sempre specificato.\\  
393       \const{O\_DIRECTORY}& Se \param{pathname} non è una directory la
394                             chiamata fallisce. Questo flag, introdotto con il
395                             kernel 2.1.126, è specifico di Linux e
396                             serve ad evitare dei possibili
397                             \itindex{Denial~of~Service~(DoS)}
398                             \textit{DoS}\footnotemark quando \func{opendir} 
399                             viene chiamata su una fifo o su un dispositivo
400                             associato ad una unità a nastri. Non viene
401                             usato al di fuori dell'implementazione di
402                             \func{opendir}, ed è utilizzabile soltanto se si è
403                             definata la macro \macro{\_GNU\_SOURCE}.\\
404       \const{O\_EXCL}     & Deve essere usato in congiunzione con
405                             \const{O\_CREAT} ed in tal caso impone che il file
406                             indicato da \param{pathname} non sia già esistente
407                             (altrimenti causa il fallimento della chiamata con
408                             un errore di \errcode{EEXIST}).\\
409       \const{O\_LARGEFILE}& Viene usato sui sistemi a 32 bit per richiedere
410                             l'apertura di file molto grandi, la cui
411                             dimensione non è rappresentabile con la versione a
412                             32 bit del tipo \type{off\_t}, utilizzando
413                             l'interfaccia alternativa abilitata con la
414                             macro \macro{\_LARGEFILE64\_SOURCE}. Come
415                             illustrato in sez.~\ref{sec:intro_gcc_glibc_std} è
416                             sempre preferibile usare la conversione automatica
417                             delle funzioni che si attiva assegnando a $64$ la
418                             macro \macro{\_FILE\_OFFSET\_BITS} e non usare mai
419                             questo flag.\\
420       \const{O\_NOCTTY}   & Se \param{pathname} si riferisce ad un dispositivo
421                             di terminale, questo non diventerà il terminale di
422                             controllo, anche se il processo non ne ha ancora
423                             uno (si veda sez.~\ref{sec:sess_ctrl_term}).\\ 
424       \const{O\_NOFOLLOW} & Se \param{pathname} è un collegamento simbolico
425                             la chiamata fallisce. Questa è un'estensione BSD
426                             aggiunta in Linux a partire dal kernel
427                             2.1.126 ed utilizzabile soltanto se si è definata
428                             la macro \macro{\_GNU\_SOURCE}.\\ 
429       \const{O\_TRUNC}    & Se usato su un file di dati aperto in scrittura,
430                             ne tronca la lunghezza a zero; con un terminale o
431                             una fifo viene ignorato, negli altri casi il
432                             comportamento non è specificato.\\ 
433       \hline
434     \end{tabular}
435     \caption{Le costanti che identificano le \textit{modalità di apertura} di
436       un file.} 
437   \label{tab:open_time_flag}
438 \end{table}
439
440 \footnotetext{acronimo di \itindex{Denial~of~Service~(DoS)} \textit{Denial of
441     Service}, si chiamano così attacchi miranti ad impedire un servizio
442   causando una qualche forma di carico eccessivo per il sistema, che resta
443   bloccato nelle risposte all'attacco.}
444
445 Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle
446 \textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due
447   flag \const{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e
448   \const{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi
449   sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non
450   esistono con Linux.}  Uno di questi, \const{O\_EXCL}, ha senso solo se usato
451 in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per
452 assicurarsi che questo non esista di già, e lo si usa spesso per creare i
453 cosiddetti \index{file!di lock} ``\textsl{file di lock}'' (vedi
454 sez.~\ref{sec:ipc_file_lock}). Si tenga presente che questa opzione è
455 supportata su NFS solo a partire da NFSv3 e con il kernel 2.6, nelle versioni
456 precedenti la funzionalità viene emulata controllando prima l'esistenza del
457 file per cui usarla per creare \index{file!di lock} un file di lock potrebbe
458 dar luogo a una \itindex{race~condition} \textit{race condition}.\footnote{un
459   file potrebbe venir creato fra il controllo la successiva apertura
460   \const{O\_CREAT}, la cosa si può risolvere comunque creando un file con un
461   nome univoco ed usando la funzione \func{link} per creare il \index{file!di
462     lock} file di lock, (vedi sez.~\ref{sec:ipc_file_lock}).}
463
464 Se si usa \const{O\_EXCL} senza \const{O\_CREAT} il comportamento è
465 indefinito.  Nella creazione di un file con \const{O\_CREAT} occorre sempre
466 specificare l'argomento di \param{mode}, che altrimenti è ignorato. Si tenga
467 presente che indipendentemente dai permessi che si possono assegnare, che
468 potrebbero non consentire in seguito lettura o scrittura, quando il file viene
469 aperto l'accesso viene garantito secondo quanto richiesto con i flag di
470 tab.~\ref{tab:open_access_mode_flag}.  Quando viene creato un nuovo file
471 \const{O\_CREAT} con tutti e tre i tempi del file di
472 tab.~\ref{tab:file_file_times} vengono impostati al tempo corrente. Se invece
473 si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il
474 \textit{modification time} e lo \textit{status change time}.
475
476 \begin{table}[htb]
477   \centering
478   \footnotesize
479     \begin{tabular}[c]{|l|p{10 cm}|}
480       \hline
481       \textbf{Flag} & \textbf{Significato} \\
482       \hline
483       \hline
484       \const{O\_APPEND}  & Il file viene aperto in \itindex{append~mode}
485                            \textit{append mode}. La posizione sul file (vedi
486                            sez.~\ref{sec:file_lseek}) viene sempre mantenuta
487                            sulla sua coda, per cui quanto si scrive
488                            viene sempre aggiunto al contenuto precedente. Con
489                            NFS questa funzionalità non è supportata 
490                            e viene emulata, per questo possono verificarsi
491                            \itindex{race~condition} \textit{race 
492                              condition} con una sovrapposizione dei dati se
493                            più di un processo scrive allo stesso tempo. \\
494       \const{O\_ASYNC}   & Apre il file per l'I/O in modalità asincrona (vedi
495                            sez.~\ref{sec:file_asyncronous_io}). Quando è
496                            impostato viene generato il segnale \signal{SIGIO}
497                            tutte le volte che il file è pronto per le
498                            operazioni di lettura o scrittura. Questo flag si
499                            può usare solo terminali, pseudoterminali e socket
500                            e, a partire dal kernel 2.6, anche sulle fifo.\\ 
501       \const{O\_CLOEXEC}&  Attiva la modalità di \itindex{close-on-exec}
502                            \textit{close-on-exec} (vedi
503                            sez.~\ref{sec:proc_exec}) sul file. Il flag è 
504                            previsto dallo standard POSIX.1-2008, ed è stato
505                            introdotto con il kernel 2.6.23 per evitare una
506                            \itindex{race~condition} \textit{race condition}
507                            che si potrebbe verificare con i \textit{thread}
508                            fra l'apertura del file e l'impostazione della
509                            suddetta modalità con \func{fcntl} (vedi
510                            sez.~\ref{sec:file_fcntl}).\\
511       \const{O\_DIRECT}  & Esegue l'I/O direttamente dalla memoria in
512                            \textit{user space} in maniera sincrona, in modo da
513                            scavalcare i meccanismi di bufferizzazione del
514                            kernel. Introdotto con il kernel 2.4.10 ed
515                            utilizzabile soltanto se si è definita la 
516                            macro \macro{\_GNU\_SOURCE}.\\ 
517       \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei
518                            file (vedi sez.~\ref{sec:file_file_times}). Per
519                            molti filesystem questa funzionalità non è
520                            disponibile per il singolo file ma come opzione
521                            generale da specificare in fase di montaggio.\\ 
522       \const{O\_NONBLOCK}& Apre il file in \textsl{modalità non bloccante} per
523                            le operazioni di I/O (vedi
524                            sez.~\ref{sec:file_noblocking}). Questo significa
525                            il fallimento delle successive operazioni di
526                            lettura o scrittura qualora il file non sia pronto
527                            per la loro esecuzione immediata, invece del 
528                            blocco delle stesse in attesa di una successiva
529                            possibilità di esecuzione come avviene
530                            normalmente. Questa modalità ha senso solo per le
531                            fifo, vedi sez.~\ref{sec:ipc_named_pipe}), o quando
532                            si vuole aprire un file di dispositivo per eseguire
533                            una \func{ioctl} (vedi
534                            sez.~\ref{sec:file_ioctl}).\\ 
535       \const{O\_NDELAY}  & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma
536                            origina da SVr4, dove però causava il ritorno da
537                            una \func{read} con un valore nullo e non con un
538                            errore, questo introduce un'ambiguità, dato che
539                            come vedremo in sez.~\ref{sec:file_read} il ritorno
540                            di un valore nulla da parte di \func{read} ha 
541                            il significato di una \textit{end-of-file}.\\
542       \const{O\_SYNC}    & Apre il file per l'input/output sincrono. Ogni
543                            scrittura di dati si bloccherà fino alla conferma
544                            dell'arrivo di tutti i dati sull'hardware
545                            sottostante.\\
546       \hline
547     \end{tabular}
548     \caption{Le costanti che identificano le \textit{modalità di operazione} di
549       un file.} 
550   \label{tab:open_operation_flag}
551 \end{table}
552
553
554 Il terzo gruppo è quello dei flag delle \textsl{modalità di operazione},
555 riportati in tab.~\ref{tab:open_operation_flag}, che permettono di specificare
556 varie caratteristiche del comportamento delle operazioni di I/O che verranno
557 eseguite sul file. Tutti questi, tranne \const{O\_CLOEXEC}, che viene
558 mantenuto per ogni singolo file descriptor, vengono salvati nel campo
559 \var{f\_flags} della struttura \kstruct{file} insieme al valore della
560 \textsl{modalità di accesso} andando far parte dei cosiddetti \textit{file
561   status flags}. Il loro valore viene impostato alla chiamata di \func{open},
562 ma possono essere riletti ed in alcuni anche modificati, con conseguente
563 effetto sulle caratteristiche operative che controllano, con \func{fcntl}
564 (vedi sez.~\ref{sec:file_fcntl}).
565
566 Il flag \const{O\_DIRECT} non è previsto da nessuno standard, anche se è
567 presente in alcuni kernel unix-like.\footnote{il flag è stato introdotto dalla
568   SGI in IRIX, ma è presente senza limiti di allineamento dei buffer anche in
569   FreeBSD.} Per i kernel della serie 2.4 si deve garantire che i buffer in
570 \textit{user space} da cui si effettua il trasferimento diretto dei dati siano
571 allineati alle dimensioni dei blocchi del filesystem. Con il kernel 2.6 in
572 genere basta che siano allineati a multipli di 512 byte, ma le restrizioni
573 possono variare a seconda del filesystem, ed inoltre su alcuni filesystem può
574 non essere supportato nel qual caso si avrà un errore di \errval{EINVAL}.
575
576 Lo scopo di \const{O\_DIRECT} è consentire un completo controllo sulla
577 bufferizzazione dei propri dati per quelle applicazioni (in genere database)
578 che hanno esigenze specifiche che non vengono soddisfatte nella maniera più
579 efficiente dalla politica generica utilizzata dal kernel. In genere l'uso di
580 questo flag peggiora le prestazioni tranne quando le applicazioni sono in
581 grado di ottimizzare la propria bufferizzazione in maniera adeguata. Se lo si
582 usa si deve avere cura di non mescolare questo tipo di accesso con quello
583 ordinario, in quante le esigenze di mantenere coerenti i dati porterebbero ad
584 un peggioramento delle prestazioni. Lo stesso dicasi per l'interazione con
585 eventuale mappatura in memoria del file (vedi sez.~\ref{sec:file_memory_map}).
586
587 Si tenga presente infine che anche se l'uso di \const{O\_DIRECT} comporta
588 sostanzialmente una scrittura sincrona dei dati dei buffer in \textit{user
589   space}, questo non è completamente equivalente all'uso di \const{O\_SYNC}
590 che garantisce anche sulla scrittura sincrona dei metadati. Per questo in
591 genere è opportuno se si usa  \const{O\_DIRECT} è opportuno richiedere anche
592 \const{O\_SYNC}.
593
594 Si tenga presente infine che la implementazione di \const{O\_SYNC} di Linux
595 differisce da quanto previsto dallo standard POSIX.1 che prevede altri due
596 flag \const{O\_DSYNC} 
597
598
599  diversi 
600
601       \const{O\_FSYNC}   Sinonimo di \const{O\_SYNC}, usato da BSD.
602
603       \const{O\_DSYNC}   Variante di I/O sincrono definita da POSIX; presente
604                            dal kernel 2.1.130 come sinonimo di
605                            \const{O\_SYNC}.
606
607
608       \const{O\_RSYNC}   & Variante analoga alla precedente, trattata allo
609                            stesso modo.
610
611
612
613
614
615
616 %TODO trattare le differenze fra O_DSYNC, O_SYNC e O_RSYNC introdotte nella  
617 % nello sviluppo del kernel 2.6.33, vedi http://lwn.net/Articles/350219/
618
619 Nelle prime versioni di Unix i valori di \param{flag} specificabili per
620 \func{open} erano solo quelli relativi alle modalità di accesso del file.  Per
621 questo motivo per creare un nuovo file c'era una system call apposita,
622 \funcd{creat}, il cui prototipo è:
623
624 \begin{funcproto}{
625 \fhead{fcntl.h}
626 \fdecl{int creat(const char *pathname, mode\_t mode)}
627 \fdesc{Crea un nuovo file vuoto.} 
628 }
629
630 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
631   caso \var{errno} assumerà gli stessi valori che si otterebbero con
632   \func{open}.}
633 \end{funcproto}
634
635
636 La funzione crea un nuovo file vuoto, con i permessi specificati
637 dall'argomento \param{mode}. È del tutto equivalente a \code{open(filedes,
638   O\_CREAT|O\_WRONLY|O\_TRUNC, mode)} e resta solo per compatibilità con i
639 vecchi programmi.
640
641
642 \subsection{La funzione \func{close}}
643 \label{sec:file_close}
644
645 La funzione \funcd{close} permette di chiudere un file, in questo modo il file
646 descriptor ritorna disponibile; il suo prototipo è:
647 \begin{prototype}{unistd.h}{int close(int fd)}
648   Chiude il descrittore \param{fd}. 
649   
650   \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
651     errore, con \var{errno} che assume i valori:
652   \begin{errlist}
653     \item[\errcode{EBADF}]  \param{fd} non è un descrittore valido.
654     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
655   \end{errlist}
656   ed inoltre \errval{EIO}.}
657 \end{prototype}
658
659 La chiusura di un file rilascia ogni blocco (il \textit{file locking}
660 \itindex{file~locking} è trattato in sez.~\ref{sec:file_locking}) che il
661 processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
662 riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella
663 \itindex{file~table} \textit{file table} vengono rilasciate. Infine se il file
664 descriptor era l'ultimo riferimento ad un file su disco quest'ultimo viene
665 cancellato.
666
667 Si ricordi che quando un processo termina anche tutti i suoi file descriptor
668 vengono chiusi, molti programmi sfruttano questa caratteristica e non usano
669 esplicitamente \func{close}. In genere comunque chiudere un file senza
670 controllarne lo stato di uscita è errore; infatti molti filesystem
671 implementano la tecnica del \textit{write-behind}, per cui una \func{write}
672 può avere successo anche se i dati non sono stati scritti, un eventuale errore
673 di I/O allora può sfuggire, ma verrà riportato alla chiusura del file: per
674 questo motivo non effettuare il controllo può portare ad una perdita di dati
675 inavvertita.\footnote{in Linux questo comportamento è stato osservato con NFS
676   e le quote su disco.}
677
678 In ogni caso una \func{close} andata a buon fine non garantisce che i dati
679 siano stati effettivamente scritti su disco, perché il kernel può decidere di
680 ottimizzare l'accesso a disco ritardandone la scrittura. L'uso della funzione
681 \func{sync} (vedi sez.~\ref{sec:file_sync}) effettua esplicitamente il
682 \emph{flush} dei dati, ma anche in questo caso resta l'incertezza dovuta al
683 comportamento dell'hardware (che a sua volta può introdurre ottimizzazioni
684 dell'accesso al disco che ritardano la scrittura dei dati, da cui l'abitudine
685 di ripetere tre volte il comando prima di eseguire lo shutdown).
686
687
688 \subsection{La gestione della posizione nel file}
689 \label{sec:file_lseek}
690
691 Come già accennato in sez.~\ref{sec:file_fd} a ciascun file aperto è associata
692 una \textsl{posizione corrente nel file} (il cosiddetto \textit{file offset},
693 mantenuto nel campo \var{f\_pos} di \kstruct{file}) espressa da un numero intero
694 positivo come numero di byte dall'inizio del file. Tutte le operazioni di
695 lettura e scrittura avvengono a partire da questa posizione che viene
696 automaticamente spostata in avanti del numero di byte letti o scritti.
697
698 In genere (a meno di non avere richiesto la modalità \itindex{append~mode}
699 \const{O\_APPEND}) questa posizione viene impostata a zero all'apertura del
700 file. È possibile impostarla ad un valore qualsiasi con la funzione
701 \funcd{lseek}, il cui prototipo è:
702 \begin{functions}
703   \headdecl{sys/types.h}
704   \headdecl{unistd.h}
705   \funcdecl{off\_t lseek(int fd, off\_t offset, int whence)}
706   Imposta la posizione attuale nel file. 
707   
708   \bodydesc{La funzione ritorna il valore della posizione corrente in caso di
709     successo e $-1$ in caso di errore nel qual caso \var{errno} assumerà uno
710     dei valori:
711   \begin{errlist}
712     \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket o una fifo.
713     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
714     \item[\errcode{EOVERFLOW}] \param{offset} non può essere rappresentato nel
715       tipo \type{off\_t}.
716   \end{errlist}
717   ed inoltre \errval{EBADF}.}
718 \end{functions}
719
720 La nuova posizione è impostata usando il valore specificato da \param{offset},
721 sommato al riferimento dato da \param{whence}; quest'ultimo può assumere i
722 seguenti valori\footnote{per compatibilità con alcune vecchie notazioni
723   questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con
724   \const{L\_SET}, \const{L\_INCR} e \const{L\_XTND}.}:
725 \begin{basedescript}{\desclabelwidth{2.0cm}}
726 \item[\const{SEEK\_SET}] si fa riferimento all'inizio del file: il valore
727   (sempre positivo) di \param{offset} indica direttamente la nuova posizione
728   corrente.
729 \item[\const{SEEK\_CUR}] si fa riferimento alla posizione corrente del file:
730   ad essa viene sommato \param{offset} (che può essere negativo e positivo)
731   per ottenere la nuova posizione corrente.
732 \item[\const{SEEK\_END}] si fa riferimento alla fine del file: alle dimensioni
733   del file viene sommato \param{offset} (che può essere negativo e positivo)
734   per ottenere la nuova posizione corrente.
735 \end{basedescript}
736
737 % TODO, trattare, SEEK_HOLE e SEEK_DATA, inclusi nel kernel 3.1, vedi
738 % http://lwn.net/Articles/439623/ 
739
740
741 Si tenga presente che la chiamata a \func{lseek} non causa nessun accesso al
742 file, si limita a modificare la posizione corrente (cioè il valore
743 \var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}).  Dato che
744 la funzione ritorna la nuova posizione, usando il valore zero
745 per \param{offset} si può riottenere la posizione corrente nel file chiamando
746 la funzione con \code{lseek(fd, 0, SEEK\_CUR)}.
747
748 Si tenga presente inoltre che usare \const{SEEK\_END} non assicura affatto che
749 la successiva scrittura avvenga alla fine del file, infatti se questo è stato
750 aperto anche da un altro processo che vi ha scritto, la fine del file può
751 essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
752 (questa è una potenziale sorgente di \itindex{race~condition} \textit{race
753   condition}, vedi sez.~\ref{sec:file_atomic}).
754
755 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
756 questo caso la funzione ritorna l'errore \errcode{ESPIPE}. Questo, oltre che
757 per i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che
758 non supportano questa funzione, come ad esempio per i file di
759 terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso
760   ritornano il numero di caratteri che vi sono stati scritti.} Lo standard
761 POSIX però non specifica niente in proposito. Inoltre alcuni
762 \index{file!speciali} file speciali, ad esempio \file{/dev/null}, non causano
763 un errore ma restituiscono un valore indefinito.
764
765 \itindbeg{sparse~file} 
766
767 Infine si tenga presente che, come accennato in sez.~\ref{sec:file_file_size},
768 con \func{lseek} è possibile impostare una posizione anche oltre la corrente
769 fine del file; ed in tal caso alla successiva scrittura il file sarà esteso a
770 partire da detta posizione. In questo caso si ha quella che viene chiamata la
771 creazione di un \index{file!\textit{hole}} \textsl{buco} nel file, accade cioè
772 che nonostante la dimensione del file sia cresciuta in seguito alla scrittura
773 effettuata, lo spazio vuoto fra la precedente fine del file ed la nuova parte
774 scritta dopo lo spostamento, non corrisponda ad una allocazione effettiva di
775 spazio su disco, che sarebbe inutile dato che quella zona è effettivamente
776 vuota.
777
778 Questa è una delle caratteristiche spcifiche della gestione dei file di un
779 sistema unix-like, ed in questo caso si ha appunto quello che in gergo si
780 chiama un \index{file!\textit{hole}} \textit{hole} nel file e si dice che il
781 file in questione è uno \textit{sparse file}. In sostanza, se si ricorda la
782 struttura di un filesystem illustrata in fig.~\ref{fig:file_filesys_detail},
783 quello che accade è che nell'\textit{inode} del file viene segnata
784 l'allocazione di un blocco di dati a partire dalla nuova posizione, ma non
785 viene allocato nulla per le posizioni intermedie; in caso di lettura
786 sequenziale del contenuto del file il kernel si accorgerà della presenza del
787 buco, e restituirà degli zeri come contenuto di quella parte del file.
788
789 Questa funzionalità comporta una delle caratteristiche della gestione dei file
790 su Unix che spesso genera più confusione in chi non la conosce, per cui
791 sommando le dimensioni dei file si può ottenere, se si hanno molti
792 \textit{sparse file}, un totale anche maggiore della capacità del proprio
793 disco e comunque maggiore della dimensione che riporta un comando come
794 \cmd{du}, che calcola lo spazio disco occupato in base al numero dei blocchi
795 effettivamente allocati per il file.
796
797 Questo avviene proprio perché in un sistema unix-like la dimensione di un file
798 è una caratteristica del tutto indipendente dalla quantità di spazio disco
799 effettivamente allocato, e viene registrata sull'\textit{inode} come le altre
800 proprietà del file. La dimensione viene aggiornata automaticamente quando si
801 estende un file scrivendoci, e viene riportata dal campo \var{st\_size} di una
802 struttura \struct{stat} quando si effettua chiamata ad una delle funzioni
803 \texttt{*stat} viste in sez.~\ref{sec:file_stat}.
804
805 Questo comporta che in generale, fintanto che lo si è scritto sequenzialmente,
806 la dimensione di un file sarà più o meno corrispondente alla quantità di
807 spazio disco da esso occupato, ma esistono dei casi, come questo in cui ci si
808 sposta in una posizione oltre la fine corrente del file, o come quello
809 accennato in in sez.~\ref{sec:file_file_size} in cui si estende la dimensione
810 di un file con una \func{truncate}, in cui in sostanza di modifica il valore
811 della dimensione di \var{st\_size} senza allocare spazio su disco. Questo
812 consente di creare inizialmente file di dimensioni anche molto grandi, senza
813 dover occupare da subito dello spazio disco che in realtà sarebbe
814 inutilizzato.
815
816 \itindend{sparse~file}
817
818
819 \subsection{Le funzioni per la lettura}
820 \label{sec:file_read}
821
822 Una volta che un file è stato aperto (con il permesso in lettura) si possono
823 leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui
824 prototipo è:
825 \begin{prototype}{unistd.h}{ssize\_t read(int fd, void * buf, size\_t count)}
826   
827   Cerca di leggere \param{count} byte dal file \param{fd} al buffer
828   \param{buf}.
829   
830   \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
831     $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
832   \begin{errlist}
833   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
834     aver potuto leggere qualsiasi dato.
835   \item[\errcode{EAGAIN}] la funzione non aveva nessun dato da restituire e si
836     era aperto il file in modalità \const{O\_NONBLOCK}.
837   \end{errlist}
838   ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
839   \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori dipendenti dalla
840   natura dell'oggetto connesso a \param{fd}.}
841 \end{prototype}
842
843 La funzione tenta di leggere \param{count} byte a partire dalla posizione
844 corrente nel file. Dopo la lettura la posizione sul file è spostata
845 automaticamente in avanti del numero di byte letti. Se \param{count} è zero la
846 funzione restituisce zero senza nessun altro risultato.  Si deve sempre tener
847 presente che non è detto che la funzione \func{read} restituisca sempre il
848 numero di byte richiesto, ci sono infatti varie ragioni per cui la funzione
849 può restituire un numero di byte inferiore; questo è un comportamento normale,
850 e non un errore, che bisogna sempre tenere presente.  
851
852 La prima e più ovvia di queste ragioni è che si è chiesto di leggere più byte
853 di quanto il file ne contenga. In questo caso il file viene letto fino alla
854 sua fine, e la funzione ritorna regolarmente il numero di byte letti
855 effettivamente. Raggiunta la fine del file, alla ripetizione di un'operazione
856 di lettura, otterremmo il ritorno immediato di \func{read} con uno zero.  La
857 condizione di raggiungimento della fine del file non è un errore, e viene
858 segnalata appunto da un valore di ritorno di \func{read} nullo. Ripetere
859 ulteriormente la lettura non avrebbe nessun effetto se non quello di
860 continuare a ricevere zero come valore di ritorno.
861
862 Con i \textsl{file regolari} questa è l'unica situazione in cui si può avere
863 un numero di byte letti inferiore a quello richiesto, ma questo non è vero
864 quando si legge da un terminale, da una fifo o da una pipe. In tal caso
865 infatti, se non ci sono dati in ingresso, la \func{read} si blocca (a meno di
866 non aver selezionato la modalità non bloccante, vedi
867 sez.~\ref{sec:file_noblocking}) e ritorna solo quando ne arrivano; se il numero
868 di byte richiesti eccede quelli disponibili la funzione ritorna comunque, ma
869 con un numero di byte inferiore a quelli richiesti.
870
871 Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un socket,
872 come vedremo in sez.~\ref{sec:sock_io_behav}), o per la lettura da certi file
873 di dispositivo, come le unità a nastro, che restituiscono sempre i dati ad un
874 singolo blocco alla volta, o come le linee seriali, che restituiscono solo i
875 dati ricevuti fino al momento della lettura.
876
877 Infine anche le due condizioni segnalate dagli errori \errcode{EINTR} ed
878 \errcode{EAGAIN} non sono propriamente degli errori. La prima si verifica
879 quando la \func{read} è bloccata in attesa di dati in ingresso e viene
880 interrotta da un segnale; in tal caso l'azione da intraprendere è quella di
881 rieseguire la funzione.  Torneremo in dettaglio sull'argomento in
882 sez.~\ref{sec:sig_gen_beha}.  La seconda si verifica quando il file è aperto
883 in modalità non bloccante (vedi sez.~\ref{sec:file_noblocking}) e non ci sono
884 dati in ingresso: la funzione allora ritorna immediatamente con un errore
885 \errcode{EAGAIN}\footnote{in BSD si usa per questo errore la costante
886   \errcode{EWOULDBLOCK}, in Linux, con le \acr{glibc}, questa è sinonima di
887   \errcode{EAGAIN}.} che indica soltanto che non essendoci al momento dati
888 disponibili occorre provare a ripetere la lettura in un secondo tempo.
889
890 La funzione \func{read} è una delle system call fondamentali, esistenti fin
891 dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix
892   Specification}\footnote{questa funzione, e l'analoga \func{pwrite} sono
893   state aggiunte nel kernel 2.1.60, il supporto nelle \acr{glibc}, compresa
894   l'emulazione per i vecchi kernel che non hanno la system call, è stato
895   aggiunto con la versione 2.1, in versioni precedenti sia del kernel che
896   delle librerie la funzione non è disponibile.} (quello che viene chiamato
897 normalmente Unix98, vedi sez.~\ref{sec:intro_xopen}) è stata introdotta la
898 definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo è:
899 \begin{prototype}{unistd.h}
900 {ssize\_t pread(int fd, void * buf, size\_t count, off\_t offset)}
901
902 Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
903 posizione \param{offset}, nel buffer \param{buf}.
904   
905 \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
906   $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
907   visti per \func{read} e \func{lseek}.}
908 \end{prototype}
909
910 La funzione prende esattamente gli stessi argomenti di \func{read} con lo
911 stesso significato, a cui si aggiunge l'argomento \param{offset} che indica
912 una posizione sul file. Identico è il comportamento ed il valore di
913 ritorno. La funzione serve quando si vogliono leggere dati dal file senza
914 modificare la posizione corrente.
915
916 L'uso di \func{pread} è equivalente all'esecuzione di una \func{read} seguita
917 da una \func{lseek} che riporti al valore precedente la posizione corrente sul
918 file, ma permette di eseguire l'operazione atomicamente. Questo può essere
919 importante quando la posizione sul file viene condivisa da processi diversi
920 (vedi sez.~\ref{sec:file_sharing}).  Il valore di
921 \param{offset} fa sempre riferimento all'inizio del file.
922
923 La funzione \func{pread} è disponibile anche in Linux, però diventa
924 accessibile solo attivando il supporto delle estensioni previste dalle
925 \textit{Single Unix Specification} con la definizione della macro:
926 \begin{verbatim}
927 #define _XOPEN_SOURCE 500
928 \end{verbatim}
929 e si ricordi di definire questa macro prima dell'inclusione del file di
930 dichiarazioni \headfile{unistd.h}.
931
932
933
934 \subsection{Le funzioni per la scrittura}
935 \label{sec:file_write}
936
937 Una volta che un file è stato aperto (con il permesso in scrittura) si può
938 scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
939 \begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)}
940   
941   Scrive \param{count} byte dal buffer \param{buf} sul file \param{fd}.
942   
943   \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo
944     e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
945     valori:
946   \begin{errlist}
947   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
948     la scrittura.
949   \item[\errcode{EFBIG}] si è cercato di scrivere oltre la dimensione massima
950     consentita dal filesystem o il limite per le dimensioni dei file del
951     processo o su una posizione oltre il massimo consentito.
952   \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è
953     chiuso in lettura; in questo caso viene anche generato il segnale
954     \signal{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
955     funzione ritorna questo errore.
956   \item[\errcode{EINTR}] si è stati interrotti da un segnale prima di aver
957     potuto scrivere qualsiasi dato.
958   \item[\errcode{EAGAIN}] ci si sarebbe bloccati, ma il file era aperto in
959     modalità \const{O\_NONBLOCK}.
960   \end{errlist}
961   ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
962   \errval{ENOSPC}, \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori
963   dipendenti dalla natura dell'oggetto connesso a \param{fd}.}
964 \end{prototype}
965
966 Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte
967 a partire dalla posizione corrente nel file e sposta automaticamente la
968 posizione in avanti del numero di byte scritti. Se il file è aperto in
969 modalità \itindex{append~mode} \const{O\_APPEND} i dati vengono sempre scritti
970 alla fine del file.  Lo standard POSIX richiede che i dati scritti siano
971 immediatamente disponibili ad una \func{read} chiamata dopo che la
972 \func{write} che li ha scritti è ritornata; ma dati i meccanismi di caching
973 non è detto che tutti i filesystem supportino questa capacità.
974
975 Se \param{count} è zero la funzione restituisce zero senza fare nient'altro.
976 Per i file ordinari il numero di byte scritti è sempre uguale a quello
977 indicato da \param{count}, a meno di un errore. Negli altri casi si ha lo
978 stesso comportamento di \func{read}.
979
980 Anche per \func{write} lo standard Unix98 definisce un'analoga \funcd{pwrite}
981 per scrivere alla posizione indicata senza modificare la posizione corrente
982 nel file, il suo prototipo è:
983 \begin{prototype}{unistd.h}
984 {ssize\_t pwrite(int fd, void * buf, size\_t count, off\_t offset)}
985   
986 Cerca di scrivere sul file \param{fd}, a partire dalla posizione
987 \param{offset}, \param{count} byte dal buffer \param{buf}.
988   
989 \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
990   $-1$ in caso di errore, nel qual caso \var{errno} assumerà i valori già
991   visti per \func{write} e \func{lseek}.}
992 \end{prototype}
993 \noindent e per essa valgono le stesse considerazioni fatte per \func{pread}.
994
995
996 \section{Caratteristiche avanzate}
997 \label{sec:file_adv_func}
998
999 In questa sezione approfondiremo alcune delle caratteristiche più sottili
1000 della gestione file in un sistema unix-like, esaminando in dettaglio il
1001 comportamento delle funzioni base, inoltre tratteremo le funzioni che
1002 permettono di eseguire alcune operazioni avanzate con i file (il grosso
1003 dell'argomento sarà comunque affrontato in cap.~\ref{cha:file_advanced}).
1004
1005
1006 \subsection{La condivisione dei files}
1007 \label{sec:file_sharing}
1008
1009 In sez.~\ref{sec:file_fd} abbiamo descritto brevemente l'architettura
1010 dell'interfaccia con i file da parte di un processo, mostrando in
1011 fig.~\ref{fig:file_proc_file} le principali strutture usate dal kernel;
1012 esamineremo ora in dettaglio le conseguenze che questa architettura ha nei
1013 confronti dell'accesso allo stesso file da parte di processi diversi.
1014
1015 \begin{figure}[!htb]
1016   \centering
1017   \includegraphics[width=15cm]{img/filemultacc}
1018   \caption{Schema dell'accesso allo stesso file da parte di due processi 
1019     diversi}
1020   \label{fig:file_mult_acc}
1021 \end{figure}
1022
1023 Il primo caso è quello in cui due processi diversi aprono lo stesso file su
1024 disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
1025 situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
1026 processo avrà una sua voce nella \textit{file table} referenziata da un
1027 diverso file descriptor nella sua \kstruct{file\_struct}. Entrambe le voci
1028 nella \itindex{file~table} \textit{file table} faranno però riferimento allo
1029 stesso \itindex{inode} inode su disco.
1030
1031 Questo significa che ciascun processo avrà la sua posizione corrente sul file,
1032 la sua modalità di accesso e versioni proprie di tutte le proprietà che
1033 vengono mantenute nella sua voce della \itindex{file~table} \textit{file
1034   table}. Questo ha conseguenze specifiche sugli effetti della possibile
1035 azione simultanea sullo stesso file, in particolare occorre tenere presente
1036 che:
1037 \begin{itemize}
1038 \item ciascun processo può scrivere indipendentemente; dopo ciascuna
1039   \func{write} la posizione corrente sarà cambiata solo nel processo. Se la
1040   scrittura eccede la dimensione corrente del file questo verrà esteso
1041   automaticamente con l'aggiornamento del campo \var{i\_size} \itindex{inode}
1042   nell'inode.
1043 \item se un file è in modalità \itindex{append~mode} \const{O\_APPEND} tutte
1044   le volte che viene effettuata una scrittura la posizione corrente viene
1045   prima impostata alla dimensione corrente del file letta \itindex{inode}
1046   dall'inode. Dopo la scrittura il file viene automaticamente esteso.
1047 \item l'effetto di \func{lseek} è solo quello di cambiare il campo
1048   \var{f\_pos} nella struttura \kstruct{file} della \itindex{file~table}
1049   \textit{file table}, non c'è nessuna operazione sul file su disco. Quando la
1050   si usa per porsi alla fine del file la posizione viene impostata leggendo la
1051   dimensione corrente \itindex{inode} dall'inode.
1052 \end{itemize}
1053
1054 \begin{figure}[!htb]
1055   \centering
1056   \includegraphics[width=15cm]{img/fileshar}
1057   \caption{Schema dell'accesso ai file da parte di un processo figlio}
1058   \label{fig:file_acc_child}
1059 \end{figure}
1060
1061 Il secondo caso è quello in cui due file descriptor di due processi diversi
1062 puntino alla stessa voce nella \itindex{file~table} \textit{file table};
1063 questo è ad esempio il caso dei file aperti che vengono ereditati dal processo
1064 figlio all'esecuzione di una \func{fork} (si ricordi quanto detto in
1065 sez.~\ref{sec:proc_fork}). La situazione è illustrata in
1066 fig.~\ref{fig:file_acc_child}; dato che il processo figlio riceve una copia
1067 dello spazio di indirizzi del padre, riceverà anche una copia di
1068 \kstruct{file\_struct} e relativa tabella dei file aperti.
1069
1070 In questo modo padre e figlio avranno gli stessi file descriptor che faranno
1071 riferimento alla stessa voce nella \textit{file table}, condividendo così la
1072 posizione corrente sul file. Questo ha le conseguenze descritte a suo tempo in
1073 sez.~\ref{sec:proc_fork}: in caso di scrittura contemporanea la posizione
1074 corrente nel file varierà per entrambi i processi (in quanto verrà modificato
1075 \var{f\_pos} che è lo stesso per entrambi).
1076
1077 Si noti inoltre che anche i \itindex{file~status~flag} flag di stato del file
1078 (quelli impostati dall'argomento \param{flag} di \func{open}) essendo tenuti
1079 nella voce della \textit{file table}\footnote{per la precisione nel campo
1080   \var{f\_flags} di \kstruct{file}, vedi fig.~\ref{fig:kstruct_file}.},
1081 vengono in questo caso condivisi. Ai file però sono associati anche altri
1082 flag, dei quali l'unico usato al momento è \const{FD\_CLOEXEC}, detti
1083 \index{file~descriptor~flags} \textit{file descriptor flags}. Questi ultimi
1084 sono tenuti invece in \kstruct{file\_struct}, e perciò sono specifici di
1085 ciascun processo e non vengono modificati dalle azioni degli altri anche in
1086 caso di condivisione della stessa voce della \textit{file table}.
1087
1088
1089
1090 \subsection{Operazioni atomiche con i file}
1091 \label{sec:file_atomic}
1092
1093 Come si è visto in un sistema unix-like è sempre possibile per più processi
1094 accedere in contemporanea allo stesso file, e che le operazioni di lettura e
1095 scrittura possono essere fatte da ogni processo in maniera autonoma in base
1096 ad una posizione corrente nel file che è locale a ciascuno di essi.
1097
1098 Se dal punto di vista della lettura dei dati questo non comporta nessun
1099 problema, quando si andrà a scrivere le operazioni potranno mescolarsi in
1100 maniera imprevedibile.  Il sistema però fornisce in alcuni casi la possibilità
1101 di eseguire alcune operazioni di scrittura in maniera coordinata anche senza
1102 utilizzare meccanismi di sincronizzazione più complessi (come il
1103 \itindex{file~locking} \textit{file locking}, che esamineremo in
1104 sez.~\ref{sec:file_locking}).
1105
1106 Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui
1107 vari processi devono scrivere alla fine di un file (ad esempio un file di
1108 log). Come accennato in sez.~\ref{sec:file_lseek} impostare la posizione alla
1109 fine del file e poi scrivere può condurre ad una \itindex{race~condition}
1110 \textit{race condition}: infatti può succedere che un secondo processo scriva
1111 alla fine del file fra la \func{lseek} e la \func{write}; in questo caso, come
1112 abbiamo appena visto, il file sarà esteso, ma il nostro primo processo avrà
1113 ancora la posizione corrente impostata con la \func{lseek} che non corrisponde
1114 più alla fine del file, e la successiva \func{write} sovrascriverà i dati del
1115 secondo processo.
1116
1117 Il problema è che usare due system call in successione non è un'operazione
1118 atomica; il problema è stato risolto introducendo la modalità
1119 \itindex{append~mode} \const{O\_APPEND}. In questo caso infatti, come abbiamo
1120 descritto in precedenza, è il kernel che aggiorna automaticamente la posizione
1121 alla fine del file prima di effettuare la scrittura, e poi estende il file.
1122 Tutto questo avviene all'interno di una singola system call (la \func{write})
1123 che non essendo interrompibile da un altro processo costituisce un'operazione
1124 atomica.
1125
1126 Un altro caso tipico in cui è necessaria l'atomicità è quello in cui si vuole
1127 creare un \textsl{file di lock} \index{file!di lock}, bloccandosi se il file
1128 esiste. In questo caso la sequenza logica porterebbe a verificare prima
1129 l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
1130 di nuovo avremmo la possibilità di una \itindex{race~condition} \textit{race
1131   condition} da parte di un altro processo che crea lo stesso file fra il
1132 controllo e la creazione.
1133
1134 Per questo motivo sono stati introdotti per \func{open} i due flag
1135 \const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
1136 dell'esistenza del file (con relativa uscita dalla funzione con un errore) e
1137 creazione in caso di assenza, diventa atomica essendo svolta tutta all'interno
1138 di una singola system call (per i dettagli sull'uso di questa caratteristica
1139 si veda sez.~\ref{sec:ipc_file_lock}).
1140
1141
1142 \subsection{Le funzioni \func{sync} e \func{fsync}}
1143 \label{sec:file_sync}
1144
1145 % TODO, aggiungere syncfs, introdotta con il 2.6.39
1146
1147 Come accennato in sez.~\ref{sec:file_close} tutte le operazioni di scrittura
1148 sono in genere bufferizzate dal kernel, che provvede ad effettuarle in maniera
1149 asincrona (ad esempio accorpando gli accessi alla stessa zona del disco) in un
1150 secondo tempo rispetto al momento della esecuzione della \func{write}.
1151
1152 Per questo motivo, quando è necessaria una sincronizzazione dei dati, il
1153 sistema mette a disposizione delle funzioni che provvedono a forzare lo
1154 scarico dei dati dai buffer del kernel.\footnote{come già accennato neanche
1155   questo dà la garanzia assoluta che i dati siano integri dopo la chiamata,
1156   l'hardware dei dischi è in genere dotato di un suo meccanismo interno di
1157   ottimizzazione per l'accesso al disco che può ritardare ulteriormente la
1158   scrittura effettiva.} La prima di queste funzioni è \funcd{sync} il cui
1159 prototipo è:
1160 \begin{prototype}{unistd.h}{int sync(void)}
1161   
1162   Sincronizza il buffer della cache dei file col disco.
1163   
1164   \bodydesc{La funzione ritorna sempre zero.}
1165 \end{prototype}
1166 \noindent  i vari standard prevedono che la funzione si limiti a far partire
1167 le operazioni, ritornando immediatamente; in Linux (dal kernel 1.3.20) invece
1168 la funzione aspetta la conclusione delle operazioni di sincronizzazione del
1169 kernel.
1170
1171 La funzione viene usata dal comando \cmd{sync} quando si vuole forzare
1172 esplicitamente lo scarico dei dati su disco, o dal demone di sistema
1173 \cmd{update} che esegue lo scarico dei dati ad intervalli di tempo fissi: il
1174 valore tradizionale, usato da BSD, per l'update dei dati è ogni 30 secondi, ma
1175 in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a
1176   partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di
1177 tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento
1178 può essere controllato attraverso il file \sysctlfile{vm/bdflush} (per
1179 il significato dei valori si può leggere la documentazione allegata al kernel
1180 in \file{Documentation/sysctl/vm.txt}).
1181
1182 Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
1183 sicuri che i dati di un database sono stati registrati su disco) si possono
1184 usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
1185 \begin{functions}
1186   \headdecl{unistd.h}
1187   \funcdecl{int fsync(int fd)}
1188   Sincronizza dati e meta-dati del file \param{fd}
1189   \funcdecl{int fdatasync(int fd)}
1190   Sincronizza i dati del file \param{fd}.
1191   
1192   \bodydesc{La funzione ritorna 0 in caso di successo e $-1$ in caso di
1193     errore, nel qual caso \var{errno} assume i valori:
1194   \begin{errlist}
1195   \item[\errcode{EINVAL}] \param{fd} è un \index{file!speciali} file speciale
1196     che non supporta la sincronizzazione.
1197   \end{errlist}
1198   ed inoltre \errval{EBADF}, \errval{EROFS} e \errval{EIO}.}
1199 \end{functions}
1200
1201 Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del
1202 file specificato, ed attendono fino alla conclusione delle operazioni;
1203 \func{fsync} forza anche la sincronizzazione dei meta-dati del file (che
1204 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
1205 altri dati contenuti \itindex{inode} nell'inode che si leggono con \func{fstat},
1206 come i tempi del file).
1207
1208 Si tenga presente che questo non comporta la sincronizzazione della
1209 directory che contiene il file (e scrittura della relativa voce su
1210 disco) che deve essere effettuata esplicitamente.\footnote{in realtà per
1211   il filesystem \acr{ext2}, quando lo si monta con l'opzione \cmd{sync},
1212   il kernel provvede anche alla sincronizzazione automatica delle voci
1213   delle directory.}
1214
1215
1216 \subsection{Le funzioni \func{dup} e \func{dup2}}
1217 \label{sec:file_dup}
1218
1219 Abbiamo già visto in sez.~\ref{sec:file_sharing} come un processo figlio
1220 condivida gli stessi file descriptor del padre; è possibile però ottenere un
1221 comportamento analogo all'interno di uno stesso processo \textit{duplicando}
1222 un file descriptor. Per far questo si usa la funzione \funcd{dup} il cui
1223 prototipo è:
1224 \begin{prototype}{unistd.h}{int dup(int oldfd)}
1225   Crea una copia del file descriptor \param{oldfd}.
1226   
1227   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
1228     $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei
1229     valori:
1230   \begin{errlist}
1231   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto.
1232   \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
1233     descriptor aperti.
1234   \end{errlist}}
1235 \end{prototype}
1236
1237 La funzione ritorna, come \func{open}, il primo file descriptor libero. Il
1238 file descriptor è una copia esatta del precedente ed entrambi possono essere
1239 interscambiati nell'uso. Per capire meglio il funzionamento della funzione si
1240 può fare riferimento a fig.~\ref{fig:file_dup}: l'effetto della funzione è
1241 semplicemente quello di copiare il valore nella struttura
1242 \kstruct{file\_struct}, cosicché anche il nuovo file descriptor fa riferimento
1243 alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
1244 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
1245
1246 \begin{figure}[!htb]
1247   \centering \includegraphics[width=14cm]{img/filedup}
1248   \caption{Schema dell'accesso ai file duplicati}
1249   \label{fig:file_dup}
1250 \end{figure}
1251
1252 Si noti che per quanto illustrato in fig.~\ref{fig:file_dup} i file descriptor
1253 duplicati condivideranno eventuali lock, \textit{file status flag}, e
1254 posizione corrente. Se ad esempio si esegue una \func{lseek} per modificare la
1255 posizione su uno dei due file descriptor, essa risulterà modificata anche
1256 sull'altro (dato che quello che viene modificato è lo stesso campo nella voce
1257 della \textit{file table} a cui entrambi fanno riferimento). L'unica
1258 differenza fra due file descriptor duplicati è che ciascuno avrà il suo
1259 \textit{file descriptor flag}; a questo proposito va specificato che nel caso
1260 di \func{dup} il flag di \textit{close-on-exec} \itindex{close-on-exec} (vedi
1261 sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre cancellato
1262 nella copia.
1263
1264 L'uso principale di questa funzione è per la redirezione dell'input e
1265 dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
1266 diventa così possibile associare un file (o una pipe) allo standard input o
1267 allo standard output (torneremo sull'argomento in sez.~\ref{sec:ipc_pipe_use},
1268 quando tratteremo le pipe). Per fare questo in genere occorre prima chiudere
1269 il file che si vuole sostituire, cosicché il suo file descriptor possa esser
1270 restituito alla chiamata di \func{dup}, come primo file descriptor
1271 disponibile.
1272
1273 Dato che questa è l'operazione più comune, è prevista una diversa versione
1274 della funzione, \funcd{dup2}, che permette di specificare esplicitamente
1275 qual è il valore di file descriptor che si vuole avere come duplicato; il suo
1276 prototipo è:
1277 \begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
1278   
1279   Rende \param{newfd} una copia del file descriptor \param{oldfd}.
1280   
1281   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
1282     $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
1283   \begin{errlist}
1284   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha
1285     un valore fuori dall'intervallo consentito per i file descriptor.
1286   \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
1287     descriptor aperti.
1288   \end{errlist}}
1289 \end{prototype}
1290 \noindent e qualora il file descriptor \param{newfd} sia già aperto (come
1291 avviene ad esempio nel caso della duplicazione di uno dei file standard) esso
1292 sarà prima chiuso e poi duplicato (così che il file duplicato sarà connesso
1293 allo stesso valore per il file descriptor).
1294
1295 La duplicazione dei file descriptor può essere effettuata anche usando la
1296 funzione di controllo dei file \func{fcntl} (che esamineremo in
1297 sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}.  L'operazione ha
1298 la sintassi \code{fcntl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
1299 \param{newfd} diventa equivalente a \func{dup}. 
1300
1301 La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
1302   diversi codici di errore.} è che \func{dup2} chiude il file descriptor
1303 \param{newfd} se questo è già aperto, garantendo che la duplicazione sia
1304 effettuata esattamente su di esso, invece \func{fcntl} restituisce il primo
1305 file descriptor libero di valore uguale o maggiore di \param{newfd} (e se
1306 \param{newfd} è aperto la duplicazione avverrà su un altro file descriptor).
1307
1308
1309
1310 \subsection{Le funzioni \func{openat}, \func{mkdirat} e affini}
1311 \label{sec:file_openat}
1312
1313 \itindbeg{at-functions}
1314
1315 Un problema che si pone con l'uso della funzione \func{open}, così come per
1316 molte altre funzioni che accettano come argomenti dei
1317 \itindsub{pathname}{relativo} \textit{pathname} relativi, è che, quando un
1318 \textit{pathname} relativo non fa riferimento alla \index{directory~di~lavoro}
1319 directory di lavoro corrente, è possibile che alcuni dei suoi componenti
1320 vengano modificati in parallelo alla chiamata a \func{open}, e questo lascia
1321 aperta la possibilità di una \itindex{race~condition} \textit{race condition}.
1322
1323 Inoltre come già accennato, la \index{directory~di~lavoro} directory di lavoro
1324 corrente è una proprietà del singolo processo; questo significa che quando si
1325 lavora con i \itindex{thread} \textit{thread} essa sarà la stessa per tutti,
1326 ma esistono molti casi in cui sarebbe invece utile che ogni singolo
1327 \itindex{thread} \textit{thread} avesse la sua \index{directory~di~lavoro}
1328 directory di lavoro.
1329
1330 Per risolvere questi problemi, riprendendo una interfaccia già presente in
1331 Solaris, a fianco delle normali funzioni che operano sui file (come
1332 \func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
1333 funzioni, dette anche funzioni ``\textit{at}'' in quanto contraddistinte dal
1334 suffisso \texttt{at}, che permettono l'apertura di un file (o le rispettive
1335 altre operazioni) usando un \itindsub{pathname}{relativo} \textit{pathname}
1336 relativo ad una directory specificata.\footnote{l'introduzione è avvenuta su
1337   proposta dello sviluppatore principale delle \acr{glibc} Urlich Drepper; le
1338   corrispondenti system call sono state inserite nel kernel ufficiale a
1339   partire dalla versione 2.6.16, in precedenza era disponibile una emulazione
1340   che, sia pure con prestazioni inferiori, funzionava facendo ricorso all'uso
1341   del filesystem \textit{proc} con l'apertura del file attraverso il
1342   riferimento a \textit{pathname} del tipo di
1343   \texttt{/proc/self/fd/dirfd/relative\_path}.} Benché queste funzioni non
1344 siano presenti negli standard tradizionali esse sono state adottate da vari
1345 Unix\footnote{oltre a Linux e Solaris sono presenti in vari BSD.} fino ad
1346 essere incluse nella recente revisione (la POSIX.1-2008) dello standard
1347 POSIX.1; con le \acr{glibc} per l'accesso a queste funzioni è necessario
1348 definire la macro \macro{\_ATFILE\_SOURCE}.
1349
1350 L'uso di queste funzioni prevede una apertura iniziale della directory che
1351 sarà la base della risoluzione dei \itindsub{pathname}{relativo}
1352 \textit{pathname} relativi che verranno usati in seguito, dopo di che si dovrà
1353 passare il relativo file descriptor alle varie funzioni che useranno quella
1354 directory come punto di partenza per la risoluzione.\footnote{in questo modo,
1355   anche quando si lavora con i \itindex{thread} \textit{thread}, si può
1356   mantenere una \index{directory~di~lavoro} directory di lavoro diversa per
1357   ciascuno di essi.}
1358
1359 Questo metodo, oltre a risolvere i problemi di \itindex{race~condition}
1360 \textit{race condition}, consente anche di ottenere aumenti di prestazioni
1361 significativi quando si devono eseguire molte operazioni su sezioni
1362 dell'albero dei file che prevedono delle gerarchie di sottodirectory molto
1363 profonde; infatti in questo caso basta eseguire la risoluzione del
1364 \textit{pathname} della directory di partenza una sola volta (nell'apertura
1365 iniziale) e non tutte le volte che si deve accedere a ciascun file che essa
1366 contiene.
1367
1368 La sintassi generale di queste nuove funzioni è che esse prevedono come primo
1369 argomento il file descriptor della directory da usare come base, mentre gli
1370 argomenti successivi restano identici a quelli della corrispondente funzione
1371 ordinaria; ad esempio nel caso di \funcd{openat} avremo che essa è definita
1372 come:
1373 \begin{functions}
1374   \headdecl{fcntl.h}
1375   \funcdecl{int openat(int dirfd, const char *pathname, int flags)}
1376   \funcdecl{int openat(int dirfd, const char *pathname, int flags,  mode\_t
1377     mode))} 
1378
1379   Apre un file usando come directory di \index{directory~di~lavoro} lavoro
1380   corrente \param{dirfd}.
1381   
1382   \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
1383     errore di \func{open}, ed in più:
1384   \begin{errlist}
1385   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
1386   \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
1387     \textit{pathname} relativo, ma
1388     \param{dirfd} fa riferimento ad un file. 
1389   \end{errlist}}
1390 \end{functions}
1391
1392 Il comportamento delle nuove funzioni è del tutto analogo a quello delle
1393 corrispettive classiche, con la sola eccezione del fatto che se fra i loro
1394 argomenti si utilizza un \itindsub{pathname}{relativo} \textit{pathname}
1395 relativo questo sarà risolto rispetto alla directory indicata
1396 da \param{dirfd}; qualora invece si usi un \itindsub{pathname}{assoluto}
1397 \textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine
1398 se per
1399 \param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa,
1400   come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h},
1401   pertanto se la si vuole usare occorrerà includere comunque questo file,
1402   anche per le funzioni che non sono definite in esso.} la risoluzione sarà
1403 effettuata rispetto alla directory di \index{directory~di~lavoro} lavoro
1404 corrente del processo.
1405
1406 Così come il comportamento, anche i valori di ritorno e le condizioni di
1407 errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli
1408 errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in
1409 particolare si avrà un errore di \errcode{EBADF} se esso non è un file
1410 descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa
1411 riferimento ad una directory.\footnote{tranne il caso in cui si sia
1412   specificato un \itindsub{pathname}{assoluto} \textit{pathname} assoluto, nel
1413   qual caso, come detto, il valore di \param{dirfd} sarà completamente
1414   ignorato.}
1415
1416 In tab.~\ref{tab:file_atfunc_corr} si sono riportate le funzioni introdotte
1417 con questa nuova interfaccia, con a fianco la corrispondente funzione
1418 classica.\footnote{in realtà, come visto in sez.~\ref{sec:file_temp_file}, le
1419   funzioni \func{utimes} e \func{lutimes} non sono propriamente le
1420   corrispondenti di \func{utimensat}, dato che questa ha una maggiore
1421   precisione nella indicazione dei tempi dei file.} La gran parte di queste
1422 seguono la convenzione appena vista per \func{openat}, in cui agli argomenti
1423 della corrispondente funzione classica viene anteposto
1424 l'argomento \param{dirfd}.\footnote{non staremo pertanto a riportarle una per
1425   una.} Per una parte di queste, indicate dal contenuto della omonima colonna
1426 di tab.~\ref{tab:file_atfunc_corr}, oltre al nuovo argomento iniziale, è
1427 prevista anche l'aggiunta di un ulteriore argomento finale, \param{flags}.
1428
1429 \begin{table}[htb]
1430   \centering
1431   \footnotesize
1432   \begin{tabular}[c]{|l|c|l|}
1433     \hline
1434     \textbf{Funzione} &\textbf{Flags} &\textbf{Corrispondente} \\
1435     \hline
1436     \hline
1437      \func{faccessat} &$\bullet$&\func{access}  \\
1438      \func{fchmodat}  &$\bullet$&\func{chmod}   \\
1439      \func{fchownat}  &$\bullet$&\func{chown},\func{lchown}\\
1440      \func{fstatat}   &$\bullet$&\func{stat},\func{lstat}  \\
1441      \func{utimensat} &$\bullet$&\func{utimes},\func{lutimes}\\
1442      \func{linkat}    &$\bullet$\footnotemark&\func{link}    \\
1443      \funcm{mkdirat}  & --      &\func{mkdir}   \\
1444      \funcm{mknodat}  & --      &\func{mknod}   \\
1445      \func{openat}    & --      &\func{open}    \\
1446      \funcm{readlinkat}& --     &\func{readlink}\\
1447      \funcm{renameat} & --      &\func{rename}  \\
1448      \funcm{symlinkat}& --      &\func{symlink} \\
1449      \func{unlinkat}  &$\bullet$&\func{unlink},\func{rmdir}  \\
1450      \funcm{mkfifoat} & --      &\func{mkfifo}  \\
1451     \hline
1452   \end{tabular}
1453   \caption{Corrispondenze fra le nuove funzioni ``\textit{at}'' e le
1454     corrispettive funzioni classiche.}
1455   \label{tab:file_atfunc_corr}
1456 \end{table}
1457
1458 \footnotetext{in questo caso l'argomento \param{flags} è disponibile ed
1459   utilizzabile solo a partire dal kernel 2.6.18.}
1460
1461 % TODO manca prototipo di fchmodat, verificare se metterlo o metter menzione
1462 % TODO manca prototipo di fstatat, verificare se metterlo o metter menzione
1463 % TODO manca prototipo di linkat, verificare se metterlo o metter menzione
1464 % TODO manca prototipo di utimensat, verificare se metterlo o metter menzione
1465
1466 Per tutte le funzioni che lo prevedono, a parte \func{unlinkat} e
1467 \funcd{faccessat}, l'ulteriore argomento è stato introdotto solo per fornire
1468 un meccanismo con cui modificarne il comportamento nel caso si stia operando
1469 su un collegamento simbolico, così da poter scegliere se far agire la funzione
1470 direttamente sullo stesso o sul file da esso referenziato. Dato che in certi
1471 casi esso può fornire ulteriori indicazioni per modificare il comportamento
1472 delle funzioni, \param{flags} deve comunque essere passato come maschera
1473 binaria, ed impostato usando i valori delle appropriate costanti
1474 \texttt{AT\_*}, definite in \headfile{fcntl.h}.
1475
1476 Come esempio di questo secondo tipo di funzioni possiamo considerare
1477 \funcd{fchownat}, che può essere usata per sostituire sia \func{chown}
1478 che \func{lchown}; il suo prototipo è:
1479 \begin{functions}
1480   \headdecl{unistd.h} \headdecl{fcntl.h} 
1481
1482   \funcdecl{int fchownat(int dirfd, const char *pathname, uid\_t owner, gid\_t
1483     group, int flags)}
1484
1485   Modifica la proprietà di un file.
1486   
1487   \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
1488     errore di \func{chown}, ed in più:
1489   \begin{errlist}
1490   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
1491   \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
1492   \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
1493     \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. 
1494   \end{errlist}}
1495 \end{functions}
1496
1497 In questo caso il valore di \param{flags} stabilisce il comportamento della
1498 funzione quando la si applica ad un collegamento simbolico, e l'unico valore
1499 utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}\footnote{in \headfile{fcntl.h} è
1500   definito anche \const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i
1501   collegamenti simbolici, essendo questo però il comportamento adottato per un
1502   valore nullo di \param{flags} questo valore non viene mai usato.} che se
1503 impostato indica alla funzione di non eseguire la dereferenziazione di un
1504 eventuale collegamento simbolico, facendo comportare \func{fchownat} come
1505 \func{lchown} invece che come \func{chown}.
1506
1507 Come accennato fra tutte quelle marcate in tab.~\ref{tab:file_atfunc_corr}
1508 solo due funzioni possono usare l'argomento \param{flags} con valori diversi
1509 da \const{AT\_SYMLINK\_NOFOLLOW}, la prima di queste è \funcd{faccessat}, ed
1510 il suo prototipo è:
1511 \begin{functions}
1512   \headdecl{unistd.h}
1513   \funcdecl{int faccessat(int dirfd, const char *path, int mode, int flags)}
1514
1515   Controlla i permessi di accesso.
1516   
1517   \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
1518     errore di \func{access}, ed in più:
1519   \begin{errlist}
1520   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
1521   \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
1522   \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
1523     \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file. 
1524   \end{errlist}}
1525 \end{functions}
1526
1527 La funzione esegue lo stesso controllo di accesso effettuabile con
1528 \func{access}, ma si può utilizzare l'argomento \param{flags} per modificarne
1529 il comportamento rispetto a quello ordinario di \func{access}. In questo caso
1530 esso può essere specificato come maschera binaria di due valori:
1531 \begin{basedescript}{\desclabelwidth{3.0cm}}
1532 \item[\const{AT\_EACCES}] se impostato \funcd{faccessat} esegue il controllo
1533   dei permessi usando l'\ids{UID} effettivo invece di quello reale (il
1534   comportamento di default, che riprende quello di \func{access}).
1535 \item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue
1536   la dereferenziazione dei collegamenti simbolici, effettuando il controllo
1537   dei permessi direttamente sugli stessi.
1538 \end{basedescript}
1539
1540 La seconda eccezione è \func{unlinkat}, in questo caso l'ulteriore
1541 argomento \param{flags} viene utilizzato perché tramite esso la funzione possa
1542 comportarsi sia come analogo di \func{unlink} che di \func{rmdir}; il suo
1543 prototipo è:
1544 \begin{functions}
1545   \headdecl{fcntl.h}
1546   \funcdecl{int unlinkat(int dirfd, const char *pathname, int flags)}
1547
1548   Rimuove una voce da una directory.
1549   
1550   \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di
1551     errore di \func{unlink} o di \func{rmdir} a seconda del valore di
1552     \param{flags}, ed in più:
1553   \begin{errlist}
1554   \item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
1555   \item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
1556   \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
1557     \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
1558   \end{errlist}}
1559 \end{functions}
1560
1561 Di default il comportamento di \func{unlinkat} è equivalente a quello che
1562 avrebbe \func{unlink} applicata a \param{pathname}, fallendo in tutti i casi
1563 in cui questo è una directory, se però si imposta \param{flags} al valore di
1564 \const{AT\_REMOVEDIR},\footnote{anche se \param{flags} è una maschera binaria,
1565   essendo questo l'unico flag disponibile per questa funzione, lo si può
1566   assegnare direttamente.}  essa si comporterà come \func{rmdir}, in tal
1567 caso \param{pathname} deve essere una directory, che sarà rimossa qualora
1568 risulti vuota.
1569
1570 \itindend{at-functions}
1571
1572
1573 % TODO manca prototipo e motivazione di fexecve, da trattare qui in quanto
1574 % inserita nello stesso standard e da usare con openat, vedi 
1575 % http://pubs.opengroup.org/onlinepubs/9699939699/toc.pdf
1576
1577
1578
1579
1580 \subsection{La funzione \func{fcntl}}
1581 \label{sec:file_fcntl}
1582
1583 Oltre alle operazioni base esaminate in sez.~\ref{sec:file_unix_interface}
1584 esistono tutta una serie di operazioni ausiliarie che è possibile eseguire su
1585 un file descriptor, che non riguardano la normale lettura e scrittura di dati,
1586 ma la gestione sia delle loro proprietà, che di tutta una serie di ulteriori
1587 funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si
1588   gestiscono con questa funzione varie modalità di I/O asincrono (vedi
1589   sez.~\ref{sec:file_asyncronous_operation}) e il \itindex{file~locking}
1590   \textit{file locking} (vedi sez.~\ref{sec:file_locking}).}
1591
1592 Per queste operazioni di manipolazione e di controllo delle varie proprietà e
1593 caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl},
1594 il cui prototipo è:
1595 \begin{functions}
1596   \headdecl{unistd.h}
1597   \headdecl{fcntl.h}
1598   \funcdecl{int fcntl(int fd, int cmd)}
1599   \funcdecl{int fcntl(int fd, int cmd, long arg)}
1600   \funcdecl{int fcntl(int fd, int cmd, struct flock * lock)}
1601   Esegue una delle possibili operazioni specificate da \param{cmd}
1602   sul file \param{fd}.
1603   
1604   \bodydesc{La funzione ha valori di ritorno diversi a seconda
1605     dell'operazione. In caso di errore il valore di ritorno è sempre $-1$ ed
1606     il codice dell'errore è restituito nella variabile \var{errno}; i codici
1607     possibili dipendono dal tipo di operazione, l'unico valido in generale è:
1608   \begin{errlist}
1609   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
1610   \end{errlist}}
1611 \end{functions}
1612
1613
1614 Il primo argomento della funzione è sempre il numero di file descriptor
1615 \var{fd} su cui si vuole operare. Il comportamento di questa funzione, il
1616 numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori
1617 sono determinati dal valore dell'argomento \param{cmd} che in sostanza
1618 corrisponde all'esecuzione di un determinato \textsl{comando}; in
1619 sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di \func{fcntl}
1620 per la duplicazione dei file descriptor, una lista di tutti i possibili valori
1621 per \var{cmd} è riportata di seguito:
1622 \begin{basedescript}{\desclabelwidth{2.0cm}}
1623 \item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
1624   maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il
1625   nuovo file descriptor in caso di successo e $-1$ in caso di errore. Gli
1626   errori possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore
1627   del massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
1628   massimo numero di descrittori consentito.
1629 \item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
1630   valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
1631   \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante
1632   \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella
1633   esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}).  Ritorna un
1634   valore nullo in caso di successo e $-1$ in caso di errore.
1635 \item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
1636   \param{fd} o $-1$ in caso di errore; se \const{FD\_CLOEXEC} è impostato i
1637   file descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti
1638   (il comportamento predefinito) restano aperti.
1639 \item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in
1640   caso di successo o $-1$ in caso di errore; permette cioè di rileggere quei
1641   bit impostati da \func{open} all'apertura del file che vengono memorizzati
1642   (quelli riportati nella prima e terza sezione di
1643   tab.~\ref{tab:file_open_flags}).
1644 % TODO toglire riferimeto a tabella flag e mettere altro
1645
1646 \item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore
1647   specificato da \param{arg}, ritorna un valore nullo in caso di successo o
1648   $-1$ in caso di errore. Possono essere impostati solo i bit riportati nella
1649   terza sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di
1650     manuale riporta come impostabili solo \const{O\_APPEND},
1651     \const{O\_NONBLOCK} e \const{O\_ASYNC}.}
1652 % TODO toglire riferimeto a tabella flag e mettere altro
1653
1654 \item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
1655   \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato;
1656   ritorna un valore nullo in caso di successo o $-1$ in caso di errore.  Questa
1657   funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
1658 \item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
1659   specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da
1660   qualcun altro ritorna immediatamente restituendo $-1$ e imposta \var{errno} a
1661   \errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore
1662   nullo. Questa funzionalità è trattata in dettaglio in
1663   sez.~\ref{sec:file_posix_lock}.
1664 \item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
1665   la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se
1666   l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e
1667   imposta \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore
1668   nullo.  Questa funzionalità è trattata in dettaglio in
1669   sez.~\ref{sec:file_posix_lock}.
1670 \item[\const{F\_GETOWN}] restituisce il \ids{PID} del processo o
1671   l'identificatore del \itindex{process~group} \textit{process
1672     group}\footnote{i \itindex{process~group} \textit{process group} sono
1673     (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
1674     controllo di sessione; a ciascuno di essi è associato un identificatore
1675     (un numero positivo analogo al \ids{PID}).} che è preposto alla ricezione
1676   dei segnali \signal{SIGIO}\footnote{o qualunque altro segnale alternativo
1677     impostato con \const{F\_FSETSIG}.} per gli eventi associati al file
1678   descriptor \param{fd}\footnote{il segnale viene usato sia per il
1679     \textit{Signal Drive I/O}, che tratteremo in
1680     sez.~\ref{sec:file_asyncronous_operation}, e dai vari meccanismi di
1681     notifica asincrona, che tratteremo in
1682     sez.~\ref{sec:file_asyncronous_lease}.} e \signal{SIGURG} per la notifica
1683   dei dati urgenti di un socket.\footnote{vedi
1684     sez.~\ref{sec:TCP_urgent_data}.} Nel caso di un \textit{process group}
1685   viene restituito un valore negativo il cui valore assoluto corrisponde
1686   all'identificatore del \itindex{process~group} \textit{process group}.  In
1687   caso di errore viene restituito $-1$.
1688 \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
1689   l'identificatore del processo o del \itindex{process~group} \textit{process
1690     group} che riceverà i segnali \signal{SIGIO}  e \signal{SIGURG} per gli
1691   eventi associati al file descriptor \param{fd}, ritorna un valore nullo in
1692   caso di successo o $-1$ in caso di errore.  Come per \const{F\_GETOWN}, per
1693   impostare un \itindex{process~group} \textit{process group} si deve usare
1694   per \param{arg} un valore negativo, il cui valore assoluto corrisponde
1695   all'identificatore del \itindex{process~group} \textit{process group}.
1696 \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
1697   sono dati disponibili in ingresso su un file descriptor aperto ed impostato
1698   per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
1699   indica il valore predefinito (che è \signal{SIGIO}), un valore diverso da
1700   zero indica il segnale richiesto, (che può essere anche lo stesso
1701   \signal{SIGIO}). In caso di errore ritorna $-1$.
1702 \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
1703   possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
1704   ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Il
1705   valore zero indica di usare il segnale predefinito, \signal{SIGIO}. Un altro
1706   valore diverso da zero (compreso lo stesso \signal{SIGIO}) specifica il
1707   segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
1708   installato il gestore del segnale come \var{sa\_sigaction} usando
1709   \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere
1710   disponibili al gestore informazioni ulteriori riguardo il file che ha
1711   generato il segnale attraverso i valori restituiti in \struct{siginfo\_t}
1712   (come vedremo in sez.~\ref{sec:file_asyncronous_io}).\footnote{i due comandi
1713     \const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di
1714     Linux.}
1715 \item[\const{F\_SETLEASE}] imposta o rimuove un \itindex{file~lease}
1716   \textit{file lease}\footnote{questa è una nuova funzionalità, specifica di
1717     Linux, e presente solo a partire dai kernel della serie 2.4.x, in cui il
1718     processo che detiene un \textit{lease} su un file riceve una notifica
1719     qualora un altro processo cerca di eseguire una \func{open} o una
1720     \func{truncate} su di esso.} sul file descriptor \var{fd} a seconda del
1721   valore del terzo argomento, che in questo caso è un \ctyp{int}, ritorna un
1722   valore nullo in caso di successo o $-1$ in caso di errore. Questa
1723   funzionalità avanzata è trattata in dettaglio in
1724   sez.~\ref{sec:file_asyncronous_lease}.
1725 \item[\const{F\_GETLEASE}] restituisce il tipo di \itindex{file~lease}
1726   \textit{file lease} che il processo detiene nei confronti del file
1727   descriptor \var{fd} o $-1$ in caso di errore. Con questo comando il terzo
1728   argomento può essere omesso. Questa funzionalità avanzata è trattata in
1729   dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
1730 \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
1731   riportata al processo chiamante, tramite il segnale \signal{SIGIO} (o altro
1732   segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
1733   direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
1734   in essa contenuti; ritorna un valore nullo in caso di successo o $-1$ in caso
1735   di errore. Questa funzionalità avanzata, disponibile dai kernel della serie
1736   2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
1737 \end{basedescript}
1738
1739 La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
1740 poter essere affrontate in tutti i loro aspetti a questo punto; saranno
1741 pertanto riprese più avanti quando affronteremo le problematiche ad esse
1742 relative. In particolare le tematiche relative all'I/O asincrono e ai vari
1743 meccanismi di notifica saranno trattate in maniera esaustiva in
1744 sez.~\ref{sec:file_asyncronous_access} mentre quelle relative al
1745 \itindex{file~locking} \textit{file locking} saranno esaminate in
1746 sez.~\ref{sec:file_locking}). L'uso di questa funzione con i socket verrà
1747 trattato in sez.~\ref{sec:sock_ctrl_func}.
1748
1749 Si tenga presente infine che quando si usa la funzione per determinare le
1750 modalità di accesso con cui è stato aperto il file (attraverso l'uso del
1751 comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel
1752 \textit{file status flag} che si è ottenuto.  Infatti la definizione corrente
1753 di quest'ultimo non assegna bit separati alle tre diverse modalità
1754 \const{O\_RDONLY}, \const{O\_WRONLY} e \const{O\_RDWR}.\footnote{in Linux
1755   queste costanti sono poste rispettivamente ai valori 0, 1 e 2.} Per questo
1756 motivo il valore della modalità di accesso corrente si ottiene eseguendo un
1757 AND binario del valore di ritorno di \func{fcntl} con la maschera
1758 \const{O\_ACCMODE} (anch'essa definita in \headfile{fcntl.h}), che estrae i
1759 bit di accesso dal \textit{file status flag}.
1760
1761
1762
1763 \subsection{La funzione \func{ioctl}}
1764 \label{sec:file_ioctl}
1765
1766 Benché il concetto di \textit{everything is a file} si sia dimostrato molto
1767 valido anche per l'interazione con i dispositivi più vari, fornendo una
1768 interfaccia che permette di interagire con essi tramite le stesse funzioni
1769 usate per i normali file di dati, esisteranno sempre caratteristiche
1770 peculiari, specifiche dell'hardware e della funzionalità che ciascun
1771 dispositivo può provvedere, che non possono venire comprese in questa
1772 interfaccia astratta (un caso tipico è l'impostazione della velocità di una
1773 porta seriale, o le dimensioni di un framebuffer).
1774
1775 Per questo motivo nell'architettura del sistema è stata prevista l'esistenza
1776 di una funzione apposita, \funcd{ioctl}, con cui poter compiere le operazioni
1777 specifiche di ogni dispositivo particolare, usando come riferimento il solito
1778 file descriptor.  Il prototipo di questa funzione è:
1779 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}  
1780
1781   Esegue l'operazione di controllo specificata da \param{request} sul file
1782   descriptor \param{fd}.
1783   
1784   \bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune
1785     operazioni usano però il valore di ritorno per restituire informazioni. In
1786     caso di errore viene sempre restituito $-1$ ed \var{errno} assumerà uno dei
1787     valori:
1788   \begin{errlist}
1789   \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un
1790     dispositivo, o la richiesta non è applicabile all'oggetto a cui fa
1791     riferimento \param{fd}.
1792   \item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono
1793     validi.
1794   \end{errlist}
1795   ed inoltre \errval{EBADF} e \errval{EFAULT}.}
1796 \end{prototype}
1797
1798 La funzione serve in sostanza come meccanismo generico per fare tutte quelle
1799 operazioni che non rientrano nell'interfaccia ordinaria della gestione dei
1800 file e che non è possibile effettuare con le funzioni esaminate finora. La
1801 funzione richiede che si passi come primo argomento un file descriptor
1802 regolarmente aperto, e l'operazione da compiere viene selezionata attraverso
1803 il valore dell'argomento \param{request}. Il terzo argomento dipende
1804 dall'operazione prescelta; tradizionalmente è specificato come \code{char *
1805   argp}, da intendersi come puntatore ad un area di memoria
1806 generica,\footnote{all'epoca della creazione di questa funzione infatti ancora
1807   non era stato introdotto il tipo \ctyp{void}.} ma per certe operazioni può
1808 essere omesso, e per altre è un semplice intero.
1809
1810 Normalmente la funzione ritorna zero in caso di successo e $-1$ in caso di
1811 errore, ma per alcune operazione il valore di ritorno, che nel caso viene
1812 impostato ad un valore positivo, può essere utilizzato come parametro di
1813 uscita. È più comune comunque restituire i risultati all'indirizzo puntato dal
1814 terzo argomento.
1815
1816 Data la genericità dell'interfaccia non è possibile classificare in maniera
1817 sistematica le operazioni che si possono gestire con \func{ioctl}, un breve
1818 elenco di alcuni esempi di esse è il seguente:
1819 \begin{itemize*}
1820 \item il cambiamento dei font di un terminale.
1821 \item l'esecuzione di una traccia audio di un CDROM.
1822 \item i comandi di avanti veloce e riavvolgimento di un nastro.
1823 \item il comando di espulsione di un dispositivo rimovibile.
1824 \item l'impostazione della velocità trasmissione di una linea seriale.
1825 \item l'impostazione della frequenza e della durata dei suoni emessi dallo
1826   speaker.
1827 \item l'impostazione degli attributi dei file su un filesystem
1828   ext2.\footnote{i comandi \texttt{lsattr} e \texttt{chattr} fanno questo con
1829     delle \func{ioctl} dedicate, usabili solo su questo filesystem e derivati
1830     successivi (come ext3).}
1831 \end{itemize*}
1832
1833 In generale ogni dispositivo ha un suo insieme di operazioni specifiche
1834 effettuabili attraverso \func{ioctl}, tutte queste sono definite nell'header
1835 file \headfile{sys/ioctl.h}, e devono essere usate solo sui dispositivi cui
1836 fanno riferimento. Infatti anche se in genere i valori di \param{request} sono
1837 opportunamente differenziati a seconda del dispositivo\footnote{il kernel usa
1838   un apposito \textit{magic number} per distinguere ciascun dispositivo nella
1839   definizione delle macro da usare per \param{request}, in modo da essere
1840   sicuri che essi siano sempre diversi, ed il loro uso per dispositivi diversi
1841   causi al più un errore.  Si veda il capitolo quinto di \cite{LinDevDri} per
1842   una trattazione dettagliata dell'argomento.} così che la richiesta di
1843 operazioni relative ad altri dispositivi usualmente provoca il ritorno della
1844 funzione con una condizione di errore, in alcuni casi, relativi a valori
1845 assegnati prima che questa differenziazione diventasse pratica corrente, si
1846 potrebbero usare valori validi anche per il dispositivo corrente, con effetti
1847 imprevedibili o indesiderati.
1848
1849 Data la assoluta specificità della funzione, il cui comportamento varia da
1850 dispositivo a dispositivo, non è possibile fare altro che dare una descrizione
1851 sommaria delle sue caratteristiche; torneremo ad esaminare in
1852 seguito\footnote{per l'uso di \func{ioctl} con i socket si veda
1853   sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
1854 esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
1855 quasi tutte le implementazioni di Unix), qui riportiamo solo l'elenco delle
1856 operazioni che sono predefinite per qualunque file,\footnote{in particolare
1857   queste operazioni sono definite nel kernel a livello generale, e vengono
1858   sempre interpretate per prime, per cui, come illustrato in \cite{LinDevDri},
1859   eventuali operazioni specifiche che usino lo stesso valore verrebbero
1860   ignorate.}  caratterizzate dal prefisso \texttt{FIO}:
1861 \begin{basedescript}{\desclabelwidth{2.0cm}}
1862 \item[\const{FIOCLEX}] imposta il flag di \itindex{close-on-exec}
1863   \textit{close-on-exec} sul file, in questo caso, essendo usata come
1864   operazione logica, \func{ioctl} non richiede un terzo argomento, il cui
1865   eventuale valore viene ignorato.
1866 \item[\const{FIONCLEX}] cancella il flag di \itindex{close-on-exec}
1867   \textit{close-on-exec} sul file, in questo caso, essendo usata come
1868   operazione logica, \func{ioctl} non richiede un terzo argomento, il cui
1869   eventuale valore viene ignorato.
1870 \item[\const{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul
1871   file (vedi sez.~\ref{sec:file_asyncronous_operation}); il terzo argomento
1872   deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *})
1873   che contiene un valore logico (un valore nullo disabilita, un valore non
1874   nullo abilita).
1875 \item[\const{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non
1876   bloccante; il terzo argomento deve essere un puntatore ad un intero (cioè di
1877   tipo \texttt{const int *}) che contiene un valore logico (un valore nullo
1878   disabilita, un valore non nullo abilita).
1879 \item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali
1880   \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
1881   essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui
1882   valore specifica il PID del processo.
1883 \item[\const{FIOGETOWN}] legge il processo che riceverà i segnali
1884   \signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
1885   essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà
1886   scritto il PID del processo.
1887 \item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
1888   file descriptor;\footnote{questa operazione è disponibile solo su alcuni
1889     file descriptor, in particolare sui socket (vedi
1890     sez.~\ref{sec:sock_ioctl_IP}) o sui file descriptor di \textit{epoll}
1891     (vedi sez.~\ref{sec:file_epoll}).} il terzo argomento deve essere un
1892   puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà restituito
1893   il valore.
1894 \item[\const{FIOQSIZE}] restituisce la dimensione corrente di un file o di una
1895   directory, mentre se applicata ad un dispositivo fallisce con un errore di
1896   \errcode{ENOTTY}; il terzo argomento deve essere un puntatore ad un intero
1897   (cioè di tipo \texttt{int *}) su cui sarà restituito il valore.
1898 \end{basedescript}
1899
1900 % TODO aggiungere FIBMAP e FIEMAP, vedi http://lwn.net/Articles/260832
1901
1902 Si noti però come la gran parte di queste operazioni specifiche dei file (per
1903 essere precisi le prime sei dell'elenco) siano effettuabili in maniera
1904 generica anche tramite l'uso di \func{fcntl}. Le due funzioni infatti sono
1905 molto simili e la presenza di questa sovrapposizione è principalmente dovuta
1906 al fatto che alle origini di Unix i progettisti considerarono che era
1907 necessario trattare diversamente rispetto alle operazione di controllo delle
1908 modalità di I/O file e dispositivi usando \func{fcntl} per i primi e
1909 \func{ioctl} per i secondi;\footnote{all'epoca tra l'altro i dispositivi che
1910   usavano \func{ioctl} erano sostanzialmente solo i terminali, il che spiega
1911   l'uso comune di \errcode{ENOTTY} come codice di errore.} oggi non è più così
1912 ma le due funzioni sono rimaste.
1913
1914 % TODO trovare qualche posto per la eventuale documentazione delle seguenti
1915 % (bassa/bassissima priorità)
1916 % EXT4_IOC_MOVE_EXT (dal 2.6.31)
1917
1918
1919
1920
1921 % \chapter{}
1922
1923 \section{L'interfaccia standard ANSI C}
1924 \label{sec:files_std_interface}
1925
1926
1927 Come visto in sez.~\ref{sec:file_unix_interface} le operazioni di I/O sui file
1928 sono gestibili a basso livello con l'interfaccia standard unix, che ricorre
1929 direttamente alle \textit{system call} messe a disposizione dal kernel.
1930
1931 Questa interfaccia però non provvede le funzionalità previste dallo standard
1932 ANSI C, che invece sono realizzate attraverso opportune funzioni di libreria,
1933 queste, insieme alle altre funzioni definite dallo standard, vengono a
1934 costituire il nucleo\footnote{queste funzioni sono state implementate la prima
1935   volta da Ritchie nel 1976 e da allora sono rimaste sostanzialmente
1936   immutate.} delle \acr{glibc}.
1937
1938
1939 Esamineremo in questa sezione le funzioni base dell'interfaccia degli
1940 \textit{stream}, analoghe a quelle di sez.~\ref{sec:file_unix_interface} per i
1941 file descriptor. In particolare vedremo come aprire, leggere, scrivere e
1942 cambiare la posizione corrente in uno \textit{stream}.
1943
1944
1945 \subsection{I \textit{file stream}}
1946 \label{sec:file_stream}
1947
1948 \itindbeg{file~stream}
1949
1950 Come più volte ribadito, l'interfaccia dei file descriptor è un'interfaccia di
1951 basso livello, che non provvede nessuna forma di formattazione dei dati e
1952 nessuna forma di bufferizzazione per ottimizzare le operazioni di I/O.
1953
1954 In \cite{APUE} Stevens descrive una serie di test sull'influenza delle
1955 dimensioni del blocco di dati (l'argomento \param{buf} di \func{read} e
1956 \func{write}) nell'efficienza nelle operazioni di I/O con i file descriptor,
1957 evidenziando come le prestazioni ottimali si ottengano a partire da dimensioni
1958 del buffer dei dati pari a quelle dei blocchi del filesystem (il valore dato
1959 dal campo \var{st\_blksize} di \struct{stat}), che di norma corrispondono alle
1960 dimensioni dei settori fisici in cui è suddiviso il disco.
1961
1962 Se il programmatore non si cura di effettuare le operazioni in blocchi di
1963 dimensioni adeguate, le prestazioni sono inferiori.  La caratteristica
1964 principale dell'interfaccia degli \textit{stream} è che essa provvede da sola
1965 alla gestione dei dettagli della bufferizzazione e all'esecuzione delle
1966 operazioni di lettura e scrittura in blocchi di dimensioni appropriate
1967 all'ottenimento della massima efficienza.
1968
1969 Per questo motivo l'interfaccia viene chiamata anche interfaccia dei
1970 \textit{file stream}, dato che non è più necessario doversi preoccupare
1971 dei dettagli della comunicazione con il tipo di hardware sottostante
1972 (come nel caso della dimensione dei blocchi del filesystem), ed un file
1973 può essere sempre considerato come composto da un flusso continuo (da
1974 cui il nome \textit{stream}) di dati.
1975
1976 A parte i dettagli legati alla gestione delle operazioni di lettura e
1977 scrittura (sia per quel che riguarda la bufferizzazione, che le
1978 formattazioni), i \textit{file stream} restano del tutto equivalenti ai file
1979 descriptor (sui quali sono basati), ed in particolare continua a valere quanto
1980 visto in sez.~\ref{sec:file_sharing} a proposito dell'accesso condiviso ed in
1981 sez.~\ref{sec:file_access_control} per il controllo di accesso.
1982
1983 \itindend{file~stream}
1984
1985
1986 \subsection{Gli oggetti \type{FILE}}
1987 \label{sec:file_FILE}
1988
1989
1990 Per ragioni storiche la struttura di dati che rappresenta uno \textit{stream}
1991 è stata chiamata \type{FILE}, questi oggetti sono creati dalle funzioni di
1992 libreria e contengono tutte le informazioni necessarie a gestire le operazioni
1993 sugli \textit{stream}, come la posizione corrente, lo stato del buffer e degli
1994 indicatori di stato e di fine del file.
1995
1996 Per questo motivo gli utenti non devono mai utilizzare direttamente o allocare
1997 queste strutture (che sono dei \index{tipo!opaco} \textsl{tipi opachi}) ma
1998 usare sempre puntatori del tipo \texttt{FILE *} ottenuti dalla libreria stessa
1999 (tanto che in certi casi il termine di puntatore a file è diventato sinonimo
2000 di \textit{stream}).  Tutte le funzioni della libreria che operano sui file
2001 accettano come argomenti solo variabili di questo tipo, che diventa
2002 accessibile includendo l'header file \headfile{stdio.h}.
2003
2004
2005 \subsection{Gli \textit{stream standard}}
2006 \label{sec:file_std_stream}
2007
2008 Ai tre file descriptor standard (vedi tab.~\ref{tab:file_std_files}) aperti
2009 per ogni processo, corrispondono altrettanti \textit{stream}, che
2010 rappresentano i canali standard di input/output prestabiliti; anche questi tre
2011 \textit{stream} sono identificabili attraverso dei nomi simbolici definiti
2012 nell'header \headfile{stdio.h} che sono:
2013
2014 \begin{basedescript}{\desclabelwidth{3.0cm}}
2015 \item[\var{FILE *stdin}] Lo \textit{standard input} cioè il \textit{file
2016     stream} da cui il processo riceve ordinariamente i dati in
2017   ingresso. Normalmente è associato dalla shell all'input del terminale e
2018   prende i caratteri dalla tastiera.
2019 \item[\var{FILE *stdout}] Lo \textit{standard output} cioè il \textit{file
2020     stream} su cui il processo invia ordinariamente i dati in
2021   uscita. Normalmente è associato dalla shell all'output del terminale e
2022   scrive sullo schermo.
2023 \item[\var{FILE *stderr}] Lo \textit{standard error} cioè il \textit{file
2024     stream} su cui il processo è supposto inviare i messaggi di
2025   errore. Normalmente anch'esso è associato dalla shell all'output del
2026   terminale e scrive sullo schermo.
2027 \end{basedescript}
2028
2029 Nella \acr{glibc} \var{stdin}, \var{stdout} e \var{stderr} sono effettivamente
2030 tre variabili di tipo \type{FILE}\texttt{ *} che possono essere usate come
2031 tutte le altre, ad esempio si può effettuare una redirezione dell'output di un
2032 programma con il semplice codice: \includecodesnip{listati/redir_stdout.c} ma
2033 in altri sistemi queste variabili possono essere definite da macro, e se si
2034 hanno problemi di portabilità e si vuole essere sicuri, diventa opportuno
2035 usare la funzione \func{freopen}.
2036
2037
2038 \subsection{Le modalità di bufferizzazione}
2039 \label{sec:file_buffering}
2040
2041 La bufferizzazione è una delle caratteristiche principali dell'interfaccia
2042 degli \textit{stream}; lo scopo è quello di ridurre al minimo il numero di
2043 system call (\func{read} o \func{write}) eseguite nelle operazioni di
2044 input/output. Questa funzionalità è assicurata automaticamente dalla libreria,
2045 ma costituisce anche uno degli aspetti più comunemente fraintesi, in
2046 particolare per quello che riguarda l'aspetto della scrittura dei dati sul
2047 file.
2048
2049 I caratteri che vengono scritti su di uno \textit{stream} normalmente vengono
2050 accumulati in un buffer e poi trasmessi in blocco\footnote{questa operazione
2051   viene usualmente chiamata \textsl{scaricamento} dei dati, dal termine
2052   inglese \textit{flush}.} tutte le volte che il buffer viene riempito, in
2053 maniera asincrona rispetto alla scrittura. Un comportamento analogo avviene
2054 anche in lettura (cioè dal file viene letto un blocco di dati, anche se ne
2055 sono richiesti una quantità inferiore), ma la cosa ovviamente ha rilevanza
2056 inferiore, dato che i dati letti sono sempre gli stessi. In caso di scrittura
2057 invece, quando si ha un accesso contemporaneo allo stesso file (ad esempio da
2058 parte di un altro processo) si potranno vedere solo le parti effettivamente
2059 scritte, e non quelle ancora presenti nel buffer.
2060
2061 Per lo stesso motivo, in tutte le situazioni in cui si sta facendo
2062 dell'input/output interattivo, bisognerà tenere presente le caratteristiche
2063 delle operazioni di scaricamento dei dati, poiché non è detto che ad una
2064 scrittura sullo \textit{stream} corrisponda una immediata scrittura sul
2065 dispositivo (la cosa è particolarmente evidente quando con le operazioni di
2066 input/output su terminale).
2067
2068 Per rispondere ad esigenze diverse, lo standard definisce tre distinte
2069 modalità in cui può essere eseguita la bufferizzazione, delle quali
2070 occorre essere ben consapevoli, specie in caso di lettura e scrittura da
2071 dispositivi interattivi:
2072 \begin{itemize}
2073 \item \textit{unbuffered}: in questo caso non c'è bufferizzazione ed i
2074   caratteri vengono trasmessi direttamente al file non appena possibile
2075   (effettuando immediatamente una \func{write}).
2076 \item \textit{line buffered}: in questo caso i caratteri vengono
2077   normalmente trasmessi al file in blocco ogni volta che viene
2078   incontrato un carattere di \textit{newline} (il carattere ASCII
2079   \verb|\n|).
2080 \item \textit{fully buffered}: in questo caso i caratteri vengono
2081   trasmessi da e verso il file in blocchi di dimensione opportuna.
2082 \end{itemize}
2083
2084 Lo standard ANSI C specifica inoltre che lo standard output e lo
2085 standard input siano aperti in modalità \textit{fully buffered} quando
2086 non fanno riferimento ad un dispositivo interattivo, e che lo standard
2087 error non sia mai aperto in modalità \textit{fully buffered}.
2088
2089 Linux, come BSD e SVr4, specifica il comportamento predefinito in maniera
2090 ancora più precisa, e cioè impone che lo standard error sia sempre
2091 \textit{unbuffered} (in modo che i messaggi di errore siano mostrati il più
2092 rapidamente possibile) e che standard input e standard output siano aperti in
2093 modalità \textit{line buffered} quando sono associati ad un terminale (od
2094 altro dispositivo interattivo) ed in modalità \textit{fully buffered}
2095 altrimenti.
2096
2097 Il comportamento specificato per standard input e standard output vale anche
2098 per tutti i nuovi \textit{stream} aperti da un processo; la selezione comunque
2099 avviene automaticamente, e la libreria apre lo \textit{stream} nella modalità
2100 più opportuna a seconda del file o del dispositivo scelto.
2101
2102 La modalità \textit{line buffered} è quella che necessita di maggiori
2103 chiarimenti e attenzioni per quel che concerne il suo funzionamento. Come già
2104 accennato nella descrizione, \emph{di norma} i dati vengono inviati al kernel
2105 alla ricezione di un carattere di \textsl{a capo} (\textit{newline}); questo
2106 non è vero in tutti i casi, infatti, dato che le dimensioni del buffer usato
2107 dalle librerie sono fisse, se le si eccedono si può avere uno scarico dei dati
2108 anche prima che sia stato inviato un carattere di \textit{newline}.
2109
2110 Un secondo punto da tenere presente, particolarmente quando si ha a che fare
2111 con I/O interattivo, è che quando si effettua una lettura da uno
2112 \textit{stream} che comporta l'accesso al kernel\footnote{questo vuol dire che
2113   lo \textit{stream} da cui si legge è in modalità \textit{unbuffered}.} viene
2114 anche eseguito lo scarico di tutti i buffer degli \textit{stream} in
2115 scrittura.
2116
2117 In sez.~\ref{sec:file_buffering_ctrl} vedremo come la libreria definisca delle
2118 opportune funzioni per controllare le modalità di bufferizzazione e lo scarico
2119 dei dati.
2120
2121
2122
2123
2124 \subsection{Apertura e chiusura di uno \textit{stream}}
2125 \label{sec:file_fopen}
2126
2127 Le funzioni che si possono usare per aprire uno \textit{stream} sono solo tre:
2128 \funcd{fopen}, \funcd{fdopen} e \funcd{freopen},\footnote{\func{fopen} e
2129   \func{freopen} fanno parte dello standard ANSI C, \func{fdopen} è parte
2130   dello standard POSIX.1.} i loro prototipi sono:
2131 \begin{functions}
2132   \headdecl{stdio.h}
2133   \funcdecl{FILE *fopen(const char *path, const char *mode)}
2134   Apre il file specificato da \param{path}.
2135   \funcdecl{FILE *fdopen(int fildes, const char *mode)}
2136   Associa uno \textit{stream} al file descriptor \param{fildes}.
2137   \funcdecl{FILE *freopen(const char *path, const char *mode, FILE *stream)}
2138   Apre il file specificato da \param{path} associandolo allo \textit{stream}
2139   specificato da \param{stream}, se questo è già aperto prima lo chiude.
2140   
2141   \bodydesc{Le funzioni ritornano un puntatore valido in caso di successo e
2142     \val{NULL} in caso di errore, in tal caso \var{errno} assumerà il valore
2143     ricevuto dalla funzione sottostante di cui è fallita l'esecuzione.
2144   
2145     Gli errori pertanto possono essere quelli di \func{malloc} per tutte
2146     e tre le funzioni, quelli \func{open} per \func{fopen}, quelli di
2147     \func{fcntl} per \func{fdopen} e quelli di \func{fopen},
2148     \func{fclose} e \func{fflush} per \func{freopen}.}
2149 \end{functions}
2150
2151 Normalmente la funzione che si usa per aprire uno \textit{stream} è
2152 \func{fopen}, essa apre il file specificato nella modalità specificata da
2153 \param{mode}, che è una stringa che deve iniziare con almeno uno dei valori
2154 indicati in tab.~\ref{tab:file_fopen_mode} (sono possibili varie estensioni
2155 che vedremo in seguito).
2156
2157 L'uso più comune di \func{freopen} è per redirigere uno dei tre file
2158 standard (vedi sez.~\ref{sec:file_std_stream}): il file \param{path} viene
2159 associato a \param{stream} e se questo è uno \textit{stream} già aperto viene
2160 preventivamente chiuso.
2161
2162 Infine \func{fdopen} viene usata per associare uno \textit{stream} ad un file
2163 descriptor esistente ottenuto tramite una altra funzione (ad esempio con una
2164 \func{open}, una \func{dup}, o una \func{pipe}) e serve quando si vogliono
2165 usare gli \textit{stream} con file come le fifo o i socket, che non possono
2166 essere aperti con le funzioni delle librerie standard del C.
2167
2168 \begin{table}[htb]
2169   \centering
2170   \footnotesize
2171   \begin{tabular}[c]{|l|p{8cm}|}
2172     \hline
2173     \textbf{Valore} & \textbf{Significato}\\
2174     \hline
2175     \hline
2176     \texttt{r} & Il file viene aperto, l'accesso viene posto in sola
2177                  lettura, lo \textit{stream} è posizionato all'inizio del
2178                  file.\\ 
2179     \texttt{r+}& Il file viene aperto, l'accesso viene posto in lettura e
2180                  scrittura, lo \textit{stream} è posizionato all'inizio del
2181                  file.\\ 
2182 %    \hline
2183     \texttt{w} & Il file viene aperto e troncato a lunghezza nulla (o
2184                  creato se non esiste), l'accesso viene posto in sola
2185                  scrittura, lo stream\textit{} è posizionato all'inizio del
2186                  file.\\ 
2187     \texttt{w+}& Il file viene aperto e troncato a lunghezza nulla (o
2188                  creato se non esiste), l'accesso viene posto in scrittura e
2189                  lettura, lo \textit{stream} è posizionato all'inizio del
2190                  file.\\ 
2191 %    \hline
2192     \texttt{a} & Il file viene aperto (o creato se non esiste) in
2193                  \itindex{append~mode} \textit{append mode}, l'accesso viene
2194                  posto in sola scrittura.\\
2195     \texttt{a+}& Il file viene aperto (o creato se non esiste) in
2196                  \itindex{append~mode} \textit{append mode}, l'accesso viene
2197                  posto in lettura e scrittura.\\
2198     \hline
2199     \texttt{b} & Specifica che il file è binario, non ha alcun effetto. \\
2200     \texttt{x} & L'apertura fallisce se il file esiste già. \\
2201     \hline
2202   \end{tabular}
2203   \caption{Modalità di apertura di uno \textit{stream} dello standard ANSI C
2204     che sono sempre presenti in qualunque sistema POSIX.}
2205   \label{tab:file_fopen_mode}
2206 \end{table}
2207
2208 In realtà lo standard ANSI C prevede un totale di 15 possibili valori
2209 diversi per \param{mode}, ma in tab.~\ref{tab:file_fopen_mode} si sono
2210 riportati solo i sei valori effettivi, ad essi può essere aggiunto pure
2211 il carattere \texttt{b} (come ultimo carattere o nel mezzo agli altri per
2212 le stringhe di due caratteri) che in altri sistemi operativi serve a
2213 distinguere i file binari dai file di testo; in un sistema POSIX questa
2214 distinzione non esiste e il valore viene accettato solo per
2215 compatibilità, ma non ha alcun effetto.
2216
2217 Le \acr{glibc} supportano alcune estensioni, queste devono essere sempre
2218 indicate dopo aver specificato il \param{mode} con uno dei valori di
2219 tab.~\ref{tab:file_fopen_mode}. L'uso del carattere \texttt{x} serve per
2220 evitare di sovrascrivere un file già esistente (è analoga all'uso
2221 dell'opzione \const{O\_EXCL} in \func{open}), se il file specificato già
2222 esiste e si aggiunge questo carattere a \param{mode} la \func{fopen}
2223 fallisce. 
2224
2225 Un'altra estensione serve a supportare la localizzazione, quando si
2226 aggiunge a \param{mode} una stringa della forma \verb|",ccs=STRING"| il
2227 valore \verb|STRING| è considerato il nome di una codifica dei caratteri
2228 e \func{fopen} marca il file per l'uso dei caratteri estesi e abilita le
2229 opportune funzioni di conversione in lettura e scrittura.
2230
2231 Nel caso si usi \func{fdopen} i valori specificati da \param{mode} devono
2232 essere compatibili con quelli con cui il file descriptor è stato aperto.
2233 Inoltre i modi \cmd{w} e \cmd{w+} non troncano il file. La posizione nello
2234 \textit{stream} viene impostata a quella corrente nel file descriptor, e le
2235 variabili di errore e di fine del file (vedi sez.~\ref{sec:file_io}) sono
2236 cancellate. Il file non viene duplicato e verrà chiuso alla chiusura dello
2237 \textit{stream}.
2238
2239 I nuovi file saranno creati secondo quanto visto in
2240 sez.~\ref{sec:file_ownership_management} ed avranno i permessi di accesso
2241 impostati al valore
2242 \code{S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IWGRP|S\_IROTH|S\_IWOTH} (pari a
2243 \val{0666}) modificato secondo il valore di \itindex{umask} \textit{umask} per
2244 il processo (si veda sez.~\ref{sec:file_perm_management}).
2245
2246 In caso di file aperti in lettura e scrittura occorre ricordarsi che c'è
2247 di mezzo una bufferizzazione; per questo motivo lo standard ANSI C
2248 richiede che ci sia un'operazione di posizionamento fra un'operazione
2249 di output ed una di input o viceversa (eccetto il caso in cui l'input ha
2250 incontrato la fine del file), altrimenti una lettura può ritornare anche
2251 il risultato di scritture precedenti l'ultima effettuata. 
2252
2253 Per questo motivo è una buona pratica (e talvolta necessario) far seguire ad
2254 una scrittura una delle funzioni \func{fflush}, \func{fseek}, \func{fsetpos} o
2255 \func{rewind} prima di eseguire una rilettura; viceversa nel caso in cui si
2256 voglia fare una scrittura subito dopo aver eseguito una lettura occorre prima
2257 usare una delle funzioni \func{fseek}, \func{fsetpos} o \func{rewind}. Anche
2258 un'operazione nominalmente nulla come \code{fseek(file, 0, SEEK\_CUR)} è
2259 sufficiente a garantire la sincronizzazione.
2260
2261 Una volta aperto lo \textit{stream}, si può cambiare la modalità di
2262 bufferizzazione (si veda sez.~\ref{sec:file_buffering_ctrl}) fintanto che non
2263 si è effettuato alcuna operazione di I/O sul file.
2264
2265 Uno \textit{stream} viene chiuso con la funzione \funcd{fclose} il cui
2266 prototipo è:
2267 \begin{prototype}{stdio.h}{int fclose(FILE *stream)}
2268   Chiude lo \textit{stream} \param{stream}. 
2269   
2270   \bodydesc{Restituisce 0 in caso di successo e \val{EOF} in caso di errore,
2271     nel qual caso imposta \var{errno} a \errval{EBADF} se il file descriptor
2272     indicato da \param{stream} non è valido, o uno dei valori specificati
2273     dalla sottostante funzione che è fallita (\func{close}, \func{write} o
2274     \func{fflush}).}
2275 \end{prototype}
2276
2277 La funzione effettua lo scarico di tutti i dati presenti nei buffer di uscita
2278 e scarta tutti i dati in ingresso; se era stato allocato un buffer per lo
2279 \textit{stream} questo verrà rilasciato. La funzione effettua lo scarico solo
2280 per i dati presenti nei buffer in user space usati dalle \acr{glibc}; se si
2281 vuole essere sicuri che il kernel forzi la scrittura su disco occorrerà
2282 effettuare una \func{sync} (vedi sez.~\ref{sec:file_sync}).
2283
2284 Linux supporta anche una altra funzione, \funcd{fcloseall}, come estensione
2285 GNU implementata dalle \acr{glibc}, accessibile avendo definito
2286 \macro{\_GNU\_SOURCE}, il suo prototipo è:
2287 \begin{prototype}{stdio.h}{int fcloseall(void)}
2288   Chiude tutti gli \textit{stream}. 
2289   
2290   \bodydesc{Restituisce 0 se non ci sono errori ed \val{EOF} altrimenti.}
2291 \end{prototype}
2292 \noindent la funzione esegue lo scarico dei dati bufferizzati in uscita
2293 e scarta quelli in ingresso, chiudendo tutti i file. Questa funzione è
2294 provvista solo per i casi di emergenza, quando si è verificato un errore
2295 ed il programma deve essere abortito, ma si vuole compiere qualche altra
2296 operazione dopo aver chiuso i file e prima di uscire (si ricordi quanto
2297 visto in sez.~\ref{sec:proc_conclusion}).
2298
2299
2300 \subsection{Lettura e scrittura su uno \textit{stream}}
2301 \label{sec:file_io}
2302
2303 Una delle caratteristiche più utili dell'interfaccia degli \textit{stream} è
2304 la ricchezza delle funzioni disponibili per le operazioni di lettura e
2305 scrittura sui file. Sono infatti previste ben tre diverse modalità modalità di
2306 input/output non formattato:
2307 \begin{enumerate*}
2308 \item\textsl{binario} in cui legge/scrive un blocco di dati alla
2309   volta, vedi sez.~\ref{sec:file_binary_io}.
2310 \item\textsl{a caratteri} in cui si legge/scrive un carattere alla
2311   volta (con la bufferizzazione gestita automaticamente dalla libreria),
2312   vedi sez.~\ref{sec:file_char_io}.
2313 \item\textsl{di linea} in cui si legge/scrive una linea alla volta (terminata
2314   dal carattere di newline \verb|'\n'|), vedi sez.~\ref{sec:file_line_io}.
2315 \end{enumerate*}
2316 ed inoltre la modalità di input/output formattato.
2317
2318 A differenza dell'interfaccia dei file descriptor, con gli \textit{stream} il
2319 raggiungimento della fine del file è considerato un errore, e viene
2320 notificato come tale dai valori di uscita delle varie funzioni. Nella
2321 maggior parte dei casi questo avviene con la restituzione del valore
2322 intero (di tipo \ctyp{int}) \val{EOF}\footnote{la costante deve essere
2323   negativa, le \acr{glibc} usano -1, altre implementazioni possono avere
2324   valori diversi.}  definito anch'esso nell'header \headfile{stdlib.h}.
2325
2326 Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di
2327 libreria che si appoggiano a delle system call, esse non impostano
2328 direttamente la variabile \var{errno}, che mantiene il valore impostato dalla
2329 system call che ha riportato l'errore.
2330
2331 Siccome la condizione di end-of-file è anch'essa segnalata come errore, nasce
2332 il problema di come distinguerla da un errore effettivo; basarsi solo sul
2333 valore di ritorno della funzione e controllare il valore di \var{errno}
2334 infatti non basta, dato che quest'ultimo potrebbe essere stato impostato in
2335 una altra occasione, (si veda sez.~\ref{sec:sys_errno} per i dettagli del
2336 funzionamento di \var{errno}).
2337
2338 Per questo motivo tutte le implementazioni delle librerie standard mantengono
2339 per ogni \textit{stream} almeno due flag all'interno dell'oggetto \type{FILE},
2340 il flag di \textit{end-of-file}, che segnala che si è raggiunta la fine del
2341 file in lettura, e quello di errore, che segnala la presenza di un qualche
2342 errore nelle operazioni di input/output; questi due flag possono essere
2343 riletti dalle funzioni \funcd{feof} e \funcd{ferror}, i cui prototipi sono:
2344 \begin{functions}
2345   \headdecl{stdio.h}
2346   \funcdecl{int feof(FILE *stream)}
2347   Controlla il flag di end-of-file di \param{stream}.
2348   \funcdecl{int ferror(FILE *stream)}
2349   Controlla il flag di errore di \param{stream}.
2350   
2351   \bodydesc{Entrambe le funzioni ritornano un valore diverso da zero se
2352     i relativi flag sono impostati.}
2353 \end{functions}
2354 \noindent si tenga presente comunque che la lettura di questi flag segnala
2355 soltanto che c'è stato un errore, o che si è raggiunta la fine del file in una
2356 qualunque operazione sullo \textit{stream}, il controllo quindi deve essere
2357 effettuato ogni volta che si chiama una funzione di libreria.
2358
2359 Entrambi i flag (di errore e di end-of-file) possono essere cancellati usando
2360 la funzione \funcd{clearerr}, il cui prototipo è:
2361 \begin{prototype}{stdio.h}{void clearerr(FILE *stream)}
2362   Cancella i flag di errore ed \textit{end-of-file} di \param{stream}.
2363 \end{prototype}
2364 \noindent in genere si usa questa funzione una volta che si sia identificata e
2365 corretta la causa di un errore per evitare di mantenere i flag attivi, così da
2366 poter rilevare una successiva ulteriore condizione di errore. Di questa
2367 funzione esiste una analoga \funcm{clearerr\_unlocked} che non esegue il
2368 blocco dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}).
2369
2370
2371 \subsection{Input/output binario}
2372 \label{sec:file_binary_io}
2373
2374 La prima modalità di input/output non formattato ricalca quella della
2375 interfaccia dei file descriptor, e provvede semplicemente la scrittura e la
2376 lettura dei dati da un buffer verso un file e viceversa. In generale questa è
2377 la modalità che si usa quando si ha a che fare con dati non formattati. Le due
2378 funzioni che si usano per l'I/O binario sono \funcd{fread} ed \funcd{fwrite};
2379 i loro prototipi sono:
2380 \begin{functions}
2381   \headdecl{stdio.h} 
2382   
2383   \funcdecl{size\_t fread(void *ptr, size\_t size, size\_t nmemb, FILE
2384     *stream)}
2385   
2386   \funcdecl{size\_t fwrite(const void *ptr, size\_t size, size\_t
2387     nmemb, FILE *stream)}
2388   
2389   Rispettivamente leggono e scrivono \param{nmemb} elementi di dimensione
2390   \param{size} dal buffer \param{ptr} al file \param{stream}.
2391   
2392   \bodydesc{Entrambe le funzioni ritornano il numero di elementi letti o
2393     scritti, in caso di errore o fine del file viene restituito un numero di
2394     elementi inferiore al richiesto.}
2395 \end{functions}
2396
2397 In genere si usano queste funzioni quando si devono trasferire su file
2398 blocchi di dati binari in maniera compatta e veloce; un primo caso di uso
2399 tipico è quello in cui si salva un vettore (o un certo numero dei suoi
2400 elementi) con una chiamata del tipo:
2401 \includecodesnip{listati/WriteVect.c}
2402 in questo caso devono essere specificate le dimensioni di ciascun
2403 elemento ed il numero di quelli che si vogliono scrivere. Un secondo
2404 caso è invece quello in cui si vuole trasferire su file una struttura;
2405 si avrà allora una chiamata tipo:
2406 \includecodesnip{listati/WriteStruct.c}
2407 in cui si specifica la dimensione dell'intera struttura ed un solo
2408 elemento. 
2409
2410 In realtà quello che conta nel trasferimento dei dati sono le dimensioni
2411 totali, che sono sempre pari al prodotto \code{size * nelem}; la sola
2412 differenza è che le funzioni non ritornano il numero di byte scritti,
2413 ma il numero di elementi.
2414
2415 La funzione \func{fread} legge sempre un numero intero di elementi, se
2416 incontra la fine del file l'oggetto letto parzialmente viene scartato (lo
2417 stesso avviene in caso di errore). In questo caso la posizione dello
2418 \textit{stream} viene impostata alla fine del file (e non a quella
2419 corrispondente alla quantità di dati letti).
2420
2421 In caso di errore (o fine del file per \func{fread}) entrambe le
2422 funzioni restituiscono il numero di oggetti effettivamente letti o
2423 scritti, che sarà inferiore a quello richiesto. Contrariamente a quanto
2424 avviene per i file descriptor, questo segnala una condizione di errore e
2425 occorrerà usare \func{feof} e \func{ferror} per stabilire la natura del
2426 problema.
2427
2428 Benché queste funzioni assicurino la massima efficienza per il
2429 salvataggio dei dati, i dati memorizzati attraverso di esse presentano
2430 lo svantaggio di dipendere strettamente dalla piattaforma di sviluppo
2431 usata ed in genere possono essere riletti senza problemi solo dallo
2432 stesso programma che li ha prodotti.
2433
2434 Infatti diversi compilatori possono eseguire ottimizzazioni diverse delle
2435 strutture dati e alcuni compilatori (come il \cmd{gcc}) possono anche
2436 scegliere se ottimizzare l'occupazione di spazio, impacchettando più
2437 strettamente i dati, o la velocità inserendo opportuni \textit{padding} per
2438 l'allineamento dei medesimi generando quindi output binari diversi. Inoltre
2439 altre incompatibilità si possono presentare quando entrano in gioco differenze
2440 di architettura hardware, come la dimensione del bus o la modalità di
2441 ordinamento dei bit o il formato delle variabili in floating point.
2442
2443 Per questo motivo quando si usa l'input/output binario occorre sempre prendere
2444 le opportune precauzioni (in genere usare un formato di più alto livello che
2445 permetta di recuperare l'informazione completa), per assicurarsi che versioni
2446 diverse del programma siano in grado di rileggere i dati tenendo conto delle
2447 eventuali differenze.
2448
2449 Le \acr{glibc} definiscono altre due funzioni per l'I/O binario,
2450 \funcd{fread\_unlocked} e \funcd{fwrite\_unlocked} che evitano il lock
2451 implicito dello \textit{stream}, usato per dalla librerie per la gestione delle
2452 applicazioni \itindex{thread} \textit{multi-thread} (si veda
2453 sez.~\ref{sec:file_stream_thread} per i dettagli), i loro prototipi sono:
2454 \begin{functions}
2455   \headdecl{stdio.h}
2456   
2457   \funcdecl{size\_t fread\_unlocked(void *ptr, size\_t size, size\_t
2458     nmemb, FILE *stream)}
2459   
2460   \funcdecl{size\_t fwrite\_unlocked(const void *ptr, size\_t size,
2461     size\_t nmemb, FILE *stream)}
2462   
2463   \bodydesc{Le funzioni sono identiche alle analoghe \func{fread} e
2464     \func{fwrite} ma non acquisiscono il lock implicito sullo \textit{stream}.}
2465 \end{functions}
2466 \noindent entrambe le funzioni sono estensioni GNU previste solo dalle
2467 \acr{glibc}.
2468
2469
2470 \subsection{Input/output a caratteri}
2471 \label{sec:file_char_io}
2472
2473 La seconda modalità di input/output è quella a caratteri, in cui si
2474 trasferisce un carattere alla volta.  Le funzioni per la lettura a
2475 caratteri sono tre, \funcd{fgetc}, \funcd{getc} e \funcd{getchar}, i
2476 rispettivi prototipi sono:
2477 \begin{functions}
2478   \headdecl{stdio.h} 
2479
2480   \funcdecl{int getc(FILE *stream)} Legge un byte da \param{stream} e lo
2481   restituisce come intero. In genere è implementata come una macro. 
2482   
2483   \funcdecl{int fgetc(FILE *stream)} Legge un byte da \param{stream} e lo
2484   restituisce come intero. È sempre una funzione.
2485   
2486   \funcdecl{int getchar(void)} Equivalente a \code{getc(stdin)}.
2487   
2488   \bodydesc{Tutte queste funzioni leggono un byte alla volta, che viene
2489     restituito come intero; in caso di errore o fine del file il valore
2490     di ritorno è \val{EOF}.}
2491 \end{functions}
2492
2493 A parte \func{getchar}, che si usa in genere per leggere un carattere da
2494 tastiera, le altre due funzioni sono sostanzialmente equivalenti. La
2495 differenza è che \func{getc} è ottimizzata al massimo e normalmente
2496 viene implementata con una macro, per cui occorre stare attenti a cosa
2497 le si passa come argomento, infatti \param{stream} può essere valutato
2498 più volte nell'esecuzione, e non viene passato in copia con il
2499 meccanismo visto in sez.~\ref{sec:proc_var_passing}; per questo motivo se
2500 si passa un'espressione si possono avere effetti indesiderati.
2501
2502 Invece \func{fgetc} è assicurata essere sempre una funzione, per questo motivo
2503 la sua esecuzione normalmente è più lenta per via dell'overhead della
2504 chiamata, ma è altresì possibile ricavarne l'indirizzo, che può essere passato
2505 come argomento ad un altra funzione (e non si hanno i problemi accennati in
2506 precedenza nel tipo di argomento).
2507
2508 Le tre funzioni restituiscono tutte un \ctyp{unsigned char} convertito
2509 ad \ctyp{int} (si usa \ctyp{unsigned char} in modo da evitare
2510 l'espansione del segno). In questo modo il valore di ritorno è sempre
2511 positivo, tranne in caso di errore o fine del file.
2512
2513 Nelle estensioni GNU che provvedono la localizzazione sono definite tre
2514 funzioni equivalenti alle precedenti, \funcd{getwc}, \funcd{fgetwc} e
2515 \funcd{getwchar}, che invece di un carattere di un byte restituiscono un
2516 carattere in formato esteso (cioè di tipo \ctyp{wint\_t}), il loro prototipo
2517 è:
2518 \begin{functions}
2519   \headdecl{stdio.h} 
2520   \headdecl{wchar.h} 
2521   
2522   \funcdecl{wint\_t getwc(FILE *stream)} Legge un carattere esteso da
2523   \param{stream}. In genere è implementata come una macro.
2524   
2525   \funcdecl{wint\_t fgetwc(FILE *stream)} Legge un carattere esteso da
2526   \param{stream}. È una sempre una funzione.
2527   
2528   \funcdecl{wint\_t getwchar(void)} Equivalente a \code{getwc(stdin)}.
2529   
2530   \bodydesc{Tutte queste funzioni leggono un carattere alla volta, in
2531     caso di errore o fine del file il valore di ritorno è \const{WEOF}.}
2532 \end{functions}
2533
2534 Per scrivere un carattere si possono usare tre funzioni, analoghe alle
2535 precedenti usate per leggere: \funcd{putc}, \funcd{fputc} e \funcd{putchar}; i
2536 loro prototipi sono:
2537 \begin{functions}
2538   \headdecl{stdio.h} 
2539   
2540   \funcdecl{int putc(int c, FILE *stream)} Scrive il carattere \param{c}
2541   su \param{stream}. In genere è implementata come una macro.
2542   
2543   \funcdecl{int fputc(int c, FILE *stream)} Scrive il carattere \param{c} su
2544   \param{stream}. È una sempre una funzione.
2545   
2546   \funcdecl{int putchar(int c)} Equivalente a \code{putc(stdout)}.
2547   
2548   \bodydesc{Le funzioni scrivono sempre un carattere alla volta, il cui
2549     valore viene restituito in caso di successo; in caso di errore o
2550     fine del file il valore di ritorno è \val{EOF}.}
2551 \end{functions}
2552
2553 Tutte queste funzioni scrivono sempre un byte alla volta, anche se prendono
2554 come argomento un \ctyp{int} (che pertanto deve essere ottenuto con un cast da
2555 un \ctyp{unsigned char}). Anche il valore di ritorno è sempre un intero; in
2556 caso di errore o fine del file il valore di ritorno è \val{EOF}.
2557
2558 Come nel caso dell'I/O binario con \func{fread} e \func{fwrite} le \acr{glibc}
2559 provvedono come estensione, per ciascuna delle funzioni precedenti,
2560 un'ulteriore funzione, il cui nome è ottenuto aggiungendo un
2561 \code{\_unlocked}, che esegue esattamente le stesse operazioni, evitando però
2562 il lock implicito dello \textit{stream}.
2563
2564 Per compatibilità con SVID sono inoltre provviste anche due funzioni,
2565 \funcd{getw} e \funcd{putw}, da usare per leggere e scrivere una \textit{word}
2566 (cioè due byte in una volta); i loro prototipi sono:
2567 \begin{functions}
2568   \headdecl{stdio.h} 
2569   
2570   \funcdecl{int getw(FILE *stream)} Legge una parola da \param{stream}.
2571   \funcdecl{int putw(int w, FILE *stream)} Scrive la parola \param{w} su
2572   \param{stream}.
2573   
2574   \bodydesc{Le funzioni restituiscono la parola \param{w}, o \val{EOF}
2575     in caso di errore o di fine del file.}
2576 \end{functions}
2577
2578 Le funzioni leggono e scrivono una \textit{word} di due byte, usando comunque
2579 una variabile di tipo \ctyp{int}; il loro uso è deprecato in favore dell'uso
2580 di \func{fread} e \func{fwrite}, in quanto non è possibile distinguere il
2581 valore -1 da una condizione di errore che restituisce \val{EOF}.
2582
2583 Uno degli usi più frequenti dell'input/output a caratteri è nei programmi di
2584 \textit{parsing} in cui si analizza il testo; in questo contesto diventa utile
2585 poter analizzare il carattere successivo da uno \textit{stream} senza estrarlo
2586 effettivamente (la tecnica è detta \textit{peeking ahead}) in modo che il
2587 programma possa regolarsi avendo dato una \textsl{sbirciatina} a quello che
2588 viene dopo.
2589
2590 Nel nostro caso questo tipo di comportamento può essere realizzato prima
2591 leggendo il carattere, e poi rimandandolo indietro, cosicché ridiventi
2592 disponibile per una lettura successiva; la funzione che inverte la
2593 lettura si chiama \funcd{ungetc} ed il suo prototipo è:
2594 \begin{prototype}{stdio.h}{int ungetc(int c, FILE *stream)}
2595   Rimanda indietro il carattere \param{c}, con un cast a \ctyp{unsigned
2596     char}, sullo \textit{stream} \param{stream}.
2597
2598   \bodydesc{La funzione ritorna \param{c} in caso di successo e
2599   \val{EOF} in caso di errore.}
2600 \end{prototype}
2601 \noindent benché lo standard ANSI C preveda che l'operazione possa
2602 essere ripetuta per un numero arbitrario di caratteri, alle
2603 implementazioni è richiesto di garantire solo un livello; questo è
2604 quello che fa la \acr{glibc}, che richiede che avvenga un'altra
2605 operazione fra due \func{ungetc} successive.
2606
2607 Non è necessario che il carattere che si manda indietro sia l'ultimo che
2608 si è letto, e non è necessario neanche avere letto nessun carattere
2609 prima di usare \func{ungetc}, ma di norma la funzione è intesa per
2610 essere usata per rimandare indietro l'ultimo carattere letto.
2611
2612 Nel caso \param{c} sia un \val{EOF} la funzione non fa nulla, e
2613 restituisce sempre \val{EOF}; così si può usare \func{ungetc} anche
2614 con il risultato di una lettura alla fine del file.
2615
2616 Se si è alla fine del file si può comunque rimandare indietro un
2617 carattere, il flag di end-of-file verrà automaticamente cancellato
2618 perché c'è un nuovo carattere disponibile che potrà essere riletto
2619 successivamente.
2620
2621 Infine si tenga presente che \func{ungetc} non altera il contenuto del
2622 file, ma opera esclusivamente sul buffer interno. Se si esegue una
2623 qualunque delle operazioni di riposizionamento (vedi
2624 sez.~\ref{sec:file_fseek}) i caratteri rimandati indietro vengono
2625 scartati.
2626
2627
2628 \subsection{Input/output di linea}
2629 \label{sec:file_line_io}
2630
2631 La terza ed ultima modalità di input/output non formattato è quella di linea,
2632 in cui si legge o si scrive una riga alla volta; questa è una modalità molto
2633 usata per l'I/O da terminale, ma è anche quella che presenta le
2634 caratteristiche più controverse.
2635
2636 Le funzioni previste dallo standard ANSI C per leggere una linea sono
2637 sostanzialmente due, \funcd{gets} e \funcd{fgets}, i cui rispettivi
2638 prototipi sono:
2639 \begin{functions}
2640   \headdecl{stdio.h} 
2641   
2642   \funcdecl{char *gets(char *string)} Scrive su \param{string} una
2643   linea letta da \var{stdin}.
2644   
2645   \funcdecl{char *fgets(char *string, int size, FILE *stream)}
2646   Scrive su \param{string} la linea letta da \param{stream} per un
2647   massimo di \param{size} byte.
2648   
2649   \bodydesc{Le funzioni restituiscono l'indirizzo \param{string} in caso
2650     di successo o \val{NULL} in caso di errore.}
2651 \end{functions}
2652
2653 Entrambe le funzioni effettuano la lettura (dal file specificato \func{fgets},
2654 dallo standard input \func{gets}) di una linea di caratteri (terminata dal
2655 carattere \textit{newline}, \verb|'\n'|, quello mappato sul tasto di ritorno a
2656 capo della tastiera), ma \func{gets} sostituisce \verb|'\n'| con uno zero,
2657 mentre \func{fgets} aggiunge uno zero dopo il \textit{newline}, che resta
2658 dentro la stringa. Se la lettura incontra la fine del file (o c'è un errore)
2659 viene restituito un \val{NULL}, ed il buffer \param{buf} non viene toccato.
2660 L'uso di \func{gets} è deprecato e deve essere assolutamente evitato; la
2661 funzione infatti non controlla il numero di byte letti, per cui nel caso la
2662 stringa letta superi le dimensioni del buffer, si avrà un
2663 \itindex{buffer~overflow} \textit{buffer overflow}, con sovrascrittura della
2664 memoria del processo adiacente al buffer.\footnote{questa tecnica è spiegata
2665   in dettaglio e con molta efficacia nell'ormai famoso articolo di Aleph1
2666   \cite{StS}.}
2667
2668 Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non
2669 autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare
2670 una stringa sufficientemente lunga ed opportunamente forgiata per
2671 sovrascrivere gli indirizzi di ritorno nello \itindex{stack} \textit{stack}
2672 (supposto che la \func{gets} sia stata chiamata da una subroutine), in modo da
2673 far ripartire l'esecuzione nel codice inviato nella stringa stessa (in genere
2674 uno \textit{shell code} cioè una sezione di programma che lancia una shell).
2675
2676 La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto
2677 prende in input la dimensione del buffer \param{size}, che non verrà mai
2678 ecceduta in lettura. La funzione legge fino ad un massimo di \param{size}
2679 caratteri (newline compreso), ed aggiunge uno zero di terminazione; questo
2680 comporta che la stringa possa essere al massimo di \code{size-1} caratteri.  Se
2681 la linea eccede la dimensione del buffer verranno letti solo \code{size-1}
2682 caratteri, ma la stringa sarà sempre terminata correttamente con uno zero
2683 finale; sarà possibile leggere i rimanenti caratteri in una chiamata
2684 successiva.
2685
2686 Per la scrittura di una linea lo standard ANSI C prevede altre due
2687 funzioni, \funcd{fputs} e \funcd{puts}, analoghe a quelle di lettura, i
2688 rispettivi prototipi sono:
2689 \begin{functions}
2690   \headdecl{stdio.h} 
2691   
2692   \funcdecl{int puts(const char *string)} Scrive su \var{stdout} la
2693   linea \param{string}.
2694   
2695   \funcdecl{int fputs(const char *string, FILE *stream)} Scrive su
2696   \param{stream} la linea \param{string}.
2697   
2698   \bodydesc{Le funzioni restituiscono un valore non negativo in caso di
2699     successo o \val{EOF} in caso di errore.}
2700 \end{functions}
2701
2702 Dato che in questo caso si scrivono i dati in uscita \func{puts} non ha i
2703 problemi di \func{gets} ed è in genere la forma più immediata per scrivere
2704 messaggi sullo standard output; la funzione prende una stringa terminata da
2705 uno zero ed aggiunge automaticamente il ritorno a capo. La differenza con
2706 \func{fputs} (a parte la possibilità di specificare un file diverso da
2707 \var{stdout}) è che quest'ultima non aggiunge il newline, che deve essere
2708 previsto esplicitamente.
2709
2710 Come per le analoghe funzioni di input/output a caratteri, anche per l'I/O di
2711 linea esistono delle estensioni per leggere e scrivere linee di caratteri
2712 estesi, le funzioni in questione sono \funcd{fgetws} e \funcd{fputws} ed i
2713 loro prototipi sono:
2714 \begin{functions}
2715   \headdecl{wchar.h} 
2716   \funcdecl{wchar\_t *fgetws(wchar\_t *ws, int n, FILE *stream)}
2717   Legge un massimo di \param{n} caratteri estesi dal file
2718   \param{stream} al buffer \param{ws}.
2719   
2720   \funcdecl{int fputws(const wchar\_t *ws, FILE *stream)} Scrive la
2721   linea \param{ws} di caratteri estesi sul file \param{stream}.
2722   
2723   \bodydesc{Le funzioni ritornano rispettivamente \param{ws} o un numero
2724     non negativo in caso di successo e \val{NULL} o \val{EOF} in
2725     caso di errore o fine del file.}
2726 \end{functions}
2727
2728 Il comportamento di queste due funzioni è identico a quello di \func{fgets} e
2729 \func{fputs}, a parte il fatto che tutto (numero di caratteri massimo,
2730 terminatore della stringa, newline) è espresso in termini di caratteri estesi
2731 anziché di normali caratteri ASCII.
2732
2733 Come per l'I/O binario e quello a caratteri, anche per l'I/O di linea le
2734 \acr{glibc} supportano una serie di altre funzioni, estensioni di tutte quelle
2735 illustrate finora (eccetto \func{gets} e \func{puts}), che eseguono
2736 esattamente le stesse operazioni delle loro equivalenti, evitando però il lock
2737 implicito dello \textit{stream} (vedi sez.~\ref{sec:file_stream_thread}). Come
2738 per le altre forma di I/O, dette funzioni hanno lo stesso nome della loro
2739 analoga normale, con l'aggiunta dell'estensione \code{\_unlocked}.
2740
2741 Come abbiamo visto, le funzioni di lettura per l'input/output di linea
2742 previste dallo standard ANSI C presentano svariati inconvenienti. Benché
2743 \func{fgets} non abbia i gravissimi problemi di \func{gets}, può
2744 comunque dare risultati ambigui se l'input contiene degli zeri; questi
2745 infatti saranno scritti sul buffer di uscita e la stringa in output
2746 apparirà come più corta dei byte effettivamente letti. Questa è una
2747 condizione che è sempre possibile controllare (deve essere presente un
2748 newline prima della effettiva conclusione della stringa presente nel
2749 buffer), ma a costo di una complicazione ulteriore della logica del
2750 programma. Lo stesso dicasi quando si deve gestire il caso di stringa
2751 che eccede le dimensioni del buffer.
2752
2753 Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due nuove
2754 funzioni per la gestione dell'input/output di linea, il cui uso permette di
2755 risolvere questi problemi. L'uso di queste funzioni deve essere attivato
2756 definendo la macro \macro{\_GNU\_SOURCE} prima di includere
2757 \headfile{stdio.h}. La prima delle due, \funcd{getline}, serve per leggere una
2758 linea terminata da un newline, esattamente allo stesso modo di \func{fgets},
2759 il suo prototipo è:
2760 \begin{prototype}{stdio.h}
2761   {ssize\_t getline(char **buffer, size\_t *n, FILE *stream)} Legge una linea
2762   dal file \param{stream} copiandola sul buffer indicato da \param{buffer}
2763   riallocandolo se necessario (l'indirizzo del buffer e la sua dimensione
2764   vengono sempre riscritte).
2765
2766   \bodydesc{La funzione ritorna il numero di caratteri letti in caso di
2767   successo e -1 in caso di errore o di raggiungimento della fine del
2768   file.}
2769 \end{prototype}
2770
2771 La funzione permette di eseguire una lettura senza doversi preoccupare della
2772 eventuale lunghezza eccessiva della stringa da leggere. Essa prende come primo
2773 argomento l'indirizzo del puntatore al buffer su cui si vuole copiare la
2774 linea. Quest'ultimo \emph{deve} essere stato allocato in precedenza con una
2775 \func{malloc} (non si può passare l'indirizzo di un puntatore ad una variabile
2776 locale); come secondo argomento la funzione vuole l'indirizzo della variabile
2777 contenente le dimensioni del buffer suddetto.
2778
2779 Se il buffer di destinazione è sufficientemente ampio la stringa viene scritta
2780 subito, altrimenti il buffer viene allargato usando \func{realloc} e la nuova
2781 dimensione ed il nuovo puntatore vengono restituiti indietro (si noti infatti
2782 come per entrambi gli argomenti si siano usati dei
2783 \itindex{value~result~argument} \textit{value result argument}, passando dei
2784 puntatori anziché i valori delle variabili, secondo la tecnica spiegata in
2785 sez.~\ref{sec:proc_var_passing}).
2786
2787 Se si passa alla funzione l'indirizzo di un puntatore impostato a \val{NULL} e
2788 \var{*n} è zero, la funzione provvede da sola all'allocazione della memoria
2789 necessaria a contenere la linea. In tutti i casi si ottiene dalla funzione un
2790 puntatore all'inizio del testo della linea letta. Un esempio di codice può
2791 essere il seguente: 
2792 \includecodesnip{listati/getline.c} 
2793 e per evitare  \itindex{memory~leak} \textit{memory leak} occorre ricordarsi di
2794 liberare \var{ptr} con una \func{free}.
2795
2796 Il valore di ritorno della funzione indica il numero di caratteri letti
2797 dallo \textit{stream} (quindi compreso il newline, ma non lo zero di
2798 terminazione); questo permette anche di distinguere eventuali zeri letti
2799 dallo \textit{stream} da quello inserito dalla funzione per terminare la linea.
2800 Se si è alla fine del file e non si è potuto leggere nulla o c'è stato
2801 un errore la funzione restituisce -1.
2802
2803 La seconda estensione GNU è una generalizzazione di \func{getline} per
2804 poter usare come separatore un carattere qualsiasi, la funzione si
2805 chiama \funcd{getdelim} ed il suo prototipo è:
2806 \begin{prototype}{stdio.h}
2807 {ssize\_t getdelim(char **buffer, size\_t *n, int delim, FILE *stream)} 
2808   Identica a \func{getline} solo che usa \param{delim} al posto del
2809   carattere di newline come separatore di linea.
2810 \end{prototype}
2811
2812 Il comportamento di \func{getdelim} è identico a quello di \func{getline} (che
2813 può essere implementata da questa passando \verb|'\n'| come valore di
2814 \param{delim}).
2815
2816
2817 \subsection{L'input/output formattato}
2818 \label{sec:file_formatted_io}
2819
2820 L'ultima modalità di input/output è quella formattata, che è una delle
2821 caratteristiche più utilizzate delle librerie standard del C; in genere questa
2822 è la modalità in cui si esegue normalmente l'output su terminale poiché
2823 permette di stampare in maniera facile e veloce dati, tabelle e messaggi.
2824
2825 L'output formattato viene eseguito con una delle 13 funzioni della famiglia
2826 \func{printf}; le tre più usate sono \funcd{printf}, \funcd{fprintf} e
2827 \funcd{sprintf}, i cui prototipi sono:
2828 \begin{functions}
2829   \headdecl{stdio.h} 
2830   \funcdecl{int printf(const char *format, ...)} Stampa su \file{stdout}
2831   gli argomenti, secondo il formato specificato da \param{format}.
2832   
2833   \funcdecl{int fprintf(FILE *stream, const char *format, ...)}  Stampa
2834   su \param{stream} gli argomenti, secondo il formato specificato da
2835   \param{format}.
2836   
2837   \funcdecl{int sprintf(char *str, const char *format, ...)} Stampa
2838   sulla stringa \param{str} gli argomenti, secondo il formato
2839   specificato da \param{format}.
2840
2841   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
2842 \end{functions}
2843 \noindent le prime due servono per stampare su file (lo standard output o
2844 quello specificato) la terza permette di stampare su una stringa, in genere
2845 l'uso di \func{sprintf} è sconsigliato in quanto è possibile, se non si ha la
2846 sicurezza assoluta sulle dimensioni del risultato della stampa, eccedere le
2847 dimensioni di \param{str}, con conseguente sovrascrittura di altre variabili e
2848 possibili \itindex{buffer~overflow} \textit{buffer overflow}; per questo
2849 motivo si consiglia l'uso dell'alternativa \funcd{snprintf}, il cui prototipo
2850 è:
2851 \begin{prototype}{stdio.h}
2852 {snprintf(char *str, size\_t size, const char *format, ...)} 
2853   Identica a \func{sprintf}, ma non scrive su \param{str} più di
2854   \param{size} caratteri.
2855 \end{prototype}
2856
2857 La parte più complessa delle funzioni di scrittura formattata è il formato
2858 della stringa \param{format} che indica le conversioni da fare, e da cui
2859 deriva anche il numero degli argomenti che dovranno essere passati a seguire
2860 (si noti come tutte queste funzioni siano \index{funzioni!variadic}
2861 \textit{variadic}, prendendo un numero di argomenti variabile che dipende
2862 appunto da quello che si è specificato in \param{format}).
2863
2864 \begin{table}[htb]
2865   \centering
2866   \footnotesize
2867   \begin{tabular}[c]{|l|l|p{10cm}|}
2868     \hline
2869     \textbf{Valore} & \textbf{Tipo} & \textbf{Significato} \\
2870     \hline
2871     \hline
2872    \cmd{\%d} &\ctyp{int}         & Stampa un numero intero in formato decimale
2873                                    con segno.\\
2874    \cmd{\%i} &\ctyp{int}         & Identico a \cmd{\%i} in output.\\
2875    \cmd{\%o} &\ctyp{unsigned int}& Stampa un numero intero come ottale.\\
2876    \cmd{\%u} &\ctyp{unsigned int}& Stampa un numero intero in formato
2877                                    decimale senza segno.\\
2878    \cmd{\%x}, 
2879    \cmd{\%X} &\ctyp{unsigned int}& Stampano un intero in formato esadecimale,
2880                                    rispettivamente con lettere minuscole e
2881                                    maiuscole.\\
2882    \cmd{\%f} &\ctyp{double}      & Stampa un numero in virgola mobile con la
2883                                    notazione a virgola fissa.\\
2884    \cmd{\%e}, 
2885    \cmd{\%E} &\ctyp{double} & Stampano un numero in virgola mobile con la
2886                               notazione esponenziale, rispettivamente con
2887                               lettere minuscole e maiuscole.\\
2888    \cmd{\%g}, 
2889    \cmd{\%G} &\ctyp{double} & Stampano un numero in virgola mobile con la
2890                               notazione più appropriate delle due precedenti,
2891                               rispettivamente con lettere minuscole e
2892                               maiuscole.\\
2893    \cmd{\%a}, 
2894    \cmd{\%A} &\ctyp{double} & Stampano un numero in virgola mobile in
2895                               notazione esadecimale frazionaria.\\
2896    \cmd{\%c} &\ctyp{int}    & Stampa un carattere singolo.\\
2897    \cmd{\%s} &\ctyp{char *} & Stampa una stringa.\\
2898    \cmd{\%p} &\ctyp{void *} & Stampa il valore di un puntatore.\\
2899    \cmd{\%n} &\ctyp{\&int}  & Prende il numero di caratteri stampati finora.\\
2900    \cmd{\%\%}&              & Stampa un \%.\\
2901     \hline
2902   \end{tabular}
2903   \caption{Valori possibili per gli specificatori di conversione in una
2904     stringa di formato di \func{printf}.} 
2905   \label{tab:file_format_spec}
2906 \end{table}
2907
2908 La stringa è costituita da caratteri normali (tutti eccetto \texttt{\%}), che
2909 vengono passati invariati all'output, e da direttive di conversione, in cui
2910 devono essere sempre presenti il carattere \texttt{\%}, che introduce la
2911 direttiva, ed uno degli specificatori di conversione (riportati in
2912 tab.~\ref{tab:file_format_spec}) che la conclude.
2913
2914 \begin{table}[htb]
2915   \centering
2916   \footnotesize
2917   \begin{tabular}[c]{|l|p{10cm}|}
2918     \hline
2919     \textbf{Valore} & \textbf{Significato}\\
2920     \hline
2921     \hline
2922     \val{\#} & Chiede la conversione in forma alternativa. \\
2923     \val{0}  & La conversione è riempita con zeri alla sinistra del valore.\\
2924     \val{-}  & La conversione viene allineata a sinistra sul bordo del campo.\\
2925     \val{' '}& Mette uno spazio prima di un numero con segno di valore 
2926                positivo.\\
2927     \val{+}  & Mette sempre il segno ($+$ o $-$) prima di un numero.\\
2928     \hline
2929   \end{tabular}
2930   \caption{I valori dei flag per il formato di \func{printf}}
2931   \label{tab:file_format_flag}
2932 \end{table}
2933
2934 Il formato di una direttiva di conversione prevede una serie di possibili
2935 elementi opzionali oltre al \cmd{\%} e allo specificatore di conversione. In
2936 generale essa è sempre del tipo:
2937 \begin{center}
2938 \begin{verbatim}
2939 % [n. parametro $] [flag] [[larghezza] [. precisione]] [tipo] conversione
2940 \end{verbatim}
2941 \end{center}
2942 in cui tutti i valori tranne il \val{\%} e lo specificatore di conversione
2943 sono opzionali (e per questo sono indicati fra parentesi quadre); si possono
2944 usare più elementi opzionali, nel qual caso devono essere specificati in
2945 questo ordine:
2946 \begin{itemize*}
2947 \item uno specificatore del parametro da usare (terminato da un \val{\$}),
2948 \item uno o più flag (i cui valori possibili sono riassunti in
2949   tab.~\ref{tab:file_format_flag}) che controllano il formato di stampa della
2950   conversione,
2951 \item uno specificatore di larghezza (un numero decimale), eventualmente
2952   seguito (per i numeri in virgola mobile) da un specificatore di precisione
2953   (un altro numero decimale),
2954 \item uno specificatore del tipo di dato, che ne indica la dimensione (i cui
2955   valori possibili sono riassunti in tab.~\ref{tab:file_format_type}).
2956 \end{itemize*}
2957
2958
2959 Dettagli ulteriori sulle varie opzioni possono essere trovati nella pagina di
2960 manuale di \func{printf} e nella documentazione delle \acr{glibc}.
2961
2962 \begin{table}[htb]
2963   \centering
2964   \footnotesize
2965   \begin{tabular}[c]{|l|p{10cm}|}
2966     \hline
2967     \textbf{Valore} & \textbf{Significato} \\
2968     \hline
2969     \hline
2970     \cmd{hh} & Una conversione intera corrisponde a un \ctyp{char} con o senza
2971                segno, o il puntatore per il numero dei parametri \cmd{n} è di 
2972                tipo \ctyp{char}.\\
2973     \cmd{h}  & Una conversione intera corrisponde a uno \ctyp{short} con o 
2974                senza segno, o il puntatore per il numero dei parametri \cmd{n}
2975                è di tipo \ctyp{short}.\\
2976     \cmd{l}  & Una conversione intera corrisponde a un \ctyp{long} con o 
2977                senza segno, o il puntatore per il numero dei parametri \cmd{n}
2978                è di tipo \ctyp{long}, o il carattere o la stringa seguenti
2979                sono in formato esteso.\\ 
2980     \cmd{ll} & Una conversione intera corrisponde a un \ctyp{long long} con o 
2981                senza segno, o il puntatore per il numero dei parametri \cmd{n}
2982                è di tipo \ctyp{long long}.\\
2983     \cmd{L}  & Una conversione in virgola mobile corrisponde a un
2984                \ctyp{double}.\\
2985     \cmd{q}  & Sinonimo di \cmd{ll}.\\
2986     \cmd{j}  & Una conversione intera corrisponde a un \type{intmax\_t} o 
2987                \type{uintmax\_t}.\\
2988     \cmd{z}  & Una conversione intera corrisponde a un \type{size\_t} o 
2989                \type{ssize\_t}.\\
2990     \cmd{t}  & Una conversione intera corrisponde a un \type{ptrdiff\_t}.\\
2991     \hline
2992   \end{tabular}
2993   \caption{Il modificatore di tipo di dato per il formato di \func{printf}}
2994   \label{tab:file_format_type}
2995 \end{table}
2996
2997 Una versione alternativa delle funzioni di output formattato, che permettono
2998 di usare il puntatore ad una lista variabile \index{funzioni!variadic} di
2999 argomenti (vedi sez.~\ref{sec:proc_variadic}), sono \funcd{vprintf},
3000 \funcd{vfprintf} e \funcd{vsprintf}, i cui prototipi sono:
3001 \begin{functions}
3002   \headdecl{stdio.h} 
3003   
3004   \funcdecl{int vprintf(const char *format, va\_list ap)} Stampa su
3005   \var{stdout} gli argomenti della lista \param{ap}, secondo il formato
3006   specificato da \param{format}.
3007   
3008   \funcdecl{int vfprintf(FILE *stream, const char *format, va\_list ap)}
3009   Stampa su \param{stream} gli argomenti della lista \param{ap}, secondo il
3010   formato specificato da \param{format}.
3011   
3012   \funcdecl{int vsprintf(char *str, const char *format, va\_list ap)} Stampa
3013   sulla stringa \param{str} gli argomenti della lista \param{ap}, secondo il
3014   formato specificato da \param{format}.
3015
3016   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
3017 \end{functions}
3018 \noindent con queste funzioni diventa possibile selezionare gli argomenti che
3019 si vogliono passare ad una funzione di stampa, passando direttamente la lista
3020 tramite l'argomento \param{ap}. Per poter far questo ovviamente la lista
3021 variabile\index{funzioni!variadic} degli argomenti dovrà essere opportunamente
3022 trattata (l'argomento è esaminato in sez.~\ref{sec:proc_variadic}), e dopo
3023 l'esecuzione della funzione l'argomento
3024 \param{ap} non sarà più utilizzabile (in generale dovrebbe essere eseguito un
3025 \code{va\_end(ap)} ma in Linux questo non è necessario). 
3026
3027 Come per \func{sprintf} anche per \func{vsprintf} esiste una analoga
3028 \funcd{vsnprintf} che pone un limite sul numero di caratteri che vengono
3029 scritti sulla stringa di destinazione:
3030 \begin{prototype}{stdio.h}
3031 {vsnprintf(char *str, size\_t size, const char *format, va\_list ap)} 
3032   Identica a \func{vsprintf}, ma non scrive su \param{str} più di
3033   \param{size} caratteri.
3034 \end{prototype}
3035 \noindent in modo da evitare possibili \itindex{buffer~overflow} buffer
3036 overflow.
3037
3038
3039 Per eliminare alla radice questi problemi, le \acr{glibc} supportano una
3040 specifica estensione GNU che alloca dinamicamente tutto lo spazio necessario;
3041 l'estensione si attiva al solito definendo \macro{\_GNU\_SOURCE}, le due
3042 funzioni sono \funcd{asprintf} e \funcd{vasprintf}, ed i rispettivi prototipi
3043 sono:
3044 \begin{functions}
3045   \headdecl{stdio.h} 
3046     
3047   \funcdecl{int asprintf(char **strptr, const char *format, ...)}  Stampa gli
3048   argomenti specificati secondo il formato specificato da \param{format} su
3049   una stringa allocata automaticamente all'indirizzo \param{*strptr}.
3050   
3051   \funcdecl{int vasprintf(char **strptr, const char *format, va\_list ap)}
3052   Stampa gli argomenti della lista \param{ap} secondo il formato specificato
3053   da \param{format} su una stringa allocata automaticamente all'indirizzo
3054   \param{*strptr}.
3055
3056   \bodydesc{Le funzioni ritornano il numero di caratteri stampati.}
3057 \end{functions}
3058
3059 Entrambe le funzioni prendono come argomento \param{strptr} che deve essere
3060 l'indirizzo di un puntatore ad una stringa di caratteri, in cui verrà
3061 restituito (si ricordi quanto detto in sez.~\ref{sec:proc_var_passing} a
3062 proposito dei \itindex{value~result~argument} \textit{value result argument})
3063 l'indirizzo della stringa allocata automaticamente dalle funzioni. Occorre
3064 inoltre ricordarsi di invocare \func{free} per liberare detto puntatore quando
3065 la stringa non serve più, onde evitare \itindex{memory~leak} \textit{memory
3066   leak}.
3067
3068 % TODO verificare se mettere prototipi di \func{dprintf} e \func{vdprintf}
3069
3070 Infine una ulteriore estensione GNU definisce le due funzioni \funcm{dprintf} e
3071 \funcm{vdprintf}, che prendono un file descriptor al posto dello
3072 \textit{stream}. Altre estensioni permettono di scrivere con caratteri
3073 estesi. Anche queste funzioni, il cui nome è generato dalle precedenti
3074 funzioni aggiungendo una \texttt{w} davanti a \texttt{print}, sono trattate in
3075 dettaglio nella documentazione delle \acr{glibc}.
3076
3077 In corrispondenza alla famiglia di funzioni \func{printf} che si usano per
3078 l'output formattato, l'input formattato viene eseguito con le funzioni della
3079 famiglia \func{scanf}; fra queste le tre più importanti sono \funcd{scanf},
3080 \funcd{fscanf} e \funcd{sscanf}, i cui prototipi sono:
3081 \begin{functions}
3082   \headdecl{stdio.h} \funcdecl{int scanf(const char *format, ...)} Esegue una
3083   scansione di \file{stdin} cercando una corrispondenza di quanto letto con il
3084   formato dei dati specificato da \param{format}, ed effettua le relative
3085   conversione memorizzando il risultato negli argomenti seguenti.
3086   
3087   \funcdecl{int fscanf(FILE *stream, const char *format, ...)}  Analoga alla
3088   precedente, ma effettua la scansione su \param{stream}.
3089   
3090   \funcdecl{int sscanf(char *str, const char *format, ...)} Analoga alle
3091   precedenti, ma effettua la scansione dalla stringa \param{str}.
3092   
3093   \bodydesc{Le funzioni ritornano il numero di elementi assegnati. Questi
3094     possono essere in numero inferiore a quelli specificati, ed anche zero.
3095     Quest'ultimo valore significa che non si è trovata corrispondenza. In caso
3096     di errore o fine del file viene invece restituito \val{EOF}.}
3097 \end{functions}
3098 \noindent e come per le analoghe funzioni di scrittura esistono le relative
3099 \funcm{vscanf}, \funcm{vfscanf} e \funcm{vsscanf} che usano un puntatore ad
3100 una lista di argomenti.
3101
3102 Tutte le funzioni della famiglia delle \func{scanf} vogliono come argomenti i
3103 puntatori alle variabili che dovranno contenere le conversioni; questo è un
3104 primo elemento di disagio in quanto è molto facile dimenticarsi di questa
3105 caratteristica.
3106
3107 Le funzioni leggono i caratteri dallo \textit{stream} (o dalla stringa) di
3108 input ed eseguono un confronto con quanto indicato in \param{format}, la
3109 sintassi di questo argomento è simile a quella usata per l'analogo di
3110 \func{printf}, ma ci sono varie differenze.  Le funzioni di input infatti sono
3111 più orientate verso la lettura di testo libero che verso un input formattato
3112 in campi fissi. Uno spazio in \param{format} corrisponde con un numero
3113 qualunque di caratteri di separazione (che possono essere spazi, tabulatori,
3114 virgole ecc.), mentre caratteri diversi richiedono una corrispondenza
3115 esatta. Le direttive di conversione sono analoghe a quelle di \func{printf} e
3116 si trovano descritte in dettaglio nelle pagine di manuale e nel manuale delle
3117 \acr{glibc}.
3118
3119 Le funzioni eseguono la lettura dall'input, scartano i separatori (e gli
3120 eventuali caratteri diversi indicati dalla stringa di formato) effettuando le
3121 conversioni richieste; in caso la corrispondenza fallisca (o la funzione non
3122 sia in grado di effettuare una delle conversioni richieste) la scansione viene
3123 interrotta immediatamente e la funzione ritorna lasciando posizionato lo
3124 \textit{stream} al primo carattere che non corrisponde.
3125
3126 Data la notevole complessità di uso di queste funzioni, che richiedono molta
3127 cura nella definizione delle corrette stringhe di formato e sono facilmente
3128 soggette ad errori, e considerato anche il fatto che è estremamente macchinoso
3129 recuperare in caso di fallimento nelle corrispondenze, l'input formattato non
3130 è molto usato. In genere infatti quando si ha a che fare con un input
3131 relativamente semplice si preferisce usare l'input di linea ed effettuare
3132 scansione e conversione di quanto serve direttamente con una delle funzioni di
3133 conversione delle stringhe; se invece il formato è più complesso diventa più
3134 facile utilizzare uno strumento come \cmd{flex}\footnote{il programma
3135   \cmd{flex}, è una implementazione libera di \cmd{lex} un generatore di
3136   analizzatori lessicali. Per i dettagli si può fare riferimento al manuale
3137   \cite{flex}.} per generare un analizzatore lessicale o il
3138 \cmd{bison}\footnote{il programma \cmd{bison} è un clone del generatore di
3139   parser \cmd{yacc}, maggiori dettagli possono essere trovati nel relativo
3140   manuale \cite{bison}.} per generare un parser.
3141
3142
3143 \subsection{Posizionamento su uno \textit{stream}}
3144 \label{sec:file_fseek}
3145
3146 Come per i file descriptor anche per gli \textit{stream} è possibile spostarsi
3147 all'interno di un file per effettuare operazioni di lettura o scrittura in un
3148 punto prestabilito; sempre che l'operazione di riposizionamento sia supportata
3149 dal file sottostante lo \textit{stream}, quando cioè si ha a che fare con
3150 quello che viene detto un file ad \textsl{accesso casuale}.\footnote{dato che
3151   in un sistema Unix esistono vari tipi di file, come le fifo ed i
3152   \index{file!di~dispositivo} file di dispositivo, non è scontato che questo
3153   sia sempre vero.}
3154
3155 In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel file è
3156 espressa da un intero positivo, rappresentato dal tipo \type{off\_t}, il
3157 problema è che alcune delle funzioni usate per il riposizionamento sugli
3158 \textit{stream} originano dalle prime versioni di Unix, in cui questo tipo non
3159 era ancora stato definito, e che in altri sistemi non è detto che la posizione
3160 su un file venga sempre rappresentata con il numero di caratteri dall'inizio
3161 (ad esempio in VMS può essere rappresentata come numero di record, più
3162 l'offset rispetto al record corrente).
3163
3164 Tutto questo comporta la presenza di diverse funzioni che eseguono
3165 sostanzialmente le stesse operazioni, ma usano argomenti di tipo diverso. Le
3166 funzioni tradizionali usate per il riposizionamento della posizione in uno
3167 \textit{stream} sono \funcd{fseek} e \funcd{rewind} i cui prototipi sono:
3168 \begin{functions}
3169   \headdecl{stdio.h} 
3170   
3171   \funcdecl{int fseek(FILE *stream, long offset, int whence)} Sposta la
3172   posizione nello \textit{stream} secondo quanto specificato
3173   tramite \param{offset} e \param{whence}.
3174
3175   \funcdecl{void rewind(FILE *stream)} Riporta la posizione nello
3176   \textit{stream} all'inizio del file.
3177 \end{functions}
3178
3179 L'uso di \func{fseek} è del tutto analogo a quello di \func{lseek} per i file
3180 descriptor, e gli argomenti, a parte il tipo, hanno lo stesso significato; in
3181 particolare \param{whence} assume gli stessi valori già visti in
3182 sez.~\ref{sec:file_lseek}.  La funzione restituisce 0 in caso di successo e -1
3183 in caso di errore.  La funzione \func{rewind} riporta semplicemente la
3184 posizione corrente all'inizio dello \textit{stream}, ma non esattamente
3185 equivalente ad una \code{fseek(stream, 0L, SEEK\_SET)} in quanto vengono
3186 cancellati anche i flag di errore e fine del file.
3187
3188 Per ottenere la posizione corrente si usa invece la funzione \funcd{ftell}, il
3189 cui prototipo è:
3190 \begin{prototype}{stdio.h}{long ftell(FILE *stream)} 
3191   Legge la posizione attuale nello \textit{stream} \param{stream}.
3192   
3193   \bodydesc{La funzione restituisce la posizione corrente, o -1 in caso
3194     di fallimento, che può esser dovuto sia al fatto che il file non
3195     supporta il riposizionamento che al fatto che la posizione non può
3196     essere espressa con un \ctyp{long int}}
3197 \end{prototype}
3198 \noindent la funzione restituisce la posizione come numero di byte
3199 dall'inizio dello \textit{stream}. 
3200
3201 Queste funzioni esprimono tutte la posizione nel file come un \ctyp{long int}.
3202 Dato che (ad esempio quando si usa un filesystem indicizzato a 64 bit) questo
3203 può non essere possibile lo standard POSIX ha introdotto le nuove funzioni
3204 \funcd{fgetpos} e \funcd{fsetpos}, che invece usano il nuovo tipo
3205 \type{fpos\_t}, ed i cui prototipi sono:
3206 \begin{functions}
3207   \headdecl{stdio.h} 
3208   
3209   \funcdecl{int fsetpos(FILE *stream, fpos\_t *pos)} Imposta la posizione
3210   corrente nello \textit{stream} \param{stream} al valore specificato
3211   da \param{pos}.
3212   
3213   \funcdecl{int fgetpos(FILE *stream, fpos\_t *pos)} Legge la posizione
3214   corrente nello \textit{stream} \param{stream} e la scrive in \param{pos}.
3215   
3216   \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di
3217     errore.}
3218 \end{functions}
3219
3220 In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni
3221 \func{fseeko} e \func{ftello}, che sono assolutamente identiche alle
3222 precedenti \func{fseek} e \func{ftell} ma hanno argomenti di tipo
3223 \type{off\_t} anziché di tipo \ctyp{long int}. Dato che \ctyp{long} è nella
3224 gran parte dei casi un intero a 32 bit, questo diventa un problema quando la
3225 posizione sul file viene espressa con un valore a 64 bit come accade nei
3226 sistemi più moderni.
3227
3228 % TODO: mettere prototipi espliciti fseeko e ftello o menzione?
3229
3230
3231 \section{Funzioni avanzate}
3232 \label{sec:file_stream_adv_func}
3233
3234 In questa sezione esamineremo alcune funzioni avanzate che permettono di
3235 eseguire operazioni particolari sugli \textit{stream}, come leggerne gli
3236 attributi, controllarne le modalità di bufferizzazione, gestire direttamente i
3237 lock impliciti per la programmazione \itindex{thread} \textit{multi-thread}.
3238
3239
3240 \subsection{Le funzioni di controllo}
3241 \label{sec:file_stream_cntrl}
3242
3243 Al contrario di quanto avviene con i file descriptor, le librerie standard del
3244 C non prevedono nessuna funzione come la \func{fcntl} per il controllo degli
3245 attributi dei file. Però, dato che ogni \textit{stream} si appoggia ad un file
3246 descriptor, si può usare la funzione \funcd{fileno} per ottenere quest'ultimo,
3247 il prototipo della funzione è:
3248 \begin{prototype}{stdio.h}{int fileno(FILE *stream)}
3249   Legge il file descriptor sottostante lo \textit{stream} \param{stream}.
3250   
3251   \bodydesc{Restituisce il numero del file descriptor in caso di successo, e
3252     -1 qualora \param{stream} non sia valido, nel qual caso imposta
3253     \var{errno} a \errval{EBADF}.}
3254 \end{prototype}
3255 \noindent ed in questo modo diventa possibile usare direttamente \func{fcntl}.
3256
3257 Questo permette di accedere agli attributi del file descriptor sottostante lo
3258 \textit{stream}, ma non ci dà nessuna informazione riguardo alle proprietà
3259 dello \textit{stream} medesimo.  Le \acr{glibc} però supportano alcune
3260 estensioni derivate da Solaris, che permettono di ottenere informazioni utili.
3261
3262 Ad esempio in certi casi può essere necessario sapere se un certo
3263 \textit{stream} è accessibile in lettura o scrittura. In genere questa
3264 informazione non è disponibile, e si deve ricordare come il file è stato
3265 aperto. La cosa può essere complessa se le operazioni vengono effettuate in
3266 una subroutine, che a questo punto necessiterà di informazioni aggiuntive
3267 rispetto al semplice puntatore allo \textit{stream}; questo può essere evitato
3268 con le due funzioni \funcd{\_\_freadable} e \funcd{\_\_fwritable} i cui
3269 prototipi sono:
3270 \begin{functions}
3271   \headdecl{stdio\_ext.h}
3272   \funcdecl{int \_\_freadable(FILE *stream)}
3273   Restituisce un valore diverso da zero se \param{stream} consente la lettura.
3274
3275   \funcdecl{int \_\_fwritable(FILE *stream)}  
3276   Restituisce un valore diverso da zero se \param{stream} consente la
3277   scrittura.
3278 \end{functions}
3279 \noindent che permettono di ottenere questa informazione.
3280
3281 La conoscenza dell'ultima operazione effettuata su uno \textit{stream} aperto
3282 è utile in quanto permette di trarre conclusioni sullo stato del buffer e del
3283 suo contenuto. Altre due funzioni, \funcd{\_\_freading} e \funcd{\_\_fwriting}
3284 servono a tale scopo, il loro prototipo è:
3285 \begin{functions}
3286   \headdecl{stdio\_ext.h}
3287   \funcdecl{int \_\_freading(FILE *stream)}
3288   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
3289   lettura o se l'ultima operazione è stata di lettura.
3290
3291   \funcdecl{int \_\_fwriting(FILE *stream)}  
3292   Restituisce un valore diverso da zero se \param{stream} è aperto in sola
3293   scrittura o se l'ultima operazione è stata di scrittura.
3294 \end{functions}
3295
3296 Le due funzioni permettono di determinare di che tipo è stata l'ultima
3297 operazione eseguita su uno \textit{stream} aperto in lettura/scrittura;
3298 ovviamente se uno \textit{stream} è aperto in sola lettura (o sola scrittura)
3299 la modalità dell'ultima operazione è sempre determinata; l'unica ambiguità è
3300 quando non sono state ancora eseguite operazioni, in questo caso le funzioni
3301 rispondono come se una operazione ci fosse comunque stata.
3302
3303
3304 \subsection{Il controllo della bufferizzazione}
3305 \label{sec:file_buffering_ctrl}
3306
3307 Come accennato in sez.~\ref{sec:file_buffering} le librerie definiscono una
3308 serie di funzioni che permettono di controllare il comportamento degli
3309 \textit{stream}; se non si è specificato nulla, la modalità di buffering viene
3310 decisa autonomamente sulla base del tipo di file sottostante, ed i buffer
3311 vengono allocati automaticamente.
3312
3313 Però una volta che si sia aperto lo \textit{stream} (ma prima di aver compiuto
3314 operazioni su di esso) è possibile intervenire sulle modalità di buffering; la
3315 funzione che permette di controllare la bufferizzazione è \funcd{setvbuf}, il
3316 suo prototipo è:
3317 \begin{prototype}{stdio.h}{int setvbuf(FILE *stream, char *buf, int mode, 
3318     size\_t size)}
3319   
3320   Imposta la bufferizzazione dello \textit{stream} \param{stream} nella
3321   modalità indicata da \param{mode}, usando \param{buf} come buffer di
3322   lunghezza
3323   \param{size}.
3324   
3325   \bodydesc{Restituisce zero in caso di successo, ed un valore qualunque in
3326     caso di errore, nel qual caso \var{errno} viene impostata opportunamente.}
3327 \end{prototype}
3328
3329 La funzione permette di controllare tutti gli aspetti della bufferizzazione;
3330 l'utente può specificare un buffer da usare al posto di quello allocato dal
3331 sistema passandone alla funzione l'indirizzo in \param{buf} e la dimensione in
3332 \param{size}. 
3333
3334 Ovviamente se si usa un buffer specificato dall'utente questo deve essere
3335 stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo
3336 \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo
3337 dopo la chiusura del file; ma fintanto che il file è usato all'interno di una
3338 funzione, può anche essere usata una \index{variabili!automatiche} variabile
3339 automatica. In \headfile{stdio.h} è definita la macro \const{BUFSIZ}, che
3340 indica le dimensioni generiche del buffer di uno \textit{stream}; queste
3341 vengono usate dalla funzione \func{setbuf}.  Non è detto però che tale
3342 dimensione corrisponda sempre al valore ottimale (che può variare a seconda
3343 del dispositivo).
3344
3345 Dato che la procedura di allocazione manuale è macchinosa, comporta dei rischi
3346 (come delle scritture accidentali sul buffer) e non assicura la scelta delle
3347 dimensioni ottimali, è sempre meglio lasciare allocare il buffer alle funzioni
3348 di libreria, che sono in grado di farlo in maniera ottimale e trasparente
3349 all'utente (in quanto la deallocazione avviene automaticamente). Inoltre
3350 siccome alcune implementazioni usano parte del buffer per mantenere delle
3351 informazioni di controllo, non è detto che le dimensioni dello stesso
3352 coincidano con quelle su cui viene effettuato l'I/O.
3353
3354 \begin{table}[htb]
3355   \centering
3356   \footnotesize
3357     \begin{tabular}[c]{|l|l|}
3358       \hline
3359       \textbf{Valore} & \textbf{Modalità} \\
3360       \hline
3361       \hline
3362       \const{\_IONBF} & \textit{unbuffered}\\
3363       \const{\_IOLBF} & \textit{line buffered}\\
3364       \const{\_IOFBF} & \textit{fully buffered}\\
3365       \hline
3366     \end{tabular}
3367     \caption{Valori dell'argomento \param{mode} di \func{setvbuf} 
3368       per l'impostazione delle modalità di bufferizzazione.}
3369   \label{tab:file_stream_buf_mode}
3370 \end{table}
3371
3372 Per evitare che \func{setvbuf} imposti il buffer basta passare un valore
3373 \val{NULL} per \param{buf} e la funzione ignorerà l'argomento \param{size}
3374 usando il buffer allocato automaticamente dal sistema.  Si potrà comunque
3375 modificare la modalità di bufferizzazione, passando in \param{mode} uno degli
3376 opportuni valori elencati in tab.~\ref{tab:file_stream_buf_mode}. Qualora si
3377 specifichi la modalità non bufferizzata i valori di \param{buf} e \param{size}
3378 vengono sempre ignorati.
3379
3380 Oltre a \func{setvbuf} le \acr{glibc} definiscono altre tre funzioni per la
3381 gestione della bufferizzazione di uno \textit{stream}: \funcd{setbuf},
3382 \funcd{setbuffer} e \funcd{setlinebuf}; i loro prototipi sono:
3383 \begin{functions}
3384   \headdecl{stdio.h} 
3385   
3386   \funcdecl{void setbuf(FILE *stream, char *buf)} Disabilita la
3387   bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
3388   come buffer di dimensione \const{BUFSIZ} in modalità \textit{fully buffered}.
3389   
3390   \funcdecl{void setbuffer(FILE *stream, char *buf, size\_t size)} Disabilita
3391   la bufferizzazione se \param{buf} è \val{NULL}, altrimenti usa \param{buf}
3392   come buffer di dimensione \param{size} in modalità \textit{fully buffered}.
3393   
3394   \funcdecl{void setlinebuf(FILE *stream)} Pone lo \textit{stream} in modalità
3395   \textit{line buffered}.
3396 \end{functions}
3397 \noindent tutte queste funzioni sono realizzate con opportune chiamate a
3398 \func{setvbuf} e sono definite solo per compatibilità con le vecchie librerie
3399 BSD. Infine le \acr{glibc} provvedono le funzioni non standard\footnote{anche
3400   queste funzioni sono originarie di Solaris.} \funcd{\_\_flbf} e
3401 \funcd{\_\_fbufsize} che permettono di leggere le proprietà di bufferizzazione
3402 di uno \textit{stream}; i cui prototipi sono:
3403 \begin{functions}
3404   \headdecl{stdio\_ext.h} 
3405   
3406   \funcdecl{int \_\_flbf(FILE *stream)} Restituisce un valore diverso da zero
3407   se \param{stream} è in modalità \textit{line buffered}.
3408   
3409   \funcdecl{size\_t \_\_fbufsize(FILE *stream)} Restituisce le dimensioni del
3410   buffer di \param{stream}.
3411 \end{functions}
3412
3413 Come già accennato, indipendentemente dalla modalità di bufferizzazione
3414 scelta, si può forzare lo scarico dei dati sul file con la funzione
3415 \funcd{fflush}, il suo prototipo è:
3416 \begin{prototype}{stdio.h}{int fflush(FILE *stream)}
3417   
3418   Forza la scrittura di tutti i dati bufferizzati dello
3419   \textit{stream} \param{stream}.
3420   
3421   \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
3422     errore, impostando \var{errno} a \errval{EBADF} se \param{stream} non è
3423     aperto o non è aperto in scrittura, o ad uno degli errori di
3424     \func{write}.}
3425 \end{prototype}
3426 \noindent anche di questa funzione esiste una analoga
3427 \func{fflush\_unlocked}\footnote{accessibile definendo \macro{\_BSD\_SOURCE} o
3428   \macro{\_SVID\_SOURCE} o \macro{\_GNU\_SOURCE}.} che non effettua il blocco
3429 dello stream.
3430
3431 % TODO aggiungere prototipo \func{fflush\_unlocked}?
3432
3433 Se \param{stream} è \val{NULL} lo scarico dei dati è forzato per tutti gli
3434 \textit{stream} aperti. Esistono però circostanze, ad esempio quando si vuole
3435 essere sicuri che sia stato eseguito tutto l'output su terminale, in cui serve
3436 poter effettuare lo scarico dei dati solo per gli \textit{stream} in modalità
3437 line buffered; per questo motivo le \acr{glibc} supportano una estensione di
3438 Solaris, la funzione \funcd{\_flushlbf}, il cui prototipo è:
3439 \begin{prototype}{stdio-ext.h}{void \_flushlbf(void)}
3440   Forza la scrittura di tutti i dati bufferizzati degli \textit{stream} in
3441   modalità line buffered.
3442 \end{prototype}
3443
3444 Si ricordi comunque che lo scarico dei dati dai buffer effettuato da queste
3445 funzioni non comporta la scrittura di questi su disco; se si vuole che il
3446 kernel dia effettivamente avvio alle operazioni di scrittura su disco occorre
3447 usare \func{sync} o \func{fsync} (si veda~sez.~\ref{sec:file_sync}).
3448
3449 Infine esistono anche circostanze in cui si vuole scartare tutto l'output
3450 pendente; per questo si può usare \funcd{fpurge}, il cui prototipo è:
3451 \begin{prototype}{stdio.h}{int fpurge(FILE *stream)}
3452  
3453   Cancella i buffer di input e di output dello \textit{stream} \param{stream}.
3454   
3455   \bodydesc{Restituisce zero in caso di successo, ed \val{EOF} in caso di
3456     errore.}
3457 \end{prototype}
3458
3459 La funzione scarta tutti i dati non ancora scritti (se il file è aperto in
3460 scrittura), e tutto l'input non ancora letto (se è aperto in lettura),
3461 compresi gli eventuali caratteri rimandati indietro con \func{ungetc}.
3462
3463
3464 \subsection{Gli \textit{stream} e i \textit{thread}}
3465 \label{sec:file_stream_thread}
3466
3467 \itindbeg{thread}
3468
3469 Gli \textit{stream} possono essere usati in applicazioni \textit{multi-thread}
3470 allo stesso modo in cui sono usati nelle applicazioni normali, ma si deve
3471 essere consapevoli delle possibili complicazioni anche quando non si usano i
3472 \textit{thread}, dato che l'implementazione delle librerie è influenzata
3473 pesantemente dalle richieste necessarie per garantirne l'uso con i
3474 \textit{thread}.
3475
3476 Lo standard POSIX richiede che le operazioni sui file siano atomiche rispetto
3477 ai \textit{thread}, per questo le operazioni sui buffer effettuate dalle
3478 funzioni di libreria durante la lettura e la scrittura di uno \textit{stream}
3479 devono essere opportunamente protette (in quanto il sistema assicura
3480 l'atomicità solo per le system call). Questo viene fatto associando ad ogni
3481 \textit{stream} un opportuno blocco che deve essere implicitamente acquisito
3482 prima dell'esecuzione di qualunque operazione.
3483
3484 Ci sono comunque situazioni in cui questo non basta, come quando un
3485 \textit{thread} necessita di compiere più di una operazione sullo
3486 \textit{stream} atomicamente, per questo motivo le librerie provvedono anche
3487 delle funzioni \funcd{flockfile}, \funcd{ftrylockfile} e \funcd{funlockfile},
3488 che permettono la gestione esplicita dei blocchi sugli \textit{stream}; esse
3489 sono disponibili definendo \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro
3490 prototipi sono:
3491 \begin{functions}
3492   \headdecl{stdio.h}
3493   
3494   \funcdecl{void flockfile(FILE *stream)} Esegue l'acquisizione del lock dello
3495   \textit{stream} \param{stream}, bloccandosi se il lock non è disponibile.
3496   
3497   \funcdecl{int ftrylockfile(FILE *stream)} Tenta l'acquisizione del lock
3498   dello \textit{stream} \param{stream}, senza bloccarsi se il lock non è
3499   disponibile.  Ritorna zero in caso di acquisizione del lock, diverso da zero
3500   altrimenti.
3501   
3502   \funcdecl{void funlockfile(FILE *stream)} Rilascia il lock dello
3503   \textit{stream} \param{stream}.
3504 \end{functions}
3505 \noindent con queste funzioni diventa possibile acquisire un blocco ed
3506 eseguire tutte le operazioni volute, per poi rilasciarlo. 
3507
3508 Ma, vista la complessità delle strutture di dati coinvolte, le operazioni di
3509 blocco non sono del tutto indolori, e quando il locking dello \textit{stream}
3510 non è necessario (come in tutti i programmi che non usano i \textit{thread}),
3511 tutta la procedura può comportare dei costi pesanti in termini di
3512 prestazioni. Per questo motivo abbiamo visto come alle usuali funzioni di I/O
3513 non formattato siano associate delle versioni \code{\_unlocked} (alcune
3514 previste dallo stesso standard POSIX, altre aggiunte come estensioni dalle
3515 \acr{glibc}) che possono essere usate quando il locking non serve\footnote{in
3516   certi casi dette funzioni possono essere usate, visto che sono molto più
3517   efficienti, anche in caso di necessità di locking, una volta che questo sia
3518   stato acquisito manualmente.}  con prestazioni molto più elevate, dato che
3519 spesso queste versioni (come accade per \func{getc} e \func{putc}) sono
3520 realizzate come macro.
3521
3522 La sostituzione di tutte le funzioni di I/O con le relative versioni
3523 \code{\_unlocked} in un programma che non usa i \textit{thread} è però un
3524 lavoro abbastanza noioso; per questo motivo le \acr{glibc} forniscono al
3525 programmatore pigro un'altra via\footnote{anche questa mutuata da estensioni
3526   introdotte in Solaris.} da poter utilizzare per disabilitare in blocco il
3527 locking degli \textit{stream}: l'uso della funzione \funcd{\_\_fsetlocking},
3528 il cui prototipo è:
3529 \begin{prototype}{stdio\_ext.h}{int \_\_fsetlocking (FILE *stream, int type)}
3530   Specifica o richiede a seconda del valore di \param{type} la modalità in cui
3531   le operazioni di I/O su \param{stream} vengono effettuate rispetto
3532   all'acquisizione implicita del blocco sullo \textit{stream}.
3533
3534   \bodydesc{Restituisce lo stato di locking interno dello \textit{stream} con
3535     uno dei valori \const{FSETLOCKING\_INTERNAL} o
3536     \const{FSETLOCKING\_BYCALLER}.}
3537 \end{prototype}
3538
3539 La funzione imposta o legge lo stato della modalità di operazione di uno
3540 \textit{stream} nei confronti del locking a seconda del valore specificato
3541 con \param{type}, che può essere uno dei seguenti:
3542 \begin{basedescript}{\desclabelwidth{4.0cm}}
3543 \item[\const{FSETLOCKING\_INTERNAL}] Lo \textit{stream} userà da ora in poi il
3544   blocco implicito predefinito.
3545 \item[\const{FSETLOCKING\_BYCALLER}] Al ritorno della funzione sarà l'utente a
3546   dover gestire da solo il locking dello \textit{stream}.
3547 \item[\const{FSETLOCKING\_QUERY}] Restituisce lo stato corrente della modalità
3548   di blocco dello \textit{stream}.
3549 \end{basedescript}
3550
3551 % TODO trattare \func{clearerr\_unlocked} 
3552
3553
3554 \itindend{thread}
3555
3556
3557
3558 %%% Local Variables: 
3559 %%% mode: latex
3560 %%% TeX-master: "gapil"
3561 %%% End: 
3562
3563 % LocalWords:  stream cap system call kernel Ritchie glibc descriptor Stevens
3564 % LocalWords:  buf read write filesystem st blksize stat sez l'header stdio BSD
3565 % LocalWords:  nell'header stdin shell stdout stderr error freopen flush line
3566 % LocalWords:  unbuffered buffered newline fully SVr fopen fdopen POSIX const
3567 % LocalWords:  char path int fildes NULL errno malloc fcntl fclose fflush tab
3568 % LocalWords:  dup fifo socket append EXCL ccs STRING IRUSR IWUSR IRGRP IWGRP
3569 % LocalWords:  IROTH IWOTH umask fseek fsetpos rewind SEEK CUR EOF EBADF close
3570 % LocalWords:  sync fcloseall SOURCE void stdlib of feof ferror clearerr l'I ws
3571 % LocalWords:  unlocked fread fwrite size ptr nmemb nelem gcc padding point str
3572 % LocalWords:  lock thread fgetc getc getchar dell'overhead altresì unsigned ap
3573 % LocalWords:  getwc fgetwc getwchar wint wchar WEOF putc fputc putchar dell'I
3574 % LocalWords:  SVID getw putw parsing peeking ahead ungetc gets fgets string Di
3575 % LocalWords:  overflow Aleph stack fputs puts fgetws fputws getline ssize leak
3576 % LocalWords:  realloc value result argument memory getdelim delim printf short
3577 % LocalWords:  fprintf sprintf format snprintf variadic long double intmax list
3578 % LocalWords:  uintmax ptrdiff vprintf vfprintf vsprintf vsnprintf asprintf lex
3579 % LocalWords:  vasprintf strptr dprintf vdprintf print scanf fscanf sscanf flex
3580 % LocalWords:  vscanf vfscanf vsscanf bison parser yacc like off VMS whence pos
3581 % LocalWords:  lseek ftell fgetpos fpos fseeko ftello fileno Solaris freadable
3582 % LocalWords:  fwritable ext freading fwriting buffering setvbuf BUFSIZ setbuf
3583 % LocalWords:  IONBF IOLBF IOFBF setbuffer setlinebuf flbf fbufsize flushlbf hh
3584 % LocalWords:  fsync fpurge flockfile ftrylockfile funlockfile SAFE FUNCTIONS
3585 % LocalWords:  locking fsetlocking type BYCALLER QUERY ll
3586
3587
3588
3589 % LocalWords:  descriptor system call cap like kernel sez l'inode inode VFS tab
3590 % LocalWords:  process table struct files flags pos all'inode dentry fig shell
3591 % LocalWords:  error POSIX STDIN FILENO STDOUT STDERR unistd read write lseek
3592 % LocalWords:  close pathname sys fcntl int const char errno EEXIST CREAT EXCL
3593 % LocalWords:  EISDIR ENOTDIR ENXIO NOBLOCK WRONLY fifo ENODEV ETXTBSY ELOOP of
3594 % LocalWords:  NOFOLLOW EACCES ENAMETOOLONG ENOENT EROFS EFAULT ENOSPC ENOMEM
3595 % LocalWords:  EMFILE ENFILE NFS lock race condition Denial Service DoS RDONLY
3596 % LocalWords:  glibc RDWR NONBLOCK NOCTTY SHLOCK shared BSD EXLOCK TRUNC device
3597 % LocalWords:  opendir LARGEFILE APPEND append NDELAY ASYNC l'I SIGIO SYNC SVr
3598 % LocalWords:  DSYNC RSYNC filesystem DIRECT caching SGI IRIX dell'I FreeBSD fd
3599 % LocalWords:  fork exec umask SOURCE creat filedes EBADF EINTR EIO locking off
3600 % LocalWords:  behind sync flush shutdown whence ESPIPE socket EINVAL INCR XTND
3601 % LocalWords:  SEEK CUR EPIPE ssize void buf size count EAGAIN EWOULDBLOCK log
3602 % LocalWords:  Specification pwrite pread EFBIG SIGPIPE nell'inode dall'inode
3603 % LocalWords:  CLOEXEC stat fsync cache update l'update bdflush Documentation
3604 % LocalWords:  fdatasync fstat ext dup oldfd newfd DUPFD cmd long arg flock pid
3605 % LocalWords:  SETFD GETFD GETFL SETFL GETLK SETLK SETLKW GETOWN group SIGURG
3606 % LocalWords:  SETOWN GETSIG SETSIG sigaction SIGINFO siginfo SETLEASE lease is
3607 % LocalWords:  truncate GETLEASE NOTIFY AND ACCMODE ioctl everything argp all'I
3608 % LocalWords:  framebuffer request ENOTTY CDROM nell'header magic number openat
3609 % LocalWords:  FIOCLEX FIONCLEX FIOASYNC FIONBIO NOATIME redirezione FIOSETOWN
3610 % LocalWords:  FIOGETOWN FIONREAD mkdirat thread Solaris mkdir at Urlich proc
3611 % LocalWords:  Drepper path dirfd faccessat unlinkat access fchmodat chmod Di
3612 % LocalWords:  fchownat chown fstatat futimesat utimes linkat mknodat mknod uid
3613 % LocalWords:  readlinkat readlink renameat rename symlinkat symlink unlink gid
3614 % LocalWords:  mkfifoat mkfifo FDCWD dereferenziazione rmdir REMOVEDIR
3615 % LocalWords:  epoll lsattr chattr FIOQSIZE ATFILE lutimes utimensat lchown
3616 % LocalWords:  lstat owner FOLLOW
3617
3618 %%% Local Variables: 
3619 %%% mode: latex
3620 %%% TeX-master: "gapil"
3621 %%% End: