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