Varie correzioni da Fabio Rossi, e relative aggiunte nei ringrazimenti per
[gapil.git] / fileunix.tex
1 %% fileunix.tex
2 %%
3 %% Copyright (C) 2000-2005 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 \chapter{I file: l'interfaccia standard Unix}
12 \label{cha:file_unix_interface}
13
14
15 Esamineremo in questo capitolo la prima delle due interfacce di programmazione
16 per i file, quella dei \textit{file descriptor}\index{file!descriptor},
17 nativa di Unix. Questa è l'interfaccia di basso livello provvista direttamente
18 dalle system call, che non prevede funzionalità evolute come la
19 bufferizzazione o funzioni di lettura o scrittura formattata, e sulla quale è
20 costruita anche l'interfaccia definita dallo standard ANSI C che affronteremo
21 al cap.~\ref{cha:files_std_interface}.
22
23
24
25 \section{L'architettura di base}
26 \label{sec:file_base_arch}
27
28 In questa sezione faremo una breve introduzione sull'architettura su cui è
29 basata dell'interfaccia dei \textit{file descriptor}, che, sia pure con
30 differenze nella realizzazione pratica, resta sostanzialmente la stessa in
31 tutte le implementazione di un sistema unix-like.
32
33
34 \subsection{L'architettura dei \textit{file descriptor}}
35 \label{sec:file_fd}
36
37 \index{file!descriptor|(} Per poter accedere al contenuto di un file occorre
38 creare un canale di comunicazione con il kernel che renda possibile operare su
39 di esso (si ricordi quanto visto in sez.~\ref{sec:file_vfs_work}). Questo si
40 fa aprendo il file con la funzione \func{open} che provvederà a localizzare
41 l'inode\index{inode} del file e inizializzare i puntatori che rendono
42 disponibili le funzioni che il VFS mette a disposizione (riportate in
43 tab.~\ref{tab:file_file_operations}). Una volta terminate le operazioni, il
44 file dovrà essere chiuso, e questo chiuderà il canale di comunicazione
45 impedendo ogni ulteriore operazione.
46
47 All'interno di ogni processo i file aperti sono identificati da un intero non
48 negativo, chiamato appunto \textit{file descriptor}.
49 Quando un file viene aperto la funzione \func{open} restituisce questo numero,
50 tutte le ulteriori operazioni saranno compiute specificando questo stesso
51 valore come argomento alle varie funzioni dell'interfaccia.
52
53 Per capire come funziona il meccanismo occorre spiegare a grandi linee come il
54 kernel gestisce l'interazione fra processi e file.  Il kernel mantiene sempre
55 un elenco dei processi attivi nella cosiddetta \textit{process table} ed un
56 elenco dei file aperti nella \textit{file table}.
57
58 La \textit{process table} è una tabella che contiene una voce per ciascun
59 processo attivo nel sistema. In Linux ciascuna voce è costituita da una
60 struttura di tipo \struct{task\_struct} nella quale sono raccolte tutte le
61 informazioni relative al processo; fra queste informazioni c'è anche il
62 puntatore ad una ulteriore struttura di tipo \struct{files\_struct}, in cui
63 sono contenute le informazioni relative ai file che il processo ha aperto, ed
64 in particolare:
65 \begin{itemize*}
66 \item i flag relativi ai file descriptor.
67 \item il numero di file aperti.
68 \item una tabella che contiene un puntatore alla relativa voce nella
69   \textit{file table} per ogni file aperto.
70 \end{itemize*}
71 il \textit{file descriptor} in sostanza è l'intero positivo che indicizza
72 quest'ultima tabella.
73
74 La \textit{file table} è una tabella che contiene una voce per ciascun file
75 che è stato aperto nel sistema. In Linux è costituita da strutture di tipo
76 \struct{file}; in ciascuna di esse sono tenute varie informazioni relative al
77 file, fra cui:
78 \begin{itemize*}
79 \item lo stato del file (nel campo \var{f\_flags}).
80 \item il valore della posizione corrente (l'\textit{offset}) nel file (nel
81   campo \var{f\_pos}).
82 \item un puntatore all'inode\index{inode}\footnote{nel kernel 2.4.x si è in
83     realtà passati ad un puntatore ad una struttura \struct{dentry} che punta a
84     sua volta all'inode\index{inode} passando per la nuova struttura del VFS.}
85   del file.
86 %\item un puntatore alla tabella delle funzioni \footnote{la struttura
87 %    \var{f\_op} descritta in sez.~\ref{sec:file_vfs_work}} che si possono usare
88 %  sul file.
89 \end{itemize*}
90
91 In fig.~\ref{fig:file_proc_file} si è riportato uno schema in cui è illustrata
92 questa architettura, ed in cui si sono evidenziate le interrelazioni fra le
93 varie strutture di dati sulla quale essa è basata.
94 Ritorneremo su questo schema più volte, dato che esso è fondamentale per
95 capire i dettagli del funzionamento dell'interfaccia dei \textit{file
96   descriptor}.  
97 \index{file!descriptor|)}
98
99 \begin{figure}[htb]
100   \centering
101   \includegraphics[width=13cm]{img/procfile}
102   \caption{Schema della architettura dell'accesso ai file attraverso
103   l'interfaccia dei \textit{file descriptor}.}
104   \label{fig:file_proc_file}
105 \end{figure}
106
107
108
109 \subsection{I file standard}
110 \label{sec:file_std_descr}
111
112 Come accennato i \textit{file descriptor} non sono altro che un indice nella
113 tabella dei file aperti di ciascun processo; per questo motivo essi vengono
114 assegnati in successione tutte le volte che si apre un nuovo file (se non ne è
115 stato chiuso nessuno in precedenza).
116
117 In tutti i sistemi unix-like esiste una convenzione generale per cui ogni
118 processo viene lanciato dalla shell con almeno tre file aperti. Questi, per
119 quanto appena detto, avranno come \textit{file
120   descriptor}\index{file!descriptor} i valori 0, 1 e 2.  Benché questa sia
121 soltanto una convenzione, essa è seguita dalla gran parte delle applicazioni,
122 e non aderirvi potrebbe portare a gravi problemi di interoperabilità.
123
124 Il primo file è sempre associato al cosiddetto \textit{standard input}; è cioè
125 il file da cui il processo si aspetta di ricevere i dati in ingresso. Il
126 secondo file è il cosiddetto \textit{standard output}, cioè quello su cui ci
127 si aspetta debbano essere inviati i dati in uscita. Il terzo è lo
128 \textit{standard error}, su cui viene inviata l'uscita relativa agli errori.
129 Nel caso della shell tutti questi file sono associati al terminale di
130 controllo, e corrispondono quindi alla lettura della tastiera per l'ingresso e
131 alla scrittura sul terminale per l'uscita.  Lo standard POSIX.1 provvede, al
132 posto dei valori numerici, tre costanti simboliche, definite in
133 tab.~\ref{tab:file_std_files}.
134
135 \begin{table}[htb]
136   \centering
137   \footnotesize
138   \begin{tabular}[c]{|l|l|}
139     \hline
140     \textbf{Costante} & \textbf{Significato} \\
141     \hline
142     \hline
143     \const{STDIN\_FILENO}  & \textit{file descriptor} dello \textit{standard
144       input} \\
145     \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
146       output} \\
147     \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
148       error}\\
149     \hline
150   \end{tabular}
151   \caption{Costanti definite in \file{unistd.h} per i file standard aperti 
152     alla creazione di ogni processo.}
153   \label{tab:file_std_files}
154 \end{table}
155
156 In fig.~\ref{fig:file_proc_file} si è rappresentata una situazione diversa,
157 facendo riferimento ad un programma in cui lo \textit{standard input} è
158 associato ad un file mentre lo \textit{standard output} e lo \textit{standard
159   error} sono entrambi associati ad un altro file (e quindi utilizzano lo
160 stesso inode\index{inode}).
161
162 Nelle vecchie versioni di Unix (ed anche in Linux fino al kernel 2.0.x) il
163 numero di file aperti era anche soggetto ad un limite massimo dato dalle
164 dimensioni del vettore di puntatori con cui era realizzata la tabella dei file
165 descriptor dentro \struct{file\_struct}; questo limite intrinseco nei kernel
166 più recenti non sussiste più, dato che si è passati da un vettore ad una
167 lista, ma restano i limiti imposti dall'amministratore (vedi
168 sez.~\ref{sec:sys_limits}).
169
170
171
172 \section{Le funzioni base}
173 \label{sec:file_base_func}
174
175 L'interfaccia standard Unix per l'input/output sui file è basata su cinque
176 funzioni fondamentali: \func{open}, \func{read}, \func{write}, \func{lseek} e
177 \func{close}, usate rispettivamente per aprire, leggere, scrivere, spostarsi e
178 chiudere un file.  La gran parte delle operazioni sui file si effettua
179 attraverso queste cinque funzioni, esse vengono chiamate anche funzioni di I/O
180 non bufferizzato dato che effettuano le operazioni di lettura e scrittura
181 usando direttamente le system call del kernel.
182
183
184 \subsection{La funzione \func{open}}
185 \label{sec:file_open}
186
187 La funzione \funcd{open} è la funzione fondamentale per accedere ai file, ed è
188 quella che crea l'associazione fra un
189 \index{\textit{pathname}}\textit{pathname} ed un file descriptor, il suo
190 prototipo è:
191 \begin{functions}
192   \headdecl{sys/types.h}
193   \headdecl{sys/stat.h}
194   \headdecl{fcntl.h}
195   \funcdecl{int open(const char *pathname, int flags)}
196   \funcdecl{int open(const char *pathname, int flags, mode\_t mode)}
197   Apre il file indicato da \param{pathname} nella modalità indicata da
198   \param{flags}, e, nel caso il file sia creato, con gli eventuali permessi
199   specificati da \param{mode}.
200   
201   \bodydesc{La funzione ritorna il file descriptor in caso di successo e -1 in
202     caso di errore. In questo caso la variabile \var{errno} assumerà uno dei
203     valori:
204   \begin{errlist}
205   \item[\errcode{EEXIST}] \param{pathname} esiste e si è specificato
206     \const{O\_CREAT} e \const{O\_EXCL}.  
207   \item[\errcode{EISDIR}] \param{pathname} indica una directory e si è tentato
208     l'accesso in scrittura. 
209   \item[\errcode{ENOTDIR}] si è specificato \const{O\_DIRECTORY} e
210     \param{pathname} non è una directory.
211   \item[\errcode{ENXIO}] si sono impostati \const{O\_NOBLOCK} o
212     \const{O\_WRONLY} ed il file è una fifo che non viene letta da nessun
213     processo o \param{pathname} è un file di dispositivo ma il dispositivo è
214     assente.
215   \item[\errcode{ENODEV}] \param{pathname} si riferisce a un file di
216     dispositivo che non esiste.
217   \item[\errcode{ETXTBSY}] si è cercato di accedere in scrittura all'immagine
218     di un programma in esecuzione.
219   \item[\errcode{ELOOP}] si sono incontrati troppi link simbolici nel
220     risolvere il \textit{pathname} o si è indicato \const{O\_NOFOLLOW} e
221     \param{pathname} è un link simbolico.
222   \end{errlist}
223   ed inoltre \errval{EACCES}, \errval{ENAMETOOLONG}, \errval{ENOENT},
224   \errval{EROFS}, \errval{EFAULT}, \errval{ENOSPC}, \errval{ENOMEM},
225   \errval{EMFILE} e \errval{ENFILE}.}
226 \end{functions}
227
228 La funzione apre il file, usando il primo file descriptor libero, e crea
229 l'opportuna voce (cioè la struttura \struct{file}) nella \textit{file table}.
230 Viene sempre restituito come valore di ritorno il file descriptor con il
231 valore più basso disponibile.
232
233 \begin{table}[!htb]
234   \centering
235   \footnotesize
236   \begin{tabular}[c]{|l|p{12cm}|}
237     \hline
238     \textbf{Flag} & \textbf{Descrizione} \\
239     \hline
240     \hline % modalità di accesso al file
241     \const{O\_RDONLY} & apre il file in sola lettura, le \acr{glibc}
242                         definiscono anche \const{O\_READ} come sinonimo. \\
243     \const{O\_WRONLY} & apre il file in sola scrittura, le \acr{glibc}
244                         definiscono anche \const{O\_WRITE} come sinonimo. \\
245     \const{O\_RDWR} & apre il file sia in lettura che in scrittura. \\
246     \hline % modalità di apertura del file
247     \hline
248     \const{O\_CREAT} & se il file non esiste verrà creato, con le regole di
249                        titolarità del file viste in
250                        sez.~\ref{sec:file_ownership}. Con questa opzione
251                        l'argomento \param{mode} deve essere specificato. \\
252     \const{O\_EXCL}  & usato in congiunzione con \const{O\_CREAT} fa sì che
253                        la precedente esistenza del file diventi un
254                        errore\protect\footnotemark\ che fa fallire
255                        \func{open} con \errcode{EEXIST}. \\ 
256     \const{O\_NONBLOCK}& apre il file in modalità non bloccante. Questo
257                        valore specifica anche una modalità di operazione (vedi
258                        sotto), e comporta che \func{open} ritorni
259                        immediatamente (l'opzione ha senso solo per le fifo,
260                        torneremo questo in sez.~\ref{sec:ipc_named_pipe}). \\ 
261     \const{O\_NOCTTY}& se \param{pathname} si riferisce ad un dispositivo di
262                        terminale, questo non diventerà il terminale di
263                        controllo, anche se il processo non ne ha ancora uno
264                        (si veda sez.~\ref{sec:sess_ctrl_term}). \\ 
265     \const{O\_SHLOCK} & opzione di BSD, acquisisce uno shared lock (vedi
266                         sez.~\ref{sec:file_locking}) sul file. Non è
267                         disponibile in Linux. \\ 
268     \const{O\_EXLOCK} & opzione di BSD, acquisisce uno lock esclusivo (vedi
269                         sez.~\ref{sec:file_locking}) sul file. Non è
270                         disponibile in Linux. \\ 
271     \const{O\_TRUNC}  & se il file esiste ed è un file di dati e la modalità di
272                         apertura consente la scrittura, allora la sua
273                         lunghezza verrà troncata a zero. Se il file è un
274                         terminale o una fifo il flag verrà ignorato, negli 
275                         altri casi il comportamento non è specificato. \\
276     \const{O\_NOFOLLOW}&se \param{pathname} è un link simbolico la chiamata
277                         fallisce. Questa è un'estensione BSD aggiunta in Linux
278                         dal kernel 2.1.126. Nelle versioni precedenti i link
279                         simbolici sono sempre seguiti, e questa opzione è
280                         ignorata. \\
281     \const{O\_DIRECTORY}& se \param{pathname} non è una directory la chiamata
282                         fallisce. Questo flag è specifico di Linux ed è stato
283                         introdotto con il kernel 2.1.126 per evitare dei 
284                         \textit{DoS}\index{DoS}\protect\footnotemark\ quando  
285                         \func{opendir} viene chiamata su una fifo o su un
286                         device di unità a nastri, non deve essere utilizzato
287                         al di fuori dell'implementazione di \func{opendir}. \\
288     \const{O\_LARGEFILE}& nel caso di sistemi a 32 bit che supportano file di
289                         grandi dimensioni consente di aprire file le cui
290                         dimensioni non possono essere rappresentate da numeri
291                         a 31 bit. \\
292     \hline
293     \hline  % modalità di operazione col file
294     \const{O\_APPEND} & il file viene aperto in append mode. Prima di ciascuna
295                         scrittura la posizione corrente viene sempre impostata
296                         alla fine del file. Con NFS si può avere una
297                         corruzione del file se più di un processo scrive allo
298                         stesso tempo.\footnotemark\\ 
299     \const{O\_NONBLOCK}&il file viene aperto in modalità non bloccante per
300                         le operazioni di I/O (che tratteremo in
301                         sez.~\ref{sec:file_noblocking}): questo significa il
302                         fallimento di \func{read} in assenza di dati da
303                         leggere e quello di \func{write} in caso di
304                         impossibilità di scrivere immediatamente. Questa
305                         modalità ha senso solo per le fifo e per alcuni file
306                         di dispositivo. \\ 
307     \const{O\_NDELAY} & in Linux\footnotemark\ è sinonimo di 
308                         \const{O\_NONBLOCK}.\\
309     \const{O\_ASYNC} &  apre il file per l'I/O in modalità asincrona (vedi
310                         sez.~\ref{sec:file_asyncronous_io}). Quando è
311                         impostato viene generato il segnale \const{SIGIO}
312                         tutte le volte che sono disponibili dati in input
313                         sul file. \\  
314     \const{O\_SYNC} &   apre il file per l'input/output sincrono: ogni
315                         \func{write} bloccherà fino al completamento della
316                         scrittura di tutti i dati sull'hardware sottostante.\\ 
317     \const{O\_FSYNC} &  sinonimo di \const{O\_SYNC}, usato da BSD. \\
318     \const{O\_DSYNC} &  richiede una variante di I/O sincorno definita nello
319                         standard POSIX; definita a partire dal kernel 2.1.130
320                         come sinonimo di \const{O\_SYNC}. \\ 
321     \const{O\_RSYNC} &  richiede una variante di I/O sincorno definita nello
322                         standard POSIX; definita a partire dal kernel 2.1.130
323                         come sinonimo di \const{O\_SYNC}. \\
324     \const{O\_NOATIME}& blocca l'aggiornamento dei tempi di accesso dei
325                         file (vedi sez.~\ref{sec:file_file_times}). Per molti
326                         filesystem questa funzionalità non è disponibile per
327                         il singolo file ma come opzione generale da
328                         specificare in fase di montaggio.\\
329     \const{O\_DIRECT} & esegue l'I/O direttamente dai buffer in user space, ed
330                         in maniera sincrona, in modo da scavalcare i
331                         meccanismi di caching del kernel. In gebere questo
332                         peggiora le prestazioni tranne per casi speciali in
333                         cui sono le applicazioni\footnotemark a gestire il
334                         caching. Per i kernel della serie 2.4 si deve
335                         garantire che i buffer in user space siano allineati
336                         alle dimensioni dei blocchi del filesystem; per il
337                         kernel 2.6 basta che siano allineati a multipli di 512
338                         byte.\\
339     \hline
340   \end{tabular}
341   \caption{Valori e significato dei vari bit del \textit{file status flag}.}
342   \label{tab:file_open_flags}
343 \end{table}
344
345 \footnotetext[2]{la pagina di manuale di \func{open} segnala che questa
346   opzione è difettosa su NFS, e che i programmi che la usano per stabilire un
347   \textsl{file di lock}\index{file!di lock} possono incorrere in una race
348   condition\index{\textit{race~condition}}.  Si consiglia come alternativa di
349   usare un file con un nome univoco e la funzione \func{link} per verificarne
350   l'esistenza (vedi sez.~\ref{sec:ipc_file_lock}).}
351
352 \footnotetext[3]{\textit{Denial of Service}\index{DoS}, si chiamano così
353   attacchi miranti ad impedire un servizio causando una qualche forma di
354   carico eccessivo per il sistema, che resta bloccato nelle risposte
355   all'attacco.}
356
357 \footnotetext[4]{il problema è che NFS non supporta la scrittura in append, ed
358   il kernel deve simularla, ma questo comporta la possibilità di una race
359   condition, vedi sez.~\ref{sec:file_atomic}.}
360
361 \footnotetext[5]{l'opzione origina da SVr4, dove però causava il ritorno da
362   una \func{read} con un valore nullo e non con un errore, questo introduce
363   un'ambiguità, dato che come vedremo in sez.~\ref{sec:file_read} il ritorno di
364   zero da parte di \func{read} ha il significato di una end-of-file.}
365
366 \footnotetext[6]{l'opzione è stata introdotta dalla SGI in IRIX, e serve
367   sostanzialmente a permettere ad alcuni programmi (in genere database) la
368   gestione diretta della bufferizzazione dell'I/O in quanto essi sono in grado
369   di ottimizzarla al meglio per le loro prestazioni; l'opzione è presente
370   anche in FreeBSD, senza limiti di allineamento dei buffer. In Linux è stata
371   introdotta con il kernel 2.4.10, le versioni precedenti la ignorano.}
372
373
374 Questa caratteristica permette di prevedere qual è il valore del file
375 descriptor che si otterrà al ritorno di \func{open}, e viene talvolta usata da
376 alcune applicazioni per sostituire i file corrispondenti ai file standard
377 visti in sez.~\ref{sec:file_std_descr}: se ad esempio si chiude lo standard
378 input e si apre subito dopo un nuovo file questo diventerà il nuovo standard
379 input (avrà cioè il file descriptor 0).  
380
381 Il nuovo file descriptor non è condiviso con nessun altro processo (torneremo
382 sulla condivisione dei file, in genere accessibile dopo una \func{fork}, in
383 sez.~\ref{sec:file_sharing}) ed è impostato per restare aperto attraverso una
384 \func{exec} (come accennato in sez.~\ref{sec:proc_exec}); l'offset è impostato
385 all'inizio del file.
386
387 L'argomento \param{mode} indica i permessi con cui il file viene creato; i
388 valori possibili sono gli stessi già visti in sez.~\ref{sec:file_perm_overview}
389 e possono essere specificati come OR binario delle costanti descritte in
390 tab.~\ref{tab:file_bit_perm}. Questi permessi sono filtrati dal valore di
391 \var{umask} (vedi sez.~\ref{sec:file_umask}) per il processo.
392
393 La funzione prevede diverse opzioni, che vengono specificate usando vari bit
394 dell'argomento \param{flags}.  Alcuni di questi bit vanno anche a costituire
395 il flag di stato del file (o \textit{file status flag}), che è mantenuto nel
396 campo \var{f\_flags} della struttura \struct{file} (al solito si veda lo schema
397 di fig.~\ref{fig:file_proc_file}).  Essi sono divisi in tre categorie
398 principali:
399 \begin{itemize*}
400 \item \textsl{i bit delle modalità di accesso}: specificano con quale modalità
401   si accederà al file: i valori possibili sono lettura, scrittura o
402   lettura/scrittura.  Uno di questi bit deve essere sempre specificato quando
403   si apre un file.  Vengono impostati alla chiamata da \func{open}, e possono
404   essere riletti con \func{fcntl} (fanno parte del \textit{file status flag}),
405   ma non possono essere modificati.
406 \item \textsl{i bit delle modalità di apertura}: permettono di specificare
407   alcune delle caratteristiche del comportamento di \func{open} quando viene
408   eseguita. Hanno effetto solo al momento della chiamata della funzione e non
409   sono memorizzati né possono essere riletti.
410 \item \textsl{i bit delle modalità di operazione}: permettono di specificare
411   alcune caratteristiche del comportamento delle future operazioni sul file
412   (come \func{read} o \func{write}). Anch'essi fan parte del \textit{file
413     status flag}. Il loro valore è impostato alla chiamata di \func{open}, ma
414   possono essere riletti e modificati (insieme alle caratteristiche operative
415   che controllano) con una \func{fcntl}.
416 \end{itemize*}
417
418 In tab.~\ref{tab:file_open_flags} sono riportate, ordinate e divise fra loro
419 secondo le tre modalità appena elencate, le costanti mnemoniche associate a
420 ciascuno di questi bit. Dette costanti possono essere combinate fra loro con
421 un OR aritmetico per costruire il valore (in forma di maschera binaria)
422 dell'argomento \param{flags} da passare alla \func{open}. I due flag
423 \const{O\_NOFOLLOW} e \const{O\_DIRECTORY} sono estensioni specifiche di
424 Linux, e deve essere definita la macro \macro{\_GNU\_SOURCE} per poterli
425 usare.
426
427 Nelle prime versioni di Unix i valori di \param{flag} specificabili per
428 \func{open} erano solo quelli relativi alle modalità di accesso del file.  Per
429 questo motivo per creare un nuovo file c'era una system call apposita,
430 \funcd{creat}, il cui prototipo è:
431 \begin{prototype}{fcntl.h}
432   {int creat(const char *pathname, mode\_t mode)}
433   Crea un nuovo file vuoto, con i permessi specificati da \param{mode}. È del
434   tutto equivalente a \code{open(filedes, O\_CREAT|O\_WRONLY|O\_TRUNC, mode)}. 
435 \end{prototype}
436 \noindent adesso questa funzione resta solo per compatibilità con i vecchi 
437 programmi.
438
439
440 \subsection{La funzione \func{close}}
441 \label{sec:file_close}
442
443 La funzione \funcd{close} permette di chiudere un file, in questo modo il file
444 descriptor ritorna disponibile; il suo prototipo è:
445 \begin{prototype}{unistd.h}{int close(int fd)}
446   Chiude il descrittore \param{fd}. 
447   
448   \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
449     con \var{errno} che assume i valori:
450   \begin{errlist}
451     \item[\errcode{EBADF}]  \param{fd} non è un descrittore valido.
452     \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
453   \end{errlist}
454   ed inoltre \errval{EIO}.}
455 \end{prototype}
456
457 La chiusura di un file rilascia ogni blocco (il \textit{file
458   locking}\index{file!locking} è trattato in sez.~\ref{sec:file_locking}) che
459 il processo poteva avere acquisito su di esso; se \param{fd} è l'ultimo
460 riferimento (di eventuali copie) ad un file aperto, tutte le risorse nella
461 file table vengono rilasciate. Infine se il file descriptor era l'ultimo
462 riferimento ad un file su disco quest'ultimo viene cancellato.
463
464 Si ricordi che quando un processo termina anche tutti i suoi file descriptor
465 vengono chiusi, molti programmi sfruttano questa caratteristica e non usano
466 esplicitamente \func{close}. In genere comunque chiudere un file senza
467 controllarne lo stato di uscita è errore; infatti molti filesystem
468 implementano la tecnica del \textit{write-behind}, per cui una \func{write}
469 può avere successo anche se i dati non sono stati scritti, un eventuale errore
470 di I/O allora può sfuggire, ma verrà riportato alla chiusura del file: per
471 questo motivo non effettuare il controllo può portare ad una perdita di dati
472 inavvertita.\footnote{in Linux questo comportamento è stato osservato con NFS
473   e le quote su disco.}
474
475 In ogni caso una \func{close} andata a buon fine non garantisce che i dati
476 siano stati effettivamente scritti su disco, perché il kernel può decidere di
477 ottimizzare l'accesso a disco ritardandone la scrittura. L'uso della funzione
478 \func{sync} (vedi sez.~\ref{sec:file_sync}) effettua esplicitamente il
479 \emph{flush} dei dati, ma anche in questo caso resta l'incertezza dovuta al
480 comportamento dell'hardware (che a sua volta può introdurre ottimizzazioni
481 dell'accesso al disco che ritardano la scrittura dei dati, da cui l'abitudine
482 di ripetere tre volte il comando prima di eseguire lo shutdown).
483
484
485 \subsection{La funzione \func{lseek}}
486 \label{sec:file_lseek}
487
488 Come già accennato in sez.~\ref{sec:file_fd} a ciascun file aperto è associata
489 una \textsl{posizione corrente nel file} (il cosiddetto \textit{file offset},
490 mantenuto nel campo \var{f\_pos} di \struct{file}) espressa da un numero intero
491 positivo come numero di byte dall'inizio del file. Tutte le operazioni di
492 lettura e scrittura avvengono a partire da questa posizione che viene
493 automaticamente spostata in avanti del numero di byte letti o scritti.
494
495 In genere (a meno di non avere richiesto la modalità \const{O\_APPEND}) questa
496 posizione viene impostata a zero all'apertura del file. È possibile impostarla
497 ad un valore qualsiasi con la funzione \funcd{lseek}, il cui prototipo è:
498 \begin{functions}
499   \headdecl{sys/types.h}
500   \headdecl{unistd.h}
501   \funcdecl{off\_t lseek(int fd, off\_t offset, int whence)}
502   Imposta la posizione attuale nel file. 
503   
504   \bodydesc{La funzione ritorna il valore della posizione corrente in caso di
505     successo e -1 in caso di errore nel qual caso \var{errno} assumerà uno dei
506     valori:
507   \begin{errlist}
508   \item[\errcode{ESPIPE}] \param{fd} è una pipe, un socket\index{socket} o una
509     fifo.
510     \item[\errcode{EINVAL}] \param{whence} non è un valore valido.
511   \end{errlist}
512   ed inoltre \errval{EBADF}.}
513 \end{functions}
514
515 La nuova posizione è impostata usando il valore specificato da \param{offset},
516 sommato al riferimento dato da \param{whence}; quest'ultimo può assumere i
517 seguenti valori\footnote{per compatibilità con alcune vecchie notazioni
518   questi valori possono essere rimpiazzati rispettivamente con 0, 1 e 2 o con
519   \const{L\_SET}, \const{L\_INCR} e \const{L\_XTND}.}:
520 \begin{basedescript}{\desclabelwidth{2.0cm}}
521 \item[\const{SEEK\_SET}] si fa riferimento all'inizio del file: il valore
522   (sempre positivo) di \param{offset} indica direttamente la nuova posizione
523   corrente.
524 \item[\const{SEEK\_CUR}] si fa riferimento alla posizione corrente del file:
525   ad essa viene sommato \param{offset} (che può essere negativo e positivo)
526   per ottenere la nuova posizione corrente.
527 \item[\const{SEEK\_END}] si fa riferimento alla fine del file: alle dimensioni
528   del file viene sommato \param{offset} (che può essere negativo e positivo)
529   per ottenere la nuova posizione corrente.
530 \end{basedescript}
531
532 Come accennato in sez.~\ref{sec:file_file_size} con \func{lseek} è possibile
533 impostare la posizione corrente anche oltre la fine del file, e alla
534 successiva scrittura il file sarà esteso. La chiamata non causa nessun accesso
535 al file, si limita a modificare la posizione corrente (cioè il valore
536 \var{f\_pos} in \param{file}, vedi fig.~\ref{fig:file_proc_file}).  Dato che la
537 funzione ritorna la nuova posizione, usando il valore zero per \param{offset}
538 si può riottenere la posizione corrente nel file chiamando la funzione con
539 \code{lseek(fd, 0, SEEK\_CUR)}.
540
541 Si tenga presente inoltre che usare \const{SEEK\_END} non assicura affatto che
542 la successiva scrittura avvenga alla fine del file, infatti se questo è stato
543 aperto anche da un altro processo che vi ha scritto, la fine del file può
544 essersi spostata, ma noi scriveremo alla posizione impostata in precedenza
545 (questa è una potenziale sorgente di \textit{race condition}
546 \index{\textit{race~condition}}, vedi sez.~\ref{sec:file_atomic}).
547
548 Non tutti i file supportano la capacità di eseguire una \func{lseek}, in
549 questo caso la funzione ritorna l'errore \errcode{EPIPE}. Questo, oltre che per
550 i tre casi citati nel prototipo, vale anche per tutti quei dispositivi che non
551 supportano questa funzione, come ad esempio per i file di
552 terminale.\footnote{altri sistemi, usando \const{SEEK\_SET}, in questo caso
553   ritornano il numero di caratteri che vi sono stati scritti.} Lo standard
554 POSIX però non specifica niente in proposito. Infine alcuni file speciali, ad
555 esempio \file{/dev/null}, non causano un errore ma restituiscono un valore
556 indefinito.
557
558
559 \subsection{La funzione \func{read}}
560 \label{sec:file_read}
561
562
563 Una volta che un file è stato aperto (con il permesso in lettura) si possono
564 leggere i dati che contiene utilizzando la funzione \funcd{read}, il cui
565 prototipo è:
566 \begin{prototype}{unistd.h}{ssize\_t read(int fd, void * buf, size\_t count)}
567   
568   Cerca di leggere \param{count} byte dal file \param{fd} al buffer
569   \param{buf}.
570   
571   \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e
572     -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
573   \begin{errlist}
574   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
575     aver potuto leggere qualsiasi dato.
576   \item[\errcode{EAGAIN}] la funzione non aveva nessun dato da restituire e si
577     era aperto il file in modalità \const{O\_NONBLOCK}.
578   \end{errlist}
579   ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
580   \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori dipendenti dalla
581   natura dell'oggetto connesso a \param{fd}.}
582 \end{prototype}
583
584 La funzione tenta di leggere \param{count} byte a partire dalla posizione
585 corrente nel file. Dopo la lettura la posizione sul file è spostata
586 automaticamente in avanti del numero di byte letti. Se \param{count} è zero la
587 funzione restituisce zero senza nessun altro risultato.  Si deve sempre tener
588 presente che non è detto che la funzione \func{read} restituisca sempre il
589 numero di byte richiesto, ci sono infatti varie ragioni per cui la funzione
590 può restituire un numero di byte inferiore; questo è un comportamento normale,
591 e non un errore, che bisogna sempre tenere presente.  
592
593 La prima e più ovvia di queste ragioni è che si è chiesto di leggere più byte
594 di quanto il file ne contenga. In questo caso il file viene letto fino alla
595 sua fine, e la funzione ritorna regolarmente il numero di byte letti
596 effettivamente. Raggiunta la fine del file, alla ripetizione di un'operazione
597 di lettura, otterremmo il ritorno immediato di \func{read} con uno zero.  La
598 condizione di raggiungimento della fine del file non è un errore, e viene
599 segnalata appunto da un valore di ritorno di \func{read} nullo. Ripetere
600 ulteriormente la lettura non avrebbe nessun effetto se non quello di
601 continuare a ricevere zero come valore di ritorno.
602
603 Con i \textsl{file regolari} questa è l'unica situazione in cui si può avere
604 un numero di byte letti inferiore a quello richiesto, ma questo non è vero
605 quando si legge da un terminale, da una fifo o da una pipe. In tal caso
606 infatti, se non ci sono dati in ingresso, la \func{read} si blocca (a meno di
607 non aver selezionato la modalità non bloccante, vedi
608 sez.~\ref{sec:file_noblocking}) e ritorna solo quando ne arrivano; se il numero
609 di byte richiesti eccede quelli disponibili la funzione ritorna comunque, ma
610 con un numero di byte inferiore a quelli richiesti.
611
612 Lo stesso comportamento avviene caso di lettura dalla rete (cioè su un
613 socket\index{socket}, come vedremo in sez.~\ref{sec:sock_io_behav}), o per la
614 lettura da certi file di dispositivo, come le unità a nastro, che
615 restituiscono sempre i dati ad un singolo blocco alla volta, o come le linee
616 seriali, che restituiscono solo i dati ricevuti fino al momento della lettura.
617
618 Infine anche le due condizioni segnalate dagli errori \errcode{EINTR} ed
619 \errcode{EAGAIN} non sono propriamente degli errori. La prima si verifica
620 quando la \func{read} è bloccata in attesa di dati in ingresso e viene
621 interrotta da un segnale; in tal caso l'azione da intraprendere è quella di
622 rieseguire la funzione.  Torneremo in dettaglio sull'argomento in
623 sez.~\ref{sec:sig_gen_beha}.  La seconda si verifica quando il file è aperto
624 in modalità non bloccante (vedi sez.~\ref{sec:file_noblocking}) e non ci sono
625 dati in ingresso: la funzione allora ritorna immediatamente con un errore
626 \errcode{EAGAIN}\footnote{BSD usa per questo errore la costante
627   \errcode{EWOULDBLOCK}, in Linux, con le \acr{glibc}, questa è sinonima di
628   \errcode{EAGAIN}.} che indica soltanto che non essendoci al momento dati
629 disponibili occorre provare a ripetere la lettura in un secondo tempo.
630
631 La funzione \func{read} è una delle system call fondamentali, esistenti fin
632 dagli albori di Unix, ma nella seconda versione delle \textit{Single Unix
633   Specification}\footnote{questa funzione, e l'analoga \func{pwrite} sono
634   state aggiunte nel kernel 2.1.60, il supporto nelle \acr{glibc}, compresa
635   l'emulazione per i vecchi kernel che non hanno la system call, è stato
636   aggiunto con la versione 2.1, in versioni precedenti sia del kernel che
637   delle librerie la funzione non è disponibile.} (quello che viene chiamato
638 normalmente Unix98, vedi sez.~\ref{sec:intro_opengroup}) è stata introdotta la
639 definizione di un'altra funzione di lettura, \funcd{pread}, il cui prototipo è:
640 \begin{prototype}{unistd.h}
641 {ssize\_t pread(int fd, void * buf, size\_t count, off\_t offset)}
642
643 Cerca di leggere \param{count} byte dal file \param{fd}, a partire dalla
644 posizione \param{offset}, nel buffer \param{buf}.
645   
646 \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
647   in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
648   \func{read} e \func{lseek}.}
649 \end{prototype}
650
651 La funzione prende esattamente gli stessi argomenti di \func{read} con lo
652 stesso significato, a cui si aggiunge l'argomento \func{offset} che indica una
653 posizione sul file. Indetico è il comportamento ed il valore di ritorno. La
654 funzione serve quando si vogliono leggere dati dal file senza modificare la
655 posizione corrente.
656
657 L'uso di \func{pread} è equivalente all'esecuzione di una \func{read} seguita
658 da una \func{lseek} che riporti al valore precedente la posizione corrente sul
659 file, ma permette di eseguire l'operazione atomicamente. Questo può essere
660 importante quando la posizione sul file viene condivisa da processi diversi
661 (vedi sez.~\ref{sec:file_sharing}).  Il valore di
662 \param{offset} fa sempre riferimento all'inizio del file.
663
664 La funzione \func{pread} è disponibile anche in Linux, però diventa
665 accessibile solo attivando il supporto delle estensioni previste dalle
666 \textit{Single Unix Specification} con la definizione della macro:
667 \begin{verbatim}
668 #define _XOPEN_SOURCE 500
669 \end{verbatim}
670 e si ricordi di definire questa macro prima dell'inclusione del file di
671 dichiarazioni \file{unistd.h}.
672
673
674
675 \subsection{La funzione \func{write}}
676 \label{sec:file_write}
677
678 Una volta che un file è stato aperto (con il permesso in scrittura) si può
679 scrivere su di esso utilizzando la funzione \funcd{write}, il cui prototipo è:
680 \begin{prototype}{unistd.h}{ssize\_t write(int fd, void * buf, size\_t count)}
681   
682   Scrive \param{count} byte dal buffer \param{buf} sul file \param{fd}.
683   
684   \bodydesc{La funzione ritorna il numero di byte scritti in caso di successo
685     e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
686   \begin{errlist}
687   \item[\errcode{EINVAL}] \param{fd} è connesso ad un oggetto che non consente
688     la scrittura.
689   \item[\errcode{EFBIG}] si è cercato di scrivere oltre la dimensione massima
690     consentita dal filesystem o il limite per le dimensioni dei file del
691     processo o su una posizione oltre il massimo consentito.
692   \item[\errcode{EPIPE}] \param{fd} è connesso ad una pipe il cui altro capo è
693     chiuso in lettura; in questo caso viene anche generato il segnale
694     \const{SIGPIPE}, se questo viene gestito (o bloccato o ignorato) la
695     funzione ritorna questo errore.
696   \item[\errcode{EINTR}] si è stati interrotti da un segnale prima di aver
697     potuto scrivere qualsiasi dato.
698   \item[\errcode{EAGAIN}] ci si sarebbe bloccati, ma il file era aperto in
699     modalità \const{O\_NONBLOCK}.
700   \end{errlist}
701   ed inoltre \errval{EBADF}, \errval{EIO}, \errval{EISDIR}, \errval{EBADF},
702   \errval{ENOSPC}, \errval{EINVAL} e \errval{EFAULT} ed eventuali altri errori
703   dipendenti dalla natura dell'oggetto connesso a \param{fd}.}
704 \end{prototype}
705
706 Come nel caso di \func{read} la funzione tenta di scrivere \param{count} byte
707 a partire dalla posizione corrente nel file e sposta automaticamente la
708 posizione in avanti del numero di byte scritti. Se il file è aperto in
709 modalità \const{O\_APPEND} i dati vengono sempre scritti alla fine del file.
710 Lo standard POSIX richiede che i dati scritti siano immediatamente disponibili
711 ad una \func{read} chiamata dopo che la \func{write} che li ha scritti è
712 ritornata; ma dati i meccanismi di caching non è detto che tutti i filesystem
713 supportino questa capacità.
714
715 Se \param{count} è zero la funzione restituisce zero senza fare nient'altro.
716 Per i file ordinari il numero di byte scritti è sempre uguale a quello
717 indicato da \param{count}, a meno di un errore. Negli altri casi si ha lo
718 stesso comportamento di \func{read}.
719
720 Anche per \func{write} lo standard Unix98 definisce un'analoga \funcd{pwrite}
721 per scrivere alla posizione indicata senza modificare la posizione corrente
722 nel file, il suo prototipo è:
723 \begin{prototype}{unistd.h}
724 {ssize\_t pwrite(int fd, void * buf, size\_t count, off\_t offset)}
725   
726 Cerca di scrivere sul file \param{fd}, a partire dalla posizione
727 \param{offset}, \param{count} byte dal buffer \param{buf}.
728   
729 \bodydesc{La funzione ritorna il numero di byte letti in caso di successo e -1
730   in caso di errore, nel qual caso \var{errno} assumerà i valori già visti per
731   \func{write} e \func{lseek}.}
732 \end{prototype}
733 \noindent e per essa valgono le stesse considerazioni fatte per \func{pread}.
734
735
736 \section{Caratteristiche avanzate}
737 \label{sec:file_adv_func}
738
739 In questa sezione approfondiremo alcune delle caratteristiche più sottili
740 della gestione file in un sistema unix-like, esaminando in dettaglio il
741 comportamento delle funzioni base, inoltre tratteremo le funzioni che
742 permettono di eseguire alcune operazioni avanzate con i file (il grosso
743 dell'argomento sarà comunque affrontato in cap.~\ref{cha:file_advanced}).
744
745
746 \subsection{La condivisione dei files}
747 \label{sec:file_sharing}
748
749 In sez.~\ref{sec:file_fd} abbiamo descritto brevemente l'architettura
750 dell'interfaccia con i file da parte di un processo, mostrando in
751 fig.~\ref{fig:file_proc_file} le principali strutture usate dal kernel;
752 esamineremo ora in dettaglio le conseguenze che questa architettura ha nei
753 confronti dell'accesso allo stesso file da parte di processi diversi.
754
755 \begin{figure}[htb]
756   \centering
757   \includegraphics[width=15cm]{img/filemultacc}
758   \caption{Schema dell'accesso allo stesso file da parte di due processi 
759     diversi}
760   \label{fig:file_mult_acc}
761 \end{figure}
762
763 Il primo caso è quello in cui due processi diversi aprono lo stesso file
764 su disco; sulla base di quanto visto in sez.~\ref{sec:file_fd} avremo una
765 situazione come quella illustrata in fig.~\ref{fig:file_mult_acc}: ciascun
766 processo avrà una sua voce nella \textit{file table} referenziata da un
767 diverso file descriptor nella sua \struct{file\_struct}. Entrambe le voci
768 nella \textit{file table} faranno però riferimento allo stesso
769 inode\index{inode} su disco.
770
771 Questo significa che ciascun processo avrà la sua posizione corrente sul file,
772 la sua modalità di accesso e versioni proprie di tutte le proprietà che
773 vengono mantenute nella sua voce della \textit{file table}. Questo ha
774 conseguenze specifiche sugli effetti della possibile azione simultanea sullo
775 stesso file, in particolare occorre tenere presente che:
776 \begin{itemize}
777 \item ciascun processo può scrivere indipendentemente; dopo ciascuna
778   \func{write} la posizione corrente sarà cambiata solo nel processo. Se la
779   scrittura eccede la dimensione corrente del file questo verrà esteso
780   automaticamente con l'aggiornamento del campo \var{i\_size}
781   nell'inode\index{inode}.
782 \item se un file è in modalità \const{O\_APPEND} tutte le volte che viene
783   effettuata una scrittura la posizione corrente viene prima impostata alla
784   dimensione corrente del file letta dall'inode\index{inode}. Dopo la
785   scrittura il file viene automaticamente esteso.
786 \item l'effetto di \func{lseek} è solo quello di cambiare il campo
787   \var{f\_pos} nella struttura \struct{file} della \textit{file table}, non
788   c'è nessuna operazione sul file su disco. Quando la si usa per porsi alla
789   fine del file la posizione viene impostata leggendo la dimensione corrente
790   dall'inode\index{inode}.
791 \end{itemize}
792
793 \begin{figure}[htb]
794   \centering
795   \includegraphics[width=15cm]{img/fileshar}
796   \caption{Schema dell'accesso ai file da parte di un processo figlio}
797   \label{fig:file_acc_child}
798 \end{figure}
799
800 Il secondo caso è quello in cui due file descriptor di due processi diversi
801 puntino alla stessa voce nella \textit{file table}; questo è ad esempio il
802 caso dei file aperti che vengono ereditati dal processo figlio all'esecuzione
803 di una \func{fork} (si ricordi quanto detto in sez.~\ref{sec:proc_fork}). La
804 situazione è illustrata in fig.~\ref{fig:file_acc_child}; dato che il processo
805 figlio riceve una copia dello spazio di indirizzi del padre, riceverà anche
806 una copia di \struct{file\_struct} e relativa tabella dei file aperti.
807
808 In questo modo padre e figlio avranno gli stessi file descriptor che faranno
809 riferimento alla stessa voce nella \textit{file table}, condividendo così la
810 posizione corrente sul file. Questo ha le conseguenze descritte a suo tempo in
811 sez.~\ref{sec:proc_fork}: in caso di scrittura contemporanea la posizione
812 corrente nel file varierà per entrambi i processi (in quanto verrà modificato
813 \var{f\_pos} che è lo stesso per entrambi).
814
815 Si noti inoltre che anche i flag di stato del file (quelli impostati
816 dall'argomento \param{flag} di \func{open}) essendo tenuti nella voce della
817 \textit{file table}\footnote{per la precisione nel campo \var{f\_flags} di
818   \struct{file}.}, vengono in questo caso condivisi. Ai file però sono
819 associati anche altri flag, dei quali l'unico usato al momento è
820 \const{FD\_CLOEXEC}, detti \textit{file descriptor flags}. Questi ultimi sono
821 tenuti invece in \struct{file\_struct}, e perciò sono specifici di ciascun
822 processo e non vengono modificati dalle azioni degli altri anche in caso di
823 condivisione della stessa voce della \textit{file table}.
824
825
826
827 \subsection{Operazioni atomiche con i file}
828 \label{sec:file_atomic}
829
830 Come si è visto in un sistema unix-like è sempre possibile per più processi
831 accedere in contemporanea allo stesso file, e che le operazioni di lettura e
832 scrittura possono essere fatte da ogni processo in maniera autonoma in base
833 ad una posizione corrente nel file che è locale a ciascuno di essi.
834
835 Se dal punto di vista della lettura dei dati questo non comporta nessun
836 problema, quando si andrà a scrivere le operazioni potranno mescolarsi in
837 maniera imprevedibile.  Il sistema però fornisce in alcuni casi la possibilità
838 di eseguire alcune operazioni di scrittura in maniera coordinata anche senza
839 utilizzare meccanismi di sincronizzazione più complessi (come il \textit{file
840   locking}\index{file!locking}, che esamineremo in
841 sez.~\ref{sec:file_locking}).
842
843 Un caso tipico di necessità di accesso condiviso in scrittura è quello in cui
844 vari processi devono scrivere alla fine di un file (ad esempio un file di
845 log). Come accennato in sez.~\ref{sec:file_lseek} impostare la posizione alla
846 fine del file e poi scrivere può condurre ad una \textit{race
847   condition}\index{\textit{race~condition}}: infatti può succedere che un
848 secondo processo scriva alla fine del file fra la \func{lseek} e la
849 \func{write}; in questo caso, come abbiamo appena visto, il file sarà esteso,
850 ma il nostro primo processo avrà ancora la posizione corrente impostata con la
851 \func{lseek} che non corrisponde più alla fine del file, e la successiva
852 \func{write} sovrascriverà i dati del secondo processo.
853
854 Il problema è che usare due system call in successione non è un'operazione
855 atomica; il problema è stato risolto introducendo la modalità
856 \const{O\_APPEND}. In questo caso infatti, come abbiamo descritto in
857 precedenza, è il kernel che aggiorna automaticamente la posizione alla fine
858 del file prima di effettuare la scrittura, e poi estende il file. Tutto questo
859 avviene all'interno di una singola system call (la \func{write}) che non
860 essendo interrompibile da un altro processo costituisce un'operazione atomica.
861
862 Un altro caso tipico in cui è necessaria l'atomicità è quello in cui si vuole
863 creare un \textsl{file di lock}\index{file!di lock}, bloccandosi se il file
864 esiste. In questo caso la sequenza logica porterebbe a verificare prima
865 l'esistenza del file con una \func{stat} per poi crearlo con una \func{creat};
866 di nuovo avremmo la possibilità di una race
867 condition\index{\textit{race~condition}} da parte di un altro processo che
868 crea lo stesso file fra il controllo e la creazione.
869
870 Per questo motivo sono stati introdotti per \func{open} i due flag
871 \const{O\_CREAT} e \const{O\_EXCL}. In questo modo l'operazione di controllo
872 dell'esistenza del file (con relativa uscita dalla funzione con un errore) e
873 creazione in caso di assenza, diventa atomica essendo svolta tutta all'interno
874 di una singola system call (per i dettagli sull'uso di questa caratteristica
875 si veda sez.~\ref{sec:ipc_file_lock}).
876
877
878 \subsection{La funzioni \func{sync} e \func{fsync}}
879 \label{sec:file_sync}
880
881 Come accennato in sez.~\ref{sec:file_close} tutte le operazioni di scrittura
882 sono in genere bufferizzate dal kernel, che provvede ad effettuarle in maniera
883 asincrona (ad esempio accorpando gli accessi alla stessa zona del disco) in un
884 secondo tempo rispetto al momento della esecuzione della \func{write}.
885
886 Per questo motivo, quando è necessaria una sincronizzazione dei dati, il
887 sistema mette a disposizione delle funzioni che provvedono a forzare lo
888 scarico dei dati dai buffer del kernel.\footnote{come già accennato neanche
889   questo dà la garanzia assoluta che i dati siano integri dopo la chiamata,
890   l'hardware dei dischi è in genere dotato di un suo meccanismo interno di
891   ottimizzazione per l'accesso al disco che può ritardare ulteriormente la
892   scrittura effettiva.} La prima di queste funzioni è \funcd{sync} il cui
893 prototipo è:
894 \begin{prototype}{unistd.h}{int sync(void)}
895   
896   Sincronizza il buffer della cache dei file col disco.
897   
898   \bodydesc{La funzione ritorna sempre zero.}
899 \end{prototype}
900 \noindent  i vari standard prevedono che la funzione si limiti a far partire
901 le operazioni, ritornando immediatamente; in Linux (dal kernel 1.3.20) invece
902 la funzione aspetta la conclusione delle operazioni di sincronizzazione del
903 kernel.
904
905 La funzione viene usata dal comando \cmd{sync} quando si vuole forzare
906 esplicitamente lo scarico dei dati su disco, o dal demone di sistema
907 \cmd{update} che esegue lo scarico dei dati ad intervalli di tempo fissi: il
908 valore tradizionale, usato da BSD, per l'update dei dati è ogni 30 secondi, ma
909 in Linux il valore utilizzato è di 5 secondi; con le nuove versioni\footnote{a
910   partire dal kernel 2.2.8} poi, è il kernel che si occupa direttamente di
911 tutto quanto attraverso il demone interno \cmd{bdflush}, il cui comportamento
912 può essere controllato attraverso il file \file{/proc/sys/vm/bdflush} (per il
913 significato dei valori si può leggere la documentazione allegata al kernel in
914 \file{Documentation/sysctl/vm.txt}).
915
916 Quando si vogliono scaricare soltanto i dati di un file (ad esempio essere
917 sicuri che i dati di un database sono stati registrati su disco) si possono
918 usare le due funzioni \funcd{fsync} e \funcd{fdatasync}, i cui prototipi sono:
919 \begin{functions}
920   \headdecl{unistd.h}
921   \funcdecl{int fsync(int fd)}
922   Sincronizza dati e metadati del file \param{fd}
923   \funcdecl{int fdatasync(int fd)}
924   Sincronizza i dati del file \param{fd}.
925   
926   \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di errore,
927     nel qual caso \var{errno} assume i valori:
928   \begin{errlist}
929   \item[\errcode{EINVAL}] \param{fd} è un file speciale che non supporta la
930     sincronizzazione.
931   \end{errlist}
932   ed inoltre \errval{EBADF}, \errval{EROFS} e \errval{EIO}.}
933 \end{functions}
934
935 Entrambe le funzioni forzano la sincronizzazione col disco di tutti i dati del
936 file specificato, ed attendono fino alla conclusione delle operazioni;
937 \func{fsync} forza anche la sincronizzazione dei metadati del file (che
938 riguardano sia le modifiche alle tabelle di allocazione dei settori, che gli
939 altri dati contenuti nell'inode\index{inode} che si leggono con \func{fstat},
940 come i tempi del file).
941
942 Si tenga presente che questo non comporta la sincronizzazione della
943 directory che contiene il file (e scrittura della relativa voce su
944 disco) che deve essere effettuata esplicitamente.\footnote{in realtà per
945   il filesystem \acr{ext2}, quando lo si monta con l'opzione \cmd{sync},
946   il kernel provvede anche alla sincronizzazione automatica delle voci
947   delle directory.}
948
949
950 \subsection{La funzioni \func{dup} e \func{dup2}}
951 \label{sec:file_dup}
952
953 Abbiamo già visto in sez.~\ref{sec:file_sharing} come un processo figlio
954 condivida gli stessi file descriptor del padre; è possibile però ottenere un
955 comportamento analogo all'interno di uno stesso processo \textit{duplicando}
956 un file descriptor. Per far questo si usa la funzione \funcd{dup} il cui
957 prototipo è:
958 \begin{prototype}{unistd.h}{int dup(int oldfd)}
959   Crea una copia del file descriptor \param{oldfd}.
960   
961   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
962     -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei
963     valori:
964   \begin{errlist}
965   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto.
966   \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
967     descriptor aperti.
968   \end{errlist}}
969 \end{prototype}
970
971 La funzione ritorna, come \func{open}, il primo file descriptor libero. Il
972 file descriptor è una copia esatta del precedente ed entrambi possono essere
973 interscambiati nell'uso. Per capire meglio il funzionamento della funzione si
974 può fare riferimento a fig.~\ref{fig:file_dup}: l'effetto della funzione è
975 semplicemente quello di copiare il valore nella struttura
976 \struct{file\_struct}, cosicché anche il nuovo file descriptor fa riferimento
977 alla stessa voce nella \textit{file table}; per questo si dice che il nuovo
978 file descriptor è \textsl{duplicato}, da cui il nome della funzione.
979
980 \begin{figure}[htb]
981   \centering \includegraphics[width=15cm]{img/filedup}
982   \caption{Schema dell'accesso ai file duplicati}
983   \label{fig:file_dup}
984 \end{figure}
985
986 Si noti che per quanto illustrato in fig.~\ref{fig:file_dup} i file descriptor
987 duplicati condivideranno eventuali lock, \textit{file status flag}, e
988 posizione corrente. Se ad esempio si esegue una \func{lseek} per modificare la
989 posizione su uno dei due file descriptor, essa risulterà modificata anche
990 sull'altro (dato che quello che viene modificato è lo stesso campo nella voce
991 della \textit{file table} a cui entrambi fanno riferimento). L'unica
992 differenza fra due file descriptor duplicati è che ciascuno avrà il suo
993 \textit{file descriptor flag}; a questo proposito va specificato che nel caso
994 di \func{dup} il flag di \textit{close-on-exec}\index{\textit{close-on-exec}}
995 (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}) viene sempre
996 cancellato nella copia.
997
998 L'uso principale di questa funzione è per la redirezione dell'input e
999 dell'output fra l'esecuzione di una \func{fork} e la successiva \func{exec};
1000 diventa così possibile associare un file (o una pipe) allo standard input o
1001 allo standard output (torneremo sull'argomento in sez.~\ref{sec:ipc_pipe_use},
1002 quando tratteremo le pipe). Per fare questo in genere occorre prima chiudere
1003 il file che si vuole sostituire, cosicché il suo file descriptor possa esser
1004 restituito alla chiamata di \func{dup}, come primo file descriptor
1005 disponibile.
1006
1007 Dato che questa è l'operazione più comune, è prevista una diversa versione
1008 della funzione, \funcd{dup2}, che permette di specificare esplicitamente
1009 qual è il valore di file descriptor che si vuole avere come duplicato; il suo
1010 prototipo è:
1011 \begin{prototype}{unistd.h}{int dup2(int oldfd, int newfd)}
1012   
1013   Rende \param{newfd} una copia del file descriptor \param{oldfd}.
1014   
1015   \bodydesc{La funzione ritorna il nuovo file descriptor in caso di successo e
1016     -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
1017   \begin{errlist}
1018   \item[\errcode{EBADF}] \param{oldfd} non è un file aperto o \param{newfd} ha
1019     un valore fuori dall'intervallo consentito per i file descriptor.
1020   \item[\errcode{EMFILE}] si è raggiunto il numero massimo consentito di file
1021     descriptor aperti.
1022   \end{errlist}}
1023 \end{prototype}
1024 \noindent e qualora il file descriptor \param{newfd} sia già aperto (come
1025 avviene ad esempio nel caso della duplicazione di uno dei file standard) esso
1026 sarà prima chiuso e poi duplicato (così che il file duplicato sarà connesso
1027 allo stesso valore per il file descriptor).
1028
1029 La duplicazione dei file descriptor può essere effettuata anche usando la
1030 funzione di controllo dei file \func{fcntl} (che esamineremo in
1031 sez.~\ref{sec:file_fcntl}) con il parametro \const{F\_DUPFD}.  L'operazione ha
1032 la sintassi \code{fcntl(oldfd, F\_DUPFD, newfd)} e se si usa 0 come valore per
1033 \param{newfd} diventa equivalente a \func{dup}. 
1034
1035 La sola differenza fra le due funzioni\footnote{a parte la sintassi ed i
1036   diversi codici di errore.} è che \func{dup2} chiude il file descriptor
1037 \param{newfd} se questo è già aperto, garantendo che la duplicazione sia
1038 effettuata esattamente su di esso, invece \func{fcntl} restituisce il primo
1039 file descriptor libero di valore uguale o maggiore di \param{newfd} (e se
1040 \param{newfd} è aperto la duplicazione avverrà su un altro file descriptor).
1041
1042
1043 \subsection{La funzione \func{fcntl}}
1044 \label{sec:file_fcntl}
1045
1046 Oltre alle operazioni base esaminate in sez.~\ref{sec:file_base_func} esistono
1047 tutta una serie di operazioni ausiliarie che è possibile eseguire su un file
1048 descriptor, che non riguardano la normale lettura e scrittura di dati, ma la
1049 gestione sia delle loro proprietà, che di tutta una serie di ulteriori
1050 funzionalità che il kernel può mettere a disposizione.\footnote{ad esempio si
1051   gestiscono con questa funzione varie modalità di I/O asincrono (vedi
1052   sez.~\ref{sec:file_asyncronous_operation}) e il file
1053   locking\index{file!locking} (vedi sez.~\ref{sec:file_locking}).}
1054
1055 Per queste operazioni di manipolazione e di controllo delle varie proprietà e
1056 caratteristiche di un file descriptor, viene usata la funzione \funcd{fcntl},
1057 il cui prototipo è:
1058 \begin{functions}
1059   \headdecl{unistd.h}
1060   \headdecl{fcntl.h}
1061   \funcdecl{int fcntl(int fd, int cmd)}
1062   \funcdecl{int fcntl(int fd, int cmd, long arg)}
1063   \funcdecl{int fcntl(int fd, int cmd, struct flock * lock)}
1064   Esegue una delle possibili operazioni specificate da \param{cmd}
1065   sul file \param{fd}.
1066   
1067   \bodydesc{La funzione ha valori di ritorno diversi a seconda
1068     dell'operazione. In caso di errore il valore di ritorno è sempre -1 ed il
1069     codice dell'errore è restituito nella variabile \var{errno}; i codici
1070     possibili dipendono dal tipo di operazione, l'unico valido in generale è:
1071   \begin{errlist}
1072   \item[\errcode{EBADF}] \param{fd} non è un file aperto.
1073   \end{errlist}}
1074 \end{functions}
1075
1076
1077 Il primo argomento della funzione è sempre il numero di file descriptor
1078 \var{fd} su cui si vuole operare. Il comportamento di questa funzione, il
1079 numero e il tipo degli argomenti, il valore di ritorno e gli eventuali errori
1080 sono determinati dal valore dell'argomento \param{cmd} che in sostanza
1081 corrisponde all'esecuzione di un determinato \textsl{comando}; in
1082 sez.~\ref{sec:file_dup} abbiamo incontrato un esempio dell'uso di \func{fcntl}
1083 per la duplicazione dei file descriptor, una lista di tutti i possibili valori
1084 per \var{cmd} è riportata di seguito:
1085 \begin{basedescript}{\desclabelwidth{2.0cm}}
1086 \item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
1087   maggiore o uguale ad \param{arg} e ne fa una copia di \param{fd}. Ritorna il
1088   nuovo file descriptor in caso di successo e -1 in caso di errore. Gli errori
1089   possibili sono \errcode{EINVAL} se \param{arg} è negativo o maggiore del
1090   massimo consentito o \errcode{EMFILE} se il processo ha già raggiunto il
1091   massimo numero di descrittori consentito.
1092 \item[\const{F\_SETFD}] imposta il valore del \textit{file descriptor flag} al
1093   valore specificato con \param{arg}. Al momento l'unico bit usato è quello di
1094   \textit{close-on-exec}\index{\textit{close-on-exec}}, identificato dalla
1095   costante \const{FD\_CLOEXEC}, che serve a richiedere che il file venga
1096   chiuso nella esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}).
1097   Ritorna un valore nullo in caso di successo e -1 in caso di errore.
1098 \item[\const{F\_GETFD}] ritorna il valore del \textit{file descriptor flag} di
1099   \param{fd} o -1 in caso di errore; se \const{FD\_CLOEXEC} è impostato i file
1100   descriptor aperti vengono chiusi attraverso una \func{exec} altrimenti (il
1101   comportamento predefinito) restano aperti.
1102 \item[\const{F\_GETFL}] ritorna il valore del \textit{file status flag} in
1103   caso di successo o -1 in caso di errore; permette cioè di rileggere quei bit
1104   impostati da \func{open} all'apertura del file che vengono memorizzati
1105   (quelli riportati nella prima e terza sezione di
1106   tab.~\ref{tab:file_open_flags}).
1107 \item[\const{F\_SETFL}] imposta il \textit{file status flag} al valore
1108   specificato da \param{arg}, ritorna un valore nullo in caso di successo o -1
1109   in caso di errore. Possono essere impostati solo i bit riportati nella terza
1110   sezione di tab.~\ref{tab:file_open_flags}.\footnote{la pagina di manuale
1111     riporta come impostabili solo \const{O\_APPEND}, \const{O\_NONBLOCK} e
1112     \const{O\_ASYNC}.}
1113 \item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
1114   \param{lock}, sovrascrivendo la struttura da esso puntata con il risultato,
1115   ritorna un valore nullo in caso di successo o -1 in caso di errore.  Questa
1116   funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
1117 \item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
1118   specificato nella struttura puntata da \param{lock}. Se il lock è tenuto da
1119   qualcun'altro ritorna immediatamente restituendo -1 e imposta \var{errno} a
1120   \errcode{EACCES} o \errcode{EAGAIN}, in caso di successo ritorna un valore
1121   nullo. Questa funzionalità è trattata in dettaglio in
1122   sez.~\ref{sec:file_posix_lock}.
1123 \item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
1124   la funzione non ritorna subito ma attende che il blocco sia rilasciato. Se
1125   l'attesa viene interrotta da un segnale la funzione restituisce -1 e imposta
1126   \var{errno} a \errcode{EINTR}, in caso di successo ritorna un valore nullo.
1127   Questa funzionalità è trattata in dettaglio in
1128   sez.~\ref{sec:file_posix_lock}.
1129 \item[\const{F\_GETOWN}] restituisce il \acr{pid} del processo o
1130   l'identificatore del process group\footnote{i \texttt{process group} sono
1131     (vedi sez.~\ref{sec:sess_proc_group}) raggruppamenti di processi usati nel
1132     controllo di sessione; a ciascuno di essi è associato un identificatore
1133     (un numero positivo analogo al \acr{pid}).}  che è preposto alla ricezione
1134   dei segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
1135   descriptor \param{fd}. Nel caso di un process group viene restituito un
1136   valore negativo il cui valore assoluto corrisponde all'identificatore del
1137   process group. In caso di errore viene restituito -1.
1138 \item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
1139   l'identificatore del processo o del \textit{process group} che riceverà i
1140   segnali \const{SIGIO} e \const{SIGURG} per gli eventi associati al file
1141   descriptor \param{fd}, ritorna un valore nullo in caso di successo o -1 in
1142   caso di errore.  Come per \const{F\_GETOWN}, per impostare un
1143   \textit{process group} si deve usare per \param{arg} un valore negativo, il
1144   cui valore assoluto corrisponde all'identificatore del \textit{process
1145     group}.
1146 \item[\const{F\_GETSIG}] restituisce il valore del segnale inviato quando ci
1147   sono dati disponibili in ingresso su un file descriptor aperto ed impostato
1148   per l'I/O asincrono (si veda sez.~\ref{sec:file_asyncronous_io}). Il valore 0
1149   indica il valore predefinito (che è \const{SIGIO}), un valore diverso da
1150   zero indica il segnale richiesto, (che può essere anche lo stesso
1151   \const{SIGIO}). In caso di errore ritorna -1.
1152 \item[\const{F\_SETSIG}] imposta il segnale da inviare quando diventa
1153   possibile effettuare I/O sul file descriptor in caso di I/O asincrono,
1154   ritorna un valore nullo in caso di successo o -1 in caso di errore. Il
1155   valore zero indica di usare il segnale predefinito, \const{SIGIO}. Un altro
1156   valore diverso da zero (compreso lo stesso \const{SIGIO}) specifica il
1157   segnale voluto; l'uso di un valore diverso da zero permette inoltre, se si è
1158   installato il gestore del segnale come \var{sa\_sigaction} usando
1159   \const{SA\_SIGINFO}, (vedi sez.~\ref{sec:sig_sigaction}), di rendere
1160   disponibili al gestore informazioni ulteriori riguardo il file che ha
1161   generato il segnale attraverso i valori restituiti in \struct{siginfo\_t}
1162   (come vedremo in sez.~\ref{sec:file_asyncronous_io}).\footnote{i due comandi
1163     \const{F\_SETSIG} e \const{F\_GETSIG} sono una estensione specifica di
1164     Linux.}
1165 \item[\const{F\_SETLEASE}] imposta o rimuove un \textit{file
1166     lease}\footnote{questa è una nuova funzionalità, specifica di Linux, e
1167     presente solo a partire dai kernel della serie 2.4.x, in cui il processo
1168     che detiene un \textit{lease} su un file riceve una notifica qualora un
1169     altro processo cerca di eseguire una \func{open} o una \func{truncate} su
1170     di esso.} sul file descriptor \var{fd} a seconda del valore del terzo
1171   argomento, che in questo caso è un \ctyp{int}, ritorna un valore nullo in
1172   caso di successo o -1 in caso di errore. Questa funzionalità avanzata è
1173   trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
1174 \item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il
1175   processo detiene nei confronti del file descriptor \var{fd} o -1 in caso di
1176   errore. Con questo comando il terzo argomento può essere omesso. Questa
1177   funzionalità avanzata è trattata in dettaglio in
1178   sez.~\ref{sec:file_asyncronous_operation}.
1179 \item[\const{F\_NOTIFY}] attiva un meccanismo di notifica per cui viene
1180   riportata al processo chiamante, tramite il segnale \const{SIGIO} (o altro
1181   segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
1182   direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
1183   in essa contenuti; ritorna un valore nullo in caso di successo o -1 in caso
1184   di errore. Questa funzionalità avanzata, disponibile dai kernel della serie
1185   2.4.x, è trattata in dettaglio in sez.~\ref{sec:file_asyncronous_operation}.
1186 \end{basedescript}
1187
1188 La maggior parte delle funzionalità di \func{fcntl} sono troppo avanzate per
1189 poter essere affrontate in tutti i loro aspetti a questo punto; saranno
1190 pertanto riprese più avanti quando affronteremo le problematiche ad esse
1191 relative. In particolare le tematiche relative all'I/O asincrono e ai vari
1192 meccanismi di notifica saranno trattate in maniera esaustiva in
1193 sez.~\ref{sec:file_asyncronous_operation} mentre quelle relative al
1194 \textit{file locking}\index{file!locking} saranno esaminate in
1195 sez.~\ref{sec:file_locking}).
1196
1197 Si tenga presente infine che quando si usa la funzione per determinare le
1198 modalità di accesso con cui è stato aperto il file (attraverso l'uso del
1199 comando \const{F\_GETFL}) è necessario estrarre i bit corrispondenti nel
1200 \textit{file status flag} che si è ottenuto.  Infatti la definizione corrente
1201 di quest'ultimo non assegna bit separati alle tre diverse modalità
1202 \const{O\_RDONLY}, \const{O\_WRONLY} e \const{O\_RDWR}.\footnote{in Linux
1203   queste costanti sono poste rispettivamente ai valori 0, 1 e 2.} Per questo
1204 motivo il valore della modalità di accesso corrente si ottiene eseguendo un
1205 AND binario del valore di ritorno di \func{fcntl} con la maschera
1206 \const{O\_ACCMODE} (anch'essa definita in \file{fcntl.h}), che estrae i bit di
1207 accesso dal \textit{file status flag}.
1208
1209
1210
1211 \subsection{La funzione \func{ioctl}}
1212 \label{sec:file_ioctl}
1213
1214 Benché il concetto di \textit{everything is a file} si sia dimostratato molto
1215 valido anche per l'interazione con i dispositivi più vari, fornendo una
1216 interfaccia che permette di interagire con essi tramite le stesse funzioni
1217 usate per i normali file di dati, esisteranno sempre caratteristiche
1218 peculiari, specifiche dell'hardware e della funzionalità che ciascun
1219 dispositivo può provvedere, che non possono venire comprese in questa
1220 interfaccia astratta (un caso tipico è l'impostazione della velocità di una
1221 porta seriale, o le dimensioni di un framebuffer).
1222
1223 Per questo motivo nell'architettura del sistema è stata prevista l'esistenza
1224 di una funzione apposita, \funcd{ioctl}, con cui poter compiere le operazioni
1225 specifiche di ogni dispositivo particolare, usando come riferimento il solito
1226 file descriptor.  Il prototipo di questa funzione è:
1227 \begin{prototype}{sys/ioctl.h}{int ioctl(int fd, int request, ...)}  
1228   Manipola il dispositivo sottostante, usando l'argomento \param{request} per
1229   specificare l'operazione richiesta ed il terzo argomento (usualmente di tipo
1230   \param{char * argp} o \param{int argp}) per il trasferimento
1231   dell'informazione necessaria.
1232   
1233   \bodydesc{La funzione nella maggior parte dei casi ritorna 0, alcune
1234     operazioni usano però il valore di ritorno per restituire informazioni. In
1235     caso di errore viene sempre restituito -1 ed \var{errno} assumerà uno dei
1236     valori:
1237   \begin{errlist}
1238   \item[\errcode{ENOTTY}] il file \param{fd} non è associato con un device, o
1239     la richiesta non è applicabile all'oggetto a cui fa riferimento
1240     \param{fd}.
1241   \item[\errcode{EINVAL}] gli argomenti \param{request} o \param{argp} non sono
1242     validi.
1243   \end{errlist}
1244   ed inoltre \errval{EBADF} e \errval{EFAULT}.}
1245 \end{prototype}
1246
1247 La funzione serve in sostanza per fare tutte quelle operazioni che non si
1248 adattano al design dell'architettura dei file e che non è possibile effettuare
1249 con le funzioni esaminate finora. Esse vengono selezionate attraverso il
1250 valore di \param{request} e gli eventuali risultati possono essere restituiti
1251 sia attraverso il valore di ritorno che attraverso il terzo argomento
1252 \param{argp}. Sono esempi delle operazioni gestite con una \func{ioctl}:
1253 \begin{itemize*}
1254 \item il cambiamento dei font di un terminale.
1255 \item l'esecuzione di una traccia audio di un CDROM.
1256 \item i comandi di avanti veloce e riavvolgimento di un nastro.
1257 \item il comando di espulsione di un dispositivo rimovibile.
1258 \item l'impostazione della velocità trasmissione di una linea seriale.
1259 \item l'impostazione della frequenza e della durata dei suoni emessi dallo
1260   speaker.
1261 \end{itemize*}
1262
1263 In generale ogni dispositivo ha un suo insieme di possibili diverse operazioni
1264 effettuabili attraverso \func{ioctl}, che sono definite nell'header file
1265 \file{sys/ioctl.h}, e devono essere usate solo sui dispositivi cui fanno
1266 riferimento. Infatti anche se in genere i valori di \param{request} sono
1267 opportunamente differenziati a seconda del dispositivo\footnote{il kernel usa
1268   un apposito \textit{magic number} per distinguere ciascun dispositivo nella
1269   definizione delle macro da usare per \param{request}, in modo da essere
1270   sicuri che essi siano sempre diversi, ed il loro uso per dispositivi diversi
1271   causi al più un errore.  Si veda il capitolo quinto di \cite{LinDevDri} per
1272   una trattazione dettagliata dell'argomento.} così che la richiesta di
1273 operazioni relative ad altri dispositivi usualmente provoca il ritorno della
1274 funzione con una condizione di errore, in alcuni casi, relativi a valori
1275 assegnati prima che questa differenziazione diventasse pratica corrente, si
1276 potrebbero usare valori validi anche per il dispositivo corrente, con effetti
1277 imprevedibili o indesiderati.
1278
1279 Data la assoluta specificità della funzione, il cui comportamento varia da
1280 dispositivo a dispositivo, non è possibile fare altro che dare una descrizione
1281 sommaria delle sue caratteristiche; torneremo ad esaminare in seguito quelle
1282 relative ad alcuni casi specifici (ad esempio la gestione dei terminali è
1283 effettuata attraverso \func{ioctl} in quasi tutte le implementazioni di Unix),
1284 qui riportiamo solo i valori di alcuni comandi che sono definiti per ogni
1285 file:
1286 \begin{basedescript}{\desclabelwidth{2.0cm}}
1287 \item[\const{FIOCLEX}] Imposta il bit di \textit{close on exec}.
1288 \item[\const{FIONCLEX}] Cancella il bit di \textit{close on exec}.
1289 \item[\const{FIOASYNC}] Abilita l'I/O asincrono.
1290 \item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
1291 \end{basedescript}
1292 relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}.
1293
1294
1295 %%% Local Variables: 
1296 %%% mode: latex
1297 %%% TeX-master: "gapil"
1298 %%% End: