Placeholder per le sezioni su IPC POSIX
[gapil.git] / fileadv.tex
1 \chapter{La gestione avanzata dei file}
2 \label{cha:file_advanced}
3
4 In questo capitolo affronteremo le tematiche relative alla gestione avanzata
5 dei file, che non sono state trattate in \capref{cha:file_unix_interface},
6 dove ci si è limitati ad una panoramica delle funzioni base. In particolare
7 tratteremo delle funzioni di input/output avanzato e del \textit{file
8   locking}.
9
10
11 \section{Le funzioni di I/O avanzato}
12 \label{sec:file_advanced_io}
13
14 In questa sezione esamineremo le funzioni che permettono una gestione più
15 sofisticata dell'I/O su file, a partire da quelle che permettono di gestire
16 l'accesso contemporaneo a più file, per concludere con la gestione dell'I/O
17 mappato in memoria.
18
19
20 \subsection{La modalità di I/O \textsl{non-bloccante}}
21 \label{sec:file_noblocking}
22
23 Abbiamo visto in \secref{sec:sig_gen_beha}, affrontando la suddivisione fra
24 \textit{fast} e \textit{slow} system call, che in certi casi le funzioni di
25 I/O possono bloccarsi indefinitamente.\footnote{si ricordi però che questo può
26   accadere solo per le pipe, i socket ed alcuni file di dispositivo; sui file
27   normali le funzioni di lettura e scrittura ritornano sempre subito.}  Ad
28 esempio le operazioni di lettura possono bloccarsi quando non ci sono dati
29 disponibili sul descrittore su cui si sta operando.
30
31 Questo comportamento causa uno dei problemi più comuni che ci si trova ad
32 affrontare nelle operazioni di I/O, che è quello che si verifica quando si
33 devono eseguire operazioni che possono bloccarsi su più file descriptor:
34 mentre si è bloccati su uno di essi su di un'altro potrebbero essere presenti
35 dei dati; così che nel migliore dei casi si avrebbe una lettura ritardata
36 inutilmente, e nel peggiore si potrebbe addirittura arrivare ad un
37 \textit{deadlock}.
38
39 Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
40 questo tipo di comportamento aprendo un file in modalità
41 \textsl{non-bloccante}, attraverso l'uso del flag \macro{O\_NONBLOCK} nella
42 chiamata di \func{open}. In questo caso le funzioni di input/output che
43 altrimenti si sarebbero bloccate ritornano immediatamente, restituendo
44 l'errore \macro{EAGAIN}.
45
46 L'utilizzo di questa modalità di I/O permette di risolvere il problema
47 controllando a turno i vari file descriptor, in un ciclo in cui si ripete
48 l'accesso fintanto che esso non viene garantito.  Ovviamente questa tecnica,
49 detta \textit{polling}\index{polling}, è estremamente inefficiente: si tiene
50 costantemente impiegata la CPU solo per eseguire in continuazione delle system
51 call che nella gran parte dei casi falliranno. Per evitare questo, come
52 vedremo in \secref{sec:file_multiplexing}, è stata introdotta una nuova
53 interfaccia di programmazione, che comporta comunque l'uso della modalità di
54 I/O non bloccante.
55
56
57
58 \subsection{L'I/O multiplexing}
59 \label{sec:file_multiplexing}
60
61 Per superare il problema di dover usare il \textit{polling}\index{polling} per
62 controllare la possibilità di effettuare operazioni su un file aperto in
63 modalità non bloccante, sia BSD che System V hanno introdotto delle nuove
64 funzioni in grado di sospendere l'esecuzione di un processo in attesa che
65 l'accesso diventi possibile.  Il primo ad introdurre questa modalità di
66 operazione, chiamata usualmente \textit{I/O multiplexing}, è stato
67 BSD,\footnote{la funzione è apparsa in BSD4.2 e standardizzata in BSD4.4, ma è
68   stata portata su tutti i sistemi che supportano i \textit{socket}, compreso
69   le varianti di System V.}  con la funzione \func{select}, il cui prototipo
70 è:
71 \begin{functions}
72   \headdecl{sys/time.h}
73   \headdecl{sys/types.h}
74   \headdecl{unistd.h}
75   \funcdecl{int select(int n, fd\_set *readfds, fd\_set *writefds, fd\_set
76     *exceptfds, struct timeval *timeout)}
77   
78   Attende che uno dei file descriptor degli insiemi specificati diventi
79   attivo.
80   
81   \bodydesc{La funzione in caso di successo restituisce il numero di file
82     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
83     caso \var{errno} assumerà uno dei valori:
84   \begin{errlist}
85   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
86   degli insiemi.
87   \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
88   \item[\macro{EINVAL}] Si è specificato per \param{n} un valore negativo.
89   \end{errlist}
90   ed inoltre \macro{ENOMEM}.
91 }
92 \end{functions}
93
94 La funzione mette il processo in stato di \textit{sleep} (vedi
95 \tabref{tab:proc_proc_states}) fintanto che almeno uno dei file descriptor
96 degli insiemi specificati (\param{readfds}, \param{writefds} e
97 \param{exceptfds}), non diventa attivo, per un tempo massimo specificato da
98 \param{timeout}.
99
100 Per specificare quali file descriptor si intende \textsl{selezionare}, la
101 funzione usa un particolare oggetto, il \textit{file descriptor set},
102 identificato dal tipo \type{fd\_set}, che serve ad identificare un insieme di
103 file descriptor, (in maniera analoga a come un \textit{signal set}, vedi
104 \secref{sec:sig_sigset}, identifica un insieme di segnali). Per la
105 manipolazione di questi \textit{file descriptor set} si possono usare delle
106 opportune macro di preprocessore:
107 \begin{functions}
108   \headdecl{sys/time.h}
109   \headdecl{sys/types.h}
110   \headdecl{unistd.h}
111   \funcdecl{FD\_ZERO(fd\_set *set)}
112   Inizializza l'insieme (vuoto).
113
114   \funcdecl{FD\_SET(int fd, fd\_set *set)}
115   Inserisce il file descriptor \param{fd} nell'insieme.
116
117   \funcdecl{FD\_CLR(int fd, fd\_set *set)}
118   Rimuove il file descriptor \param{fd} nell'insieme.
119   
120   \funcdecl{FD\_ISSET(int fd, fd\_set *set)}
121   Controlla se il file descriptor \param{fd} è nell'insieme.
122 \end{functions}
123
124 In genere un \textit{file descriptor set} può contenere fino ad un massimo di
125 \macro{FD\_SETSIZE} file descriptor.  Questo valore in origine corrispondeva
126 al limite per il numero massimo di file aperti\footnote{ad esempio in Linux,
127   fino alla serie 2.0.x, c'era un limite di 256 file per processo.}, ma
128 quando, come nelle versioni più recenti del kernel, non c'è più un limite
129 massimo, esso indica le dimensioni massime dei numeri usati nei \textit{file
130   descriptor set}.
131
132 La funzione richiede di specificare tre insiemi distinti di file descriptor;
133 il primo, \param{readfds}, verrà osservato per rilevare la disponibilità di
134 effettuare una lettura, il secondo, \param{writefds}, per verificare la
135 possibilità effettuare una scrittura ed il terzo, \param{exceptfds}, per
136 verificare l'esistenza di condizioni eccezionali (come i messaggi urgenti su
137 un \textit{socket}\index{socket}, vedi \secref{sec:xxx_urgent}).
138
139 La funzione inoltre richiede anche di specificare, tramite l'argomento
140 \param{n}, un valore massimo del numero dei file descriptor usati
141 nell'insieme; si può usare il già citato \macro{FD\_SETSIZE}, oppure il numero
142 più alto dei file descriptor usati nei tre insiemi, aumentato di uno.
143
144 Infine l'argomento \param{timeout}, specifica un tempo massimo di
145 attesa\footnote{il tempo è valutato come \textit{elapsed time}.} prima che la
146 funzione ritorni; se impostato a \macro{NULL} la funzione attende
147 indefinitamente. Si può specificare anche un tempo nullo (cioè una \var{struct
148   timeval} con i campi impostati a zero), qualora si voglia semplicemente
149 controllare lo stato corrente dei file descriptor.
150
151 La funzione restituisce il totale dei file descriptor pronti nei tre insiemi,
152 il valore zero indica sempre che si è raggiunto un timeout. Ciascuno dei tre
153 insiemi viene sovrascritto per indicare quale file descriptor è pronto per le
154 operazioni ad esso relative, in modo da poterlo controllare con la macro
155 \macro{FD\_ISSET}. In caso di errore la funzione restituisce -1 e gli insiemi
156 non vengono toccati.
157
158 In Linux \func{select} modifica anche il valore di \param{timeout},
159 impostandolo al tempo restante; questo è utile quando la funzione viene
160 interrotta da un segnale, in tal caso infatti si ha un errore di
161 \macro{EINTR}, ed occorre rilanciare la funzione; in questo modo non è
162 necessario ricalcolare tutte le volte il tempo rimanente.\footnote{questo può
163   causare problemi di portabilità sia quando si trasporta codice scritto su
164   Linux che legge questo valore, sia quando si usano programmi scritti per
165   altri sistemi che non dispongono di questa caratteristica e ricalcolano
166   \param{timeout} tutte le volte. In genere la caratteristica è disponibile
167   nei sistemi che derivano da System V e non disponibile per quelli che
168   derivano da BSD.}
169
170 Come accennato l'interfaccia di \func{select} è una estensione di BSD; anche
171 System V ha introdotto una sua interfaccia per gestire l'\textit{I/O
172   multiplexing}, basata sulla funzione \func{poll},\footnote{la funzione è
173   prevista dallo standard XPG4, ed è stata introdotta in Linux come system
174   call a partire dal kernel 2.1.23 e dalle \acr{libc} 5.4.28.} il cui
175 prototipo è:
176 \begin{prototype}{sys/poll.h}
177   {int poll(struct pollfd *ufds, unsigned int nfds, int timeout)}
178
179 La funzione attente un cambiamento di stato per uno dei file descriptor
180 specificati da \param{ufds}.
181   
182 \bodydesc{La funzione restituisce il numero di file descriptor con attività in
183   caso di successo, o 0 se c'è stato un timeout; in caso di errore viene
184   restituito  -1 ed \var{errno} assumerà uno dei valori:
185   \begin{errlist}
186   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
187   degli insiemi.
188   \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
189   \end{errlist}
190   ed inoltre \macro{EFAULT} e \macro{ENOMEM}.}
191 \end{prototype}
192
193 La funzione tiene sotto controllo un numero \param{ndfs} di file descriptor
194 specificati attraverso un vettore di puntatori a strutture di tipo
195 \type{pollfd}, la cui definizione è riportata in \figref{fig:file_pollfd}.
196 Come \func{select} anche \func{poll} permette di interrompere l'attesa dopo un
197 certo tempo, che va specificato attraverso \param{timeout} in numero di
198 millisecondi (un valore negativo indica un'attesa indefinita).
199
200 \begin{figure}[!htb]
201   \footnotesize \centering
202   \begin{minipage}[c]{15cm}
203     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
204 struct pollfd {
205         int fd;           /* file descriptor */
206         short events;     /* requested events */
207         short revents;    /* returned events */
208 };
209     \end{lstlisting}
210   \end{minipage} 
211   \normalsize 
212   \caption{La struttura \type{pollfd}, utilizzata per specificare le modalità
213     di controllo di un file descriptor alla funzione \func{poll}.}
214   \label{fig:file_pollfd}
215 \end{figure}
216
217 Per ciascun file da controllare deve essere opportunamente predisposta una
218 struttura \type{pollfd}; nel campo \var{fd} deve essere specificato il file
219 descriptor, mentre nel campo \var{events} il tipo di evento su cui si vuole
220 attendere; quest'ultimo deve essere specificato come maschera binaria dei
221 primi tre valori riportati in \tabref{tab:file_pollfd_flags} (gli altri
222 vengono utilizzati solo per \var{revents} come valori in uscita).
223
224 \begin{table}[htb]
225   \centering
226   \footnotesize
227   \begin{tabular}[c]{|l|c|l|}
228     \hline
229     \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
230     \hline
231     \hline
232     \macro{POLLIN}    & 0x001 & È possibile la lettura immediata.\\
233     \macro{POLLPRI}   & 0x002 & Sono presenti dati urgenti.\\
234     \macro{POLLOUT}   & 0x004 & È possibile la scrittura immediata.\\
235     \hline
236     \macro{POLLERR}   & 0x008 & C'è una condizione di errore.\\
237     \macro{POLLHUP}   & 0x010 & Si è verificato un hung-up.\\
238     \macro{POLLNVAL}  & 0x020 & Il file descriptor non è aperto.\\
239     \hline
240     \macro{POLLRDNORM}& 0x040 & Sono disponibili in lettura dati normali.\\ 
241     \macro{POLLRDBAND}& 0x080 & Sono disponibili in lettura dati ad alta 
242                                 priorità. \\
243     \macro{POLLWRNORM}& 0x100 & È possibile la scrittura di dati normali.  \\ 
244     \macro{POLLWRBAND}& 0x200 & È possibile la scrittura di dati ad 
245                                 alta priorità. \\
246     \macro{POLLMSG}   & 0x400 & Estensione propria di Linux.\\
247     \hline    
248   \end{tabular}
249   \caption{Costanti per l'identificazione dei vari bit dei campi
250     \var{events} e \var{revents} di \type{pollfd}.}
251   \label{tab:file_pollfd_flags}
252 \end{table}
253
254 La funzione ritorna, restituendo il numero di file per i quali si è verificata
255 una delle condizioni di attesa richieste od un errore. Lo stato dei file
256 all'uscita della funzione viene restituito nel campo \var{revents} della
257 relativa struttura \type{pollfd}, che viene impostato alla maschera binaria
258 dei valori riportati in \tabref{tab:file_pollfd_flags}, ed oltre alle tre
259 condizioni specificate tramite \var{events} può riportare anche l'occorrere di
260 una condizione di errore.
261
262 Lo standard POSIX è rimasto a lungo senza primitive per l'\textit{I/O
263   multiplexing}, che è stata introdotto con le ultime revisioni dello standard
264 (POSIX 1003.1g-2000 e POSIX 1003.1-2001). Esso prevede che tutte le funzioni
265 ad esso relative vengano dichiarate nell'header \file{sys/select.h}, che
266 sostituisce i precedenti, ed aggiunge a \func{select} una nuova funzione
267 \func{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed
268   l'header \file{sys/select.h}, compaiono in Linux a partire dalle \acr{glibc}
269   2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header, le
270   \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal},
271   senza l'argomento \param{sigmask}, la definizione corretta è presente dalle
272   \acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle
273   \acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore
274   maggiore di 600.} il cui prototipo è:
275 \begin{prototype}{sys/select.h}
276   {int pselect(int n, fd\_set *readfds, fd\_set *writefds, fd\_set *exceptfds,
277     struct timespec *timeout, sigset\_t *sigmask)}
278   
279   Attende che uno dei file descriptor degli insiemi specificati diventi
280   attivo.
281   
282   \bodydesc{La funzione in caso di successo restituisce il numero di file
283     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
284     caso \var{errno} assumerà uno dei valori:
285   \begin{errlist}
286   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato in uno
287   degli insiemi.
288   \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
289   \item[\macro{EINVAL}] Si è specificato per \param{n} un valore negativo.
290   \end{errlist}
291   ed inoltre \macro{ENOMEM}.}
292 \end{prototype}
293
294 La funzione è sostanzialmente identica a \func{select}, solo che usa una
295 struttura \type{timespec} per indicare con maggiore precisione il timeout e
296 non ne aggiorna il valore in caso di interruzione, inoltre prende un argomento
297 aggiuntivo \param{sigmask} che è il puntatore ad una maschera di segnali (si
298 veda \secref{sec:sig_sigmask}). La maschera corrente viene sostituita da
299 questa immediatamente prima di eseguire l'attesa, e ripristinata al ritorno
300 della funzione.
301
302 L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili
303 race condition\footnote{in Linux però, non esistendo una system call apposita,
304   la funzione è implementata nelle \acr{glibc} usando \func{select}, e la
305   possibilità di una race condition resta.} quando si deve eseguire un test su
306 una variabile assegnata da un manipolatore sulla base dell'occorrenza di un
307 segnale per decidere se lanciare \func{select}. Fra il test e l'esecuzione è
308 presente una finestra in cui potrebbe arrivare il segnale che non sarebbe
309 rilevato; la race condition diventa superabile disabilitando il segnale prima
310 del test e riabilitandolo poi grazie all'uso di \param{sigmask}.
311
312
313
314 \subsection{L'I/O asincrono}
315 \label{sec:file_asyncronous_io}
316
317 Una modalità alternativa all'uso dell'\textit{I/O multiplexing} è quella di
318 fare ricorso al cosiddetto \textsl{I/O asincrono}. Il concetto base
319 dell'\textsl{I/O asincrono} è che le funzioni di I/O non attendono il
320 completamento delle operazioni prima di ritornare, così che il processo non
321 viene bloccato.  In questo modo diventa ad esempio possibile effettuare una
322 richiesta preventiva di dati, in modo da poter effettuare in contemporanea le
323 operazioni di calcolo e quelle di I/O.
324
325 Abbiamo accennato in \secref{sec:file_open} che è possibile, attraverso l'uso
326 del flag \macro{O\_ASYNC},\footnote{l'uso del flag di \macro{O\_ASYNC} e dei
327   comandi \macro{F\_SETOWN} e \macro{F\_GETOWN} per \func{fcntl} è specifico
328   di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile
329 attivare in un secondo tempo questa modalità impostando questo flag attraverso
330 l'uso di \func{fcntl} con il comando \macro{F\_SETFL} (vedi
331 \secref{sec:file_fcntl}).
332
333 In realtà in questo caso non si tratta di I/O asincrono vero e proprio, quanto
334 di un meccanismo asincrono di notifica delle variazione dello stato del file
335 descriptor; quello che succede è che il sistema genera un segnale (normalmente
336 \macro{SIGIO}, ma è possibile usarne altri) tutte le volte che diventa
337 possibile leggere o scrivere dal file descriptor che si è posto in questa
338 modalità. Si può inoltre selezionare, con il comando \macro{F\_SETOWN} di
339 \func{fcntl}, quale processo (o gruppo di processi) riceverà il segnale. 
340
341 In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select}
342 che, quando vengono usate con un numero molto grande di file descriptor, non
343 hanno buone prestazioni. In tal caso infatti la maggior parte del loro tempo
344 di esecuzione è impegnato ad eseguire una scansione su tutti i file descriptor
345 tenuti sotto controllo per determinare quali di essi (in genere una piccola
346 percentuale) sono diventati attivi.
347
348 Tuttavia con l'implementazione classica dei segnali questa modalità di I/O
349 presenta notevoli problemi, dato che non è possibile determinare, quando sono
350 più di uno, qual'è il file descriptor responsabile dell'emissione del segnale.
351 Linux però supporta le estensioni POSIX.1b dei segnali che permettono di
352 superare il problema facendo ricorso alle informazioni aggiuntive restituite
353 attraverso la struttura \type{siginfo\_t}, utilizzando la forma estesa
354 \var{sa\_sigaction} del manipolatore (si riveda quanto illustrato in
355 \secref{sec:sig_sigaction}).
356
357 Per far questo però occorre utilizzare le funzionalità dei segnali real-time
358 (vedi \secref{sec:sig_real_time}) impostando esplicitamente con il comando
359 \macro{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare in caso di
360 I/O asincrono (il segnale predefinito è \macro{SIGIO}). In questo caso il
361 manipolatore tutte le volte che riceverà \macro{SI\_SIGIO} come valore del
362 campo \var{si\_code}\footnote{il valore resta \macro{SI\_SIGIO} qualunque sia
363   il segnale che si è associato all'I/O asincrono, ed indica appunto che il
364   segnale è stato generato a causa di attività nell'I/O asincrono.} di
365 \type{siginfo\_t}, troverà nel campo \var{si\_fd} il valore del file
366 descriptor che ha generato il segnale.
367
368 Un secondo vantaggio dell'uso dei segnali real-time è che essendo dotati di
369 una coda di consegna ogni segnale sarà associato ad uno solo file descriptor;
370 inoltre sarà possibile stabilire delle priorità nella risposta a seconda del
371 segnale usato. In questo modo si può identificare immediatamente un file su
372 cui l'accesso è diventato possibile evitando completamente l'uso di funzioni
373 come \func{poll} e \func{select}, almeno fintanto che non si satura la coda;
374 si eccedono le dimensioni di quest'ultima; in tal caso infatti il kernel, non
375 potendo più assicurare il comportamento corretto per un segnale real-time,
376 invierà al suo posto un \var{SIGIO}, su cui si accumuleranno tutti i segnali
377 in eccesso, e si dovrà determinare al solito modo quali sono i file diventati
378 attivi.
379
380 Benché la modalità di apertura asincrona di un file possa risultare utile in
381 varie occasioni (in particolar modo con i socket e gli altri file per i quali
382 le funzioni di I/O sono system call lente), essa è comunque limitata alla
383 notifica della disponibilità del file descriptor per le operazioni di I/O, e
384 non ad uno svolgimento asincrono delle medesime.  Lo standard POSIX.1b
385 definisce anche una interfaccia apposita per l'I/O asincrono, che prevede un
386 insieme di funzioni dedicate, completamente separate rispetto a quelle usate
387 normalmente.
388
389 In generale questa interfaccia è completamente astratta e può essere
390 implementata sia direttamente nel kernel, che in user space attraverso l'uso
391 di thread. Al momento\footnote{fino ai kernel della serie 2.4.x, nella serie
392   2.5.x è però iniziato un lavoro completo di riscrittura di tutto il sistema
393   di I/O, che prevede anche l'introduzione di un nuovo layer per l'I/O
394   asincrono (effettuato a partire dal 2.5.32).} esiste una sola versione
395 stabile di questa interfaccia, quella delle \acr{glibc}, che è realizzata
396 completamente in user space.  Esistono comunque vari progetti sperimentali
397 (come il KAIO della SGI, o i patch di Benjamin La Haise) che prevedono un
398 supporto diretto da parte del kernel.
399
400 Lo standard prevede che tutte le operazioni di I/O asincrono siano controllate
401 attraverso l'uso di una apposita struttura \type{aiocb} (il cui nome sta per
402 \textit{asyncronous I/O control block}), che viene passata come argomento a
403 tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in
404 \file{aio.h}, è riportata in \figref{fig:file_aiocb}. Nello steso file è
405 definita la macro \macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la
406 disponibilità dell'interfaccia per l'I/O asincrono.
407
408 \begin{figure}[!htb]
409   \footnotesize \centering
410   \begin{minipage}[c]{15cm}
411     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
412 struct aiocb
413 {
414     int aio_fildes;               /* File descriptor.  */
415     off_t aio_offset;             /* File offset */
416     int aio_lio_opcode;           /* Operation to be performed.  */
417     int aio_reqprio;              /* Request priority offset.  */
418     volatile void *aio_buf;       /* Location of buffer.  */
419     size_t aio_nbytes;            /* Length of transfer.  */
420     struct sigevent aio_sigevent; /* Signal number and value.  */
421 };
422     \end{lstlisting}
423   \end{minipage} 
424   \normalsize 
425   \caption{La struttura \type{aiocb}, usata per il controllo dell'I/O
426     asincrono.}
427   \label{fig:file_aiocb}
428 \end{figure}
429
430 Le operazioni di I/O asincrono possono essere effettuate solo su un file già
431 aperto; il file deve inoltre supportare la funzione \func{lseek},
432 pertanto terminali e pipe sono esclusi. Non c'è limite al numero di operazioni
433 contemporanee effettuabili su un singolo file.
434
435 Ogni operazione deve inizializzare opportunamente un \textit{control block}.
436 Il file descriptor su cui operare deve essere specificato tramite il campo
437 \var{aio\_fildes}; dato che più operazioni possono essere eseguita in maniera
438 asincrona, il concetto di posizione corrente sul file viene a mancare;
439 pertanto si deve sempre specificare nel campo \var{aio\_offset} la posizione
440 sul file da cui i dati saranno letti o scritti.  Nel campo \var{aio\_buf} deve
441 essere specificato l'indirizzo del buffer usato per l'I/O, ed in
442 \var{aio\_nbytes} la lunghezza del blocco di dati da trasferire.
443
444 Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni
445 di I/O.\footnote{in generale perché ciò sia possibile occorre che la
446   piattaforma supporti questa caratteristica, questo viene indicato definendo
447   le macro \macro{\_POSIX\_PRIORITIZED\_IO}, e
448   \macro{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene impostata a
449 partire da quella del processo chiamante (vedi \secref{sec:proc_priority}),
450 cui viene sottratto il valore di questo campo.
451
452 Il campo \var{aio\_lio\_opcode} è usato soltanto dalla funzione
453 \func{lio\_listio}, che, come vedremo più avanti, permette di eseguire con una
454 sola chiamata una serie di operazioni, usando un vettore di \textit{control
455   block}. Tramite questo campo si specifica quale è la natura di ciascuna di
456 esse.
457
458 \begin{figure}[!htb]
459   \footnotesize \centering
460   \begin{minipage}[c]{15cm}
461     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
462 struct sigevent
463 {
464     sigval_t sigev_value;
465     int sigev_signo;
466     int sigev_notify;
467     sigev_notify_function;
468     sigev_notify_attributes;
469 };
470     \end{lstlisting}
471   \end{minipage} 
472   \normalsize 
473   \caption{La struttura \type{sigevent}, usata per specificare le modalità di
474     notifica degli eventi relativi alle operazioni di I/O asincrono.}
475   \label{fig:file_sigevent}
476 \end{figure}
477
478 Infine il campo \var{aio\_sigevent} è una struttura di tipo \type{sigevent}
479 che serve a specificare il modo in cui si vuole che venga effettuata la
480 notifica del completamento delle operazioni richieste. La struttura è
481 riportata in \secref{fig:file_sigevent}; il campo \var{sigev\_notify} è quello
482 che indica le modalità della notifica, esso può assumere i tre valori:
483 \begin{basedescript}{\desclabelwidth{3.0cm}}
484 \item[\macro{SIGEV\_NONE}]   Non viene inviata nessuna notifica.
485 \item[\macro{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
486   chiamante il segnale specificato nel campo \var{sigev\_signo}, se il
487   manipolatore è installato con \macro{SA\_SIGINFO}, il gli verrà restituito
488   il valore di \var{sigev\_value} in come valore del campo \var{si\_value} per
489   \type{siginfo\_t}.
490 \item[\macro{SIGEV\_THREAD}] La notifica viene effettuata creando un nuovo
491   thread che esegue la funzione specificata da \var{sigev\_notify\_function},
492   con gli attributi specificati da \var{sigev\_notify\_attribute}.
493 \end{basedescript}
494
495 Le due funzioni base dell'interfaccia per l'I/O asincrono sono
496 \func{aio\_read} ed \func{aio\_write}.  Esse permettono di richiedere una
497 lettura od una scrittura asincrona di dati, usando la struttura \type{aiocb}
498 appena descritta; i rispettivi prototipi sono:
499 \begin{functions}
500   \headdecl{aio.h}
501
502   \funcdecl{int aio\_read(struct aiocb *aiocbp)}
503   Richiede una lettura asincrona secondo quanto specificato con \param{aiocbp}.
504
505   \funcdecl{int aio\_write(struct aiocb *aiocbp)}
506   Richiede una scrittura asincrona secondo quanto specificato con
507   \param{aiocbp}.
508   
509   \bodydesc{Le funzioni restituiscono 0 in caso di successo, e -1 in caso di
510     errore, nel qual caso \var{errno} assumerà uno dei valori:
511   \begin{errlist}
512   \item[\macro{EBADF}] Si è specificato un file descriptor sbagliato.
513   \item[\macro{ENOSYS}] La funzione non è implementata.
514   \item[\macro{EINVAL}] Si è specificato un valore non valido per i campi
515     \var{aio\_offset} o \var{aio\_reqprio} di \param{aiocbp}.
516   \item[\macro{EAGAIN}] La coda delle richieste è momentaneamente piena.
517   \end{errlist}
518 }
519 \end{functions}
520
521 Entrambe le funzioni ritornano immediatamente dopo aver messo in coda la
522 richiesta, o in caso di errore. Non è detto che gli errori \macro{EBADF} ed
523 \macro{EINVAL} siano rilevati immediatamente al momento della chiamata,
524 potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e
525 scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che
526 il file non sia stato aperto in \textit{append mode} (vedi
527 \secref{sec:file_open}), nel qual caso le scritture vengono effettuate
528 comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}.
529
530 Si tenga inoltre presente che deallocare la memoria indirizzata da
531 \param{aiocbp} o modificarne i valori prima della conclusione di una
532 operazione può dar luogo a risultati impredicibili, perché l'accesso ai vari
533 campi per eseguire l'operazione può avvenire in un momento qualsiasi dopo la
534 richiesta.  Questo comporta che occorre evitare di usare per \param{aiocbp}
535 variabili automatiche e che non si deve riutilizzare la stessa struttura per
536 un ulteriore operazione fintanto che la precedente non sia stata ultimata. In
537 generale per ogni operazione di I/O asincrono si deve utilizzare una diversa
538 struttura \type{aiocb}.
539
540 Dato che si opera in modalità asincrona, il successo di \func{aio\_read} o
541 \func{aio\_write} non implica che le operazioni siano state effettivamente
542 eseguite in maniera corretta; per verificarne l'esito l'interfaccia prevede
543 altre due funzioni, che permettono di controllare lo stato di esecuzione. La
544 prima è \func{aio\_error}, che serve a determinare un eventuale stato di
545 errore; il suo prototipo è:
546 \begin{prototype}{aio.h}
547   {int aio\_error(const struct aiocb *aiocbp)}  
548
549   Determina lo stato di errore delle operazioni di I/O associate a
550   \param{aiocbp}.
551   
552   \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con
553     successo, altrimenti restituisce il codice di errore relativo al loro
554     fallimento.}
555 \end{prototype}
556
557 Se l'operazione non si è ancora completata viene restituito l'errore di
558 \macro{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è
559 conclusa con successo, altrimenti restituisce il codice dell'errore
560 verificatosi, ed esegue la corrispondente impostazione di \var{errno}. Il
561 codice può essere sia \macro{EINVAL} ed \macro{EBADF}, dovuti ad un valore
562 errato per \param{aiocbp}, che uno degli errori possibili durante l'esecuzione
563 dell'operazione di I/O richiesta, nel qual caso saranno restituiti, a seconda
564 del caso, i codici di errore delle system call \func{read}, \func{write} e
565 \func{fsync}.
566
567 Una volta che si sia certi che le operazioni siano state concluse (cioè dopo
568 che una chiamata ad \func{aio\_error} non ha restituito \macro{EINPROGRESS},
569 si potrà usare la seconda funzione dell'interfaccia, \func{aio\_return}, che
570 permette di verificare il completamento delle operazioni di I/O asincrono; il
571 suo prototipo è:
572 \begin{prototype}{aio.h}
573 {ssize\_t aio\_return(const struct aiocb *aiocbp)} 
574
575 Recupera il valore dello stato di ritorno delle operazioni di I/O associate a
576 \param{aiocbp}.
577   
578 \bodydesc{La funzione restituisce lo stato di uscita dell'operazione
579   eseguita.}
580 \end{prototype}
581
582 La funzione deve essere chiamata una sola volte per ciascuna operazione
583 asincrona, essa infatti fa sì che il sistema rilasci le risorse ad essa
584 associate. É per questo motivo che occorre chiamare la funzione solo dopo che
585 l'operazione cui \param{aiocbp} fa riferimento si è completata. Una chiamata
586 precedente il completamento delle operazioni darebbe risultati indeterminati.
587
588 La funzione restituisce il valore di ritorno relativo all'operazione eseguita,
589 così come ricavato dalla sottostante system call (il numero di byte letti,
590 scritti o il valore di ritorno di \func{fsync}).  É importante chiamare sempre
591 questa funzione, altrimenti le risorse disponibili per le operazioni di I/O
592 asincrono non verrebbero liberate, rischiando di arrivare ad un loro
593 esaurimento.
594
595 Oltre alle operazioni di lettura e scrittura l'interfaccia POSIX.1b mette a
596 disposizione un'altra operazione, quella di sincronizzazione dell'I/O, essa è
597 compiuta dalla funzione \func{aio\_fsync}, che ha lo stesso effetto della
598 analoga \func{fsync}, ma viene eseguita in maniera asincrona; il suo prototipo
599 è:
600 \begin{prototype}{aio.h}
601 {ssize\_t aio\_return(int op, struct aiocb *aiocbp)} 
602
603 Richiede la sincronizzazione dei dati per il file indicato da \param{aiocbp}.
604   
605 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
606   errore, che può essere, con le stesse modalità di \func{aio\_read},
607   \macro{EAGAIN}, \macro{EBADF} o \macro{EINVAL}.}
608 \end{prototype}
609
610 La funzione richiede la sincronizzazione delle operazioni di I/O, ritornando
611 immediatamente. L'esecuzione effettiva della sincronizzazione dovrà essere
612 verificata con \func{aio\_error} e \func{aio\_return} come per le operazioni
613 di lettura e scrittura. L'argomento \param{op} permette di indicare la
614 modalità di esecuzione, se si specifica il valore \macro{O\_DSYNC} le
615 operazioni saranno completate con una chiamata a \func{fdatasync}, se si
616 specifica \macro{O\_SYNC} con una chiamata a \func{fsync} (per i dettagli vedi
617 \secref{sec:file_sync}).
618
619 Il successo della chiamata assicura la sincronizzazione delle operazioni fino
620 allora richieste, niente è garantito riguardo la sincronizzazione dei dati
621 relativi ad eventuali operazioni richieste successivamente. Se si è
622 specificato un meccanismo di notifica questo sarà innescato una volta che le
623 operazioni di sincronizzazione dei dati saranno completate.
624
625 In alcuni casi può essere necessario interrompere le operazioni (in genere
626 quando viene richiesta un'uscita immediata dal programma), per questo lo
627 standard POSIX.1b prevede una funzioni apposita, \func{aio\_cancel}, che
628 permette di cancellare una operazione richiesta in precedenza; il suo
629 prototipo è:
630 \begin{prototype}{aio.h}
631 {int aio\_cancel(int fildes, struct aiocb *aiocbp)} 
632
633 Richiede la cancellazione delle operazioni sul file \param{fildes} specificate
634 da \param{aiocbp}.
635   
636 \bodydesc{La funzione restituisce il risultato dell'operazione con un codice
637   di positivo, e -1 in caso di errore, che avviene qualora si sia specificato
638   un valore non valido di \param{fildes}, imposta \var{errno} al valore
639   \macro{EBADF}.}
640 \end{prototype}
641
642 La funzione permette di cancellare una operazione specifica sul file
643 \param{fildes}, o tutte le operazioni pendenti, specificando \macro{NULL} come
644 valore di \param{aiocbp}.  Quando una operazione viene cancellata una
645 successiva chiamata ad \func{aio\_error} riporterà \macro{ECANCELED} come
646 codice di errore, ed il suo codice di ritorno sarà -1, inoltre il meccanismo
647 di notifica non verrà invocato. Se si specifica una operazione relativa ad un
648 altro file descriptor il risultato è indeterminato.
649
650 In caso di successo, i possibili valori di ritorno per \func{aio\_cancel} sono
651 tre (anch'essi definiti in \file{aio.h}):
652 \begin{basedescript}{\desclabelwidth{3.0cm}}
653 \item[\macro{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la
654   cancellazione sono state già completate,
655   
656 \item[\macro{AIO\_CANCELED}] indica che tutte le operazioni richieste sono
657   state cancellate,  
658   
659 \item[\macro{AIO\_NOTCANCELED}] indica che alcune delle operazioni erano in
660   corso e non sono state cancellate.
661 \end{basedescript}
662
663 Nel caso si abbia \macro{AIO\_NOTCANCELED} occorrerà chiamare
664 \func{aio\_error} per determinare quali sono le operazioni effettivamente
665 cancellate. Le operazioni che non sono state cancellate proseguiranno il loro
666 corso normale, compreso quanto richiesto riguardo al meccanismo di notifica
667 del loro avvenuto completamento.
668
669 Benché l'I/O asincrono preveda un meccanismo di notifica, l'interfaccia
670 fornisce anche una apposita funzione, \func{aio\_suspend}, che permette di
671 sospendere l'esecuzione del processo chiamante fino al completamento di una
672 specifica operazione; il suo prototipo è:
673 \begin{prototype}{aio.h}
674 {int aio\_suspend(const struct aiocb * const list[], int nent, const struct
675     timespec *timeout)}
676   
677   Attende, per un massimo di \param{timeout}, il completamento di una delle
678   operazioni specificate da \param{list}.
679   
680   \bodydesc{La funzione restituisce 0 se una (o più) operazioni sono state
681     completate, e -1 in caso di errore nel qual caso \var{errno} assumerà uno
682     dei valori:
683     \begin{errlist}
684     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
685       \param{timeout}.
686     \item[\macro{ENOSYS}] La funzione non è implementata.
687     \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
688     \end{errlist}
689   }
690 \end{prototype}
691
692 La funzione permette di bloccare il processo fintanto che almeno una delle
693 \param{nent} operazioni specificate nella lista \param{list} è completata, per
694 un tempo massimo specificato da \param{timout}, o fintanto che non arrivi un
695 segnale.\footnote{si tenga conto che questo segnale può anche essere quello
696   utilizzato come meccanismo di notifica.} La lista deve essere inizializzata
697 con delle strutture \var{aiocb} relative ad operazioni effettivamente
698 richieste, ma può contenere puntatori nulli, che saranno ignorati. In caso si
699 siano specificati valori non validi l'effetto è indefinito.  Un valore
700 \macro{NULL} per \param{timout} comporta l'assenza di timeout.
701
702 Lo standard POSIX.1b infine ha previsto pure una funzione, \func{lio\_listio},
703 che permette di effettuare la richiesta di una intera lista di operazioni di
704 lettura o scrittura; il suo prototipo è:
705 \begin{prototype}{aio.h}
706   {int lio\_listio(int mode, struct aiocb * const list[], int nent, struct
707     sigevent *sig)}
708   
709   Richiede l'esecuzione delle operazioni di I/O elencata da \param{list},
710   secondo la modalità \param{mode}.
711   
712   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
713     errore, nel qual caso \var{errno} assumerà uno dei valori:
714     \begin{errlist}
715     \item[\macro{EAGAIN}] Nessuna operazione è stata completata entro
716       \param{timeout}.
717     \item[\macro{ENOSYS}] La funzione non è implementata.
718     \item[\macro{EINTR}] La funzione è stata interrotta da un segnale.
719     \end{errlist}
720   }
721 \end{prototype}
722
723 La funzione esegue la richiesta delle \param{nent} operazioni indicate dalla
724 lista \param{list}; questa deve contenere gli indirizzi di altrettanti
725 \textit{control block}, opportunamente inizializzati; in particolare nel caso
726 dovrà essere specificato il tipo di operazione tramite il campo
727 \var{aio\_lio\_opcode}, che può prendere i tre valori:
728 \begin{basedescript}{\desclabelwidth{2.0cm}}
729 \item[\macro{LIO\_READ}]  si richiede una operazione di lettura.
730 \item[\macro{LIO\_WRITE}] si richiede una operazione di scrittura.
731 \item[\macro{LIO\_NOP}] non si effettua nessuna operazione.
732 \end{basedescript}
733 l'ultimo valore viene usato quando si ha a che fare con un vettore di
734 dimensione fissa, per poter specificare solo alcune operazioni, o quando si è
735 dovuto cancellare delle operazioni e si deve ripetere la richiesta per quelle
736 non completate.
737
738 L'argomento \param{mode} permette di stabilire il comportamento della
739 funzione, se viene specificato il valore \macro{LIO\_WAIT} la funzione si
740 blocca fino al completamento di tutte le operazioni richieste; se invece si
741 specifica \macro{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver
742 messo in coda tutte le richieste. In questo caso il chiamante può richiedere
743 la notifica del completamento di tutte le richieste, impostando l'argomento
744 \param{sig} in maniera analoga a come si fa per il campo \var{aio\_sigevent}
745 di \type{aiocb}.
746
747
748
749 \subsection{I/O vettorizzato}
750 \label{sec:file_multiple_io}
751
752 Un caso abbastanza comune è quello in cui ci si trova a dover eseguire una
753 serie multipla di operazioni di I/O, come una serie di letture o scritture di
754 vari buffer. Un esempio tipico è quando i dati sono strutturati nei campi di
755 una struttura ed essi devono essere caricati o salvati su un file.  Benché
756 l'operazione sia facilmente eseguibile attraverso una serie multipla di
757 chiamate, ci sono casi in cui si vuole poter contare sulla atomicità delle
758 operazioni.
759
760 Per questo motivo BSD 4.2\footnote{Le due funzioni sono riprese da BSD4.4 ed
761   integrate anche dallo standard Unix 98; fino alle libc5 Linux usava
762   \type{size\_t} come tipo dell'argomento \param{count}, una scelta logica,
763   che però è stata dismessa per restare aderenti allo standard.} ha introdotto
764 due nuove system call, \func{readv} e \func{writev}, che permettono di
765 effettuare con una sola chiamata una lettura o una scrittura su una serie di
766 buffer (quello che viene chiamato \textsl{I/O vettorizzato}. I relativi
767 prototipi sono:
768 \begin{functions}
769   \headdecl{sys/uio.h}
770   
771   \funcdecl{int readv(int fd, const struct iovec *vector, int count)} Esegue
772   una lettura vettorizzata da \param{fd} nei \param{count} buffer specificati
773   da \param{vector}.
774   
775   \funcdecl{int writev(int fd, const struct iovec *vector, int count)} Esegue
776   una scrittura vettorizzata da \param{fd} nei \param{count} buffer
777   specificati da \param{vector}.
778   
779   \bodydesc{Le funzioni restituiscono il numero di byte letti o scritti in
780     caso di successo, e -1 in caso di errore, nel qual caso \var{errno}
781     assumerà uno dei valori:
782   \begin{errlist}
783   \item[\macro{EBADF}] si è specificato un file descriptor sbagliato.
784   \item[\macro{EINVAL}] si è specificato un valore non valido per uno degli
785     argomenti (ad esempio \param{count} è maggiore di \macro{MAX\_IOVEC}).
786   \item[\macro{EINTR}] la funzione è stata interrotta da un segnale prima di
787     di avere eseguito una qualunque lettura o scrittura.
788   \item[\macro{EAGAIN}] \param{fd} è stato aperto in modalità non bloccante e
789   non ci sono dati in lettura.
790   \item[\macro{EOPNOTSUPP}] La coda delle richieste è momentaneamente piena.
791   \end{errlist}
792   ed inoltre \macro{EISDIR}, \macro{ENOMEM}, \macro{EFAULT} (se non sono stato
793   allocati correttamente i buffer specificati nei campi \func{iov\_base}), più
794   tutti gli ulteriori errori che potrebbero avere le usuali funzioni di
795   lettura e scrittura eseguite su \param{fd}.}
796 \end{functions}
797
798 Entrambe le funzioni usano una struttura \type{iovec}, definita in
799 \figref{fig:file_iovec}, che definisce dove i dati devono essere letti o
800 scritti. Il primo campo, \var{iov\_base}, contiene l'indirizzo del buffer ed
801 il secondo, \var{iov\_len}, la dimensione dello stesso. 
802
803 \begin{figure}[!htb]
804   \footnotesize \centering
805   \begin{minipage}[c]{15cm}
806     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
807 struct iovec {
808     __ptr_t iov_base;    /* Starting address */
809     size_t iov_len;      /* Length in bytes  */
810 };
811     \end{lstlisting}
812   \end{minipage} 
813   \normalsize 
814   \caption{La struttura \type{iovec}, usata dalle operazioni di I/O
815     vettorizzato.} 
816   \label{fig:file_iovec}
817 \end{figure}
818
819 I buffer da utilizzare sono indicati attraverso l'argomento \param{vector} che
820 è un vettore di strutture \var{iovec}, la cui lunghezza è specificata da
821 \param{count}.  Ciascuna struttura dovrà essere inizializzata per
822 opportunamente per indicare i vari buffer da/verso i quali verrà eseguito il
823 trasferimento dei dati. Essi verranno letti (o scritti) nell'ordine in cui li
824 si sono specificati nel vettore \var{vector}.
825
826
827 \subsection{File mappati in memoria}
828 \label{sec:file_memory_map}
829
830 Una modalità alternativa di I/O, che usa una interfaccia completamente diversa
831 rispetto a quella classica vista in \capref{cha:file_unix_interface}, è il
832 cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della
833 \textsl{paginazione}\index{paginazione} usato dalla memoria virtuale (vedi
834 \secref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un
835 file in una sezione dello spazio di indirizzi del processo. Il meccanismo è
836 illustrato in \figref{fig:file_mmap_layout}, una sezione del file viene
837 riportata direttamente nello spazio degli indirizzi del programma. Tutte le
838 operazioni su questa zona verranno riportate indietro sul file dal meccanismo
839 della memoria virtuale che trasferirà il contenuto di quel segmento sul file
840 invece che nella swap, per cui si può parlare tanto di file mappato in
841 memoria, quanto di memoria mappata su file.
842
843 \begin{figure}[htb]
844   \centering
845   \includegraphics[width=9.5cm]{img/mmap_layout}
846   \caption{Disposizione della memoria di un processo quando si esegue la
847   mappatura in memoria di un file.}
848   \label{fig:file_mmap_layout}
849 \end{figure}
850
851 Tutto questo comporta una notevole semplificazione delle operazioni di I/O, in
852 quanto non sarà più necessario utilizzare dei buffer intermedi su cui
853 appoggiare i dati da traferire, ma questi potranno essere acceduti
854 direttamente nella sezione di memoria mappata; inoltre questa interfaccia è
855 più efficiente delle usuali funzioni di I/O, in quanto permette di caricare in
856 memoria solo le parti del file che sono effettivamente usate ad un dato
857 istante.
858
859 Infatti, dato che l'accesso è fatto direttamente attraverso la memoria
860 virtuale, la sezione di memoria mappata su cui si opera sarà a sua volta letta
861 o scritta sul file una pagina alla volta e solo per le parti effettivamente
862 usate, il tutto in maniera completamente trasparente al processo; l'accesso
863 alle pagine non ancora caricate avverrà allo stesso modo con cui vengono
864 caricate in memoria le pagine che sono state salvate sullo swap.
865
866 Infine in situazioni in cui la memoria è scarsa, le pagine che mappano un
867 file vengono salvate automaticamente, così come le pagine dei programmi
868 vengono scritte sulla swap; questo consente di accedere ai file su dimensioni
869 il cui solo limite è quello dello spazio di indirizzi disponibile, e non della
870 memoria su cui possono esserne lette delle porzioni.
871
872 L'interfaccia prevede varie funzioni per la gestione del \textit{memory mapped
873   I/O}, la prima di queste è \func{mmap}, che serve ad eseguire la mappatura
874 in memoria di un file; il suo prototipo è:
875 \begin{functions}
876   
877   \headdecl{unistd.h}
878   \headdecl{sys/mman.h} 
879
880   \funcdecl{void * mmap(void * start, size\_t length, int prot, int flags, int
881     fd, off\_t offset)}
882   
883   Esegue la mappatura in memoria del file \param{fd}.
884   
885   \bodydesc{La funzione restituisce il puntatore alla zona di memoria mappata
886     in caso di successo, e \macro{MAP\_FAILED} (-1) in caso di errore, nel
887     qual caso \var{errno} assumerà uno dei valori:
888     \begin{errlist}
889     \item[\macro{EBADF}] Il file descriptor non è valido, e non si è usato
890       \macro{MAP\_ANONYMOUS}.
891     \item[\macro{EACCES}] Il file descriptor non si riferisce ad un file
892       regolare, o si è richiesto \macro{MAP\_PRIVATE} ma \param{fd} non è
893       aperto in lettura, o si è richiesto \macro{MAP\_SHARED} e impostato
894       \macro{PROT\_WRITE} ed \param{fd} non è aperto in lettura/scrittura, o
895       si è impostato \macro{PROT\_WRITE} ed \param{fd} è in
896       \textit{append-only}.
897     \item[\macro{EINVAL}] I valori di \param{start}, \param{length} o
898       \param{offset} non sono validi (o troppo grandi o non allineati sulla
899       dimensione delle pagine).
900     \item[\macro{ETXTBSY}] Si è impostato \macro{MAP\_DENYWRITE} ma \param{fd}
901       è aperto in scrittura.
902     \item[\macro{EAGAIN}] Il file è bloccato, o si è bloccata troppa memoria.
903     \item[\macro{ENOMEM}] Non c'è memoria o si è superato il limite sul numero
904       di mappature possibili.
905     \item[\macro{ENODEV}] Il filesystem di \param{fd} non supporta il memory
906       mapping.
907     \end{errlist}
908   }
909 \end{functions}
910
911 La funzione richiede di mappare in memoria la sezione del file \param{fd} a
912 partire da \param{offset} per \param{lenght} byte, preferibilmente
913 all'indirizzo \param{start}. Il valore di \param{offset} deve essere un
914 multiplo della dimensione di una pagina di memoria. 
915
916
917 \begin{table}[htb]
918   \centering
919   \footnotesize
920   \begin{tabular}[c]{|l|l|}
921     \hline
922     \textbf{Valore} & \textbf{Significato} \\
923     \hline
924     \hline
925     \macro{PROT\_EXEC}  & Le pagine possono essere eseguite.\\
926     \macro{PROT\_READ}  & Le pagine possono essere lette.\\
927     \macro{PROT\_WRITE} & Le pagine possono essere scritte.\\
928     \macro{PROT\_NONE}  & L'accesso alle pagine è vietato.\\
929     \hline    
930   \end{tabular}
931   \caption{Valori dell'argomento \param{prot} di \func{mmap}, relativi alla
932     protezione applicate alle pagine del file mappate in memoria.}
933   \label{tab:file_mmap_prot}
934 \end{table}
935
936
937 Il valore dell'argomento \param{prot} indica la protezione\footnote{in Linux
938   la memoria reale è divisa in pagine: ogni processo vede la sua memoria
939   attraverso uno o più segmenti lineari di memoria virtuale.  Per ciascuno di
940   questi segmenti il kernel mantiene nella \textit{page table} la mappatura
941   sulle pagine di memoria reale, ed le modalità di accesso (lettura,
942   esecuzione, scrittura); una loro violazione causa quella che si chiama una
943   \textit{segment violation}, e la relativa emissione del segnale
944   \macro{SIGSEGV}.} da applicare al segmento di memoria e deve essere
945 specificato come maschera binaria ottenuta dall'OR di uno o più dei valori
946 riportati in \tabref{tab:file_mmap_flag}; il valore specificato deve essere
947 compatibile con la modalità di accesso con cui si è aperto il file.
948
949 L'argomento \param{flags} specifica infine qual'è il tipo di oggetto mappato,
950 le opzioni relative alle modalità con cui è effettuata la mappatura e alle
951 modalità con cui le modifiche alla memoria mappata vengono condivise o
952 mantenute private al processo che le ha effettuate. Deve essere specificato
953 come maschera binaria ottenuta dall'OR di uno o più dei valori riportati in
954 \tabref{tab:file_mmap_flag}.
955
956 \begin{table}[htb]
957   \centering
958   \footnotesize
959   \begin{tabular}[c]{|l|p{10cm}|}
960     \hline
961     \textbf{Valore} & \textbf{Significato} \\
962     \hline
963     \hline
964     \macro{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
965                              da \param{start}, se questo non può essere usato
966                              \func{mmap} fallisce. Se si imposta questo flag il
967                              valore di \param{start} deve essere allineato
968                              alle dimensioni di una pagina. \\
969     \macro{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
970                              riportati sul file e saranno immediatamente
971                              visibili agli altri processi che mappano lo stesso
972                              file.\footnotemark Il file su disco però non sarà
973                              aggiornato fino alla chiamata di \func{msync} o
974                              \func{unmap}), e solo allora le modifiche saranno
975                              visibili per l'I/O convenzionale. Incompatibile
976                              con \macro{MAP\_PRIVATE}. \\ 
977     \macro{MAP\_PRIVATE}   & I cambiamenti sulla memoria mappata non vengono
978                              riportati sul file. Ne viene fatta una copia
979                              privata cui solo il processo chiamante ha
980                              accesso.  Le modifiche sono mantenute attraverso
981                              il meccanismo del 
982                              \textit{copy on write}\index{copy on write} e
983                              salvate su swap in caso di necessità. Non è
984                              specificato se i cambiamenti sul file originale
985                              vengano riportati sulla regione
986                              mappata. Incompatibile con \macro{MAP\_SHARED}. \\
987     \macro{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
988                              \textit{DoS}\index{DoS} (veniva usato per
989                              segnalare che tentativi di scrittura sul file
990                              dovevano fallire con \macro{ETXTBUSY}).\\
991     \macro{MAP\_EXECUTABLE}& Ignorato. \\
992     \macro{MAP\_NORESERVE} & Si usa con \macro{MAP\_PRIVATE}. Non riserva
993                              delle pagine di swap ad uso del meccanismo di
994                              \textit{copy on write}\index{copy on write}
995                              per mantenere le
996                              modifiche fatte alla regione mappata, in
997                              questo caso dopo una scrittura, se non c'è più
998                              memoria disponibile, si ha l'emissione di
999                              un \macro{SIGSEGV}. \\
1000     \macro{MAP\_LOCKED}    & Se impostato impedisce lo swapping delle pagine
1001                              mappate. \\
1002     \macro{MAP\_GROWSDOWN} & Usato per gli stack. Indica 
1003                              che la mappatura deve essere effettuata con gli
1004                              indirizzi crescenti verso il basso.\\
1005     \macro{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
1006                              argomenti \param{fd} e \param{offset} sono
1007                              ignorati.\footnotemark\\
1008     \macro{MAP\_ANON}      & Sinonimo di \macro{MAP\_ANONYMOUS}, deprecato.\\
1009     \macro{MAP\_FILE}      & Valore di compatibilità, deprecato.\\
1010     \hline
1011   \end{tabular}
1012   \caption{Valori possibili dell'argomento \param{flag} di \func{mmap}.}
1013   \label{tab:file_mmap_flag}
1014 \end{table}
1015
1016 \footnotetext{Dato che tutti faranno riferimento alle stesse pagine di
1017   memoria.}  
1018 \footnotetext{L'uso di questo flag con \macro{MAP\_SHARED} è
1019   stato implementato in Linux a partire dai kernel della serie 2.4.x.}
1020
1021 Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere
1022 piuttosto complessi, essi si possono comprendere solo tenendo presente che
1023 tutto quanto è comunque basato sul basato sul meccanismo della memoria
1024 virtuale. Questo comporta allora una serie di conseguenze. La più ovvia è che
1025 se si cerca di scrivere su una zona mappata in sola lettura si avrà
1026 l'emissione di un segnale di violazione di accesso (\macro{SIGSEGV}), dato che
1027 i permessi sul segmento di memoria relativo non consentono questo tipo di
1028 accesso.
1029
1030 È invece assai diversa la questione relativa agli accessi al di fuori della
1031 regione di cui si è richiesta la mappatura. A prima vista infatti si potrebbe
1032 ritenere che anch'essi debbano generare un segnale di violazione di accesso;
1033 questo però non tiene conto del fatto che, essendo basata sul meccanismo della
1034 paginazione, la mappatura in memoria non può che essere eseguita su un
1035 segmento di dimensioni rigorosamente multiple di quelle di una pagina, ed in
1036 generale queste potranno non corrispondere alle dimensioni effettive del file
1037 o della sezione che si vuole mappare. Il caso più comune è quello illustrato
1038 in \figref{fig:file_mmap_boundary}, in cui la sezione di file non rientra nei
1039 confini di una pagina: in tal caso verrà il file sarà mappato su un segmento
1040 di memoria che si estende fino al bordo della pagina successiva.
1041
1042 \begin{figure}[htb]
1043   \centering
1044   \includegraphics[width=10cm]{img/mmap_boundary}
1045   \caption{Schema della mappatura in memoria di una sezione di file di
1046     dimensioni non corrispondenti al bordo di una pagina.}
1047   \label{fig:file_mmap_boundary}
1048 \end{figure}
1049
1050
1051 In questo caso è possibile accedere a quella zona di memoria che eccede le
1052 dimensioni specificate da \param{lenght}, senza ottenere un \macro{SIGSEGV}
1053 poiché essa è presente nello spazio di indirizzi del processo, anche se non è
1054 mappata sul file. Il comportamento del sistema è quello di restituire un
1055 valore nullo per quanto viene letto, e di non riportare su file quanto viene
1056 scritto.
1057
1058 Un caso più complesso è quello che si viene a creare quando le dimensioni del
1059 file mappato sono più corte delle dimensioni della mappatura, oppure quando il
1060 file è stato troncato, dopo che è stato mappato, ad una dimensione inferiore a
1061 quella della mappatura in memoria.
1062
1063 \begin{figure}[htb]
1064   \centering
1065   \includegraphics[width=13cm]{img/mmap_exceed}
1066   \caption{Schema della mappatura in memoria di file di dimensioni inferiori
1067     alla lunghezza richiesta.}
1068   \label{fig:file_mmap_exceed}
1069 \end{figure}
1070
1071 In questa situazione, per la sezione di pagina parzialmente coperta dal
1072 contenuto del file, vale esattamente quanto visto in precedenza; invece per la
1073 parte che eccede, fino alle dimensioni date da \param{length}, l'accesso non
1074 sarà più possibile, ma il segnale emesso non sarà \macro{SIGSEGV}, ma
1075 \macro{SIGBUS}, come illustrato in \figref{fig:file_mmap_exceed}.
1076
1077 Non tutti i file possono venire mappati in memoria, dato che, come illustrato
1078 in \figref{fig:file_mmap_layout}, la mappatura introduce una corrispondenza
1079 biunivoca fra una sezione di un file ed una sezione di memoria. Questo
1080 comporta che ad esempio non è possibile mappare in memoria file descriptor
1081 relativi a pipe, socket e fifo, per i quali non ha senso parlare di
1082 \textsl{sezione}. Lo stesso vale anche per alcuni file di dispositivo, che non
1083 dispongono della relativa operazione \var{mmap} (si ricordi quanto esposto in
1084 \secref{sec:file_vfs_work}). Si tenga presente però che esistono anche casi di
1085 dispositivi (un esempio è l'interfaccia al ponte PCI-VME del chip Universe)
1086 che sono utilizzabili solo con questa interfaccia.
1087
1088 Dato che passando attraverso una \func{fork} lo spazio di indirizzi viene
1089 copiato integralmente, i file mappati in memoria verranno ereditati in maniera
1090 trasparente dal processo figlio, mantenendo gli stessi attributi avuti nel
1091 padre; così se si è usato \macro{MAP\_SHARED} padre e figlio accederanno allo
1092 stesso file in maniera condivisa, mentre se si è usato \macro{MAP\_PRIVATE}
1093 ciascuno di essi manterrà una sua versione privata indipendente. Non c'è
1094 invece nessun passaggio attraverso una \func{exec}, dato che quest'ultima
1095 sostituisce tutto lo spazio degli indirizzi di un processo con quello di un
1096 nuovo programma.
1097
1098 Quando si effettua la mappatura di un file vengono pure modificati i tempi ad
1099 esso associati (di cui si è trattato in \secref{sec:file_file_times}). Il
1100 valore di \var{st\_atime} può venir cambiato in qualunque istante a partire
1101 dal momento in cui la mappatura è stata effettuata: il primo riferimento ad
1102 una pagina mappata su un file aggiorna questo tempo.  I valori di
1103 \var{st\_ctime} e \var{st\_mtime} possono venir cambiati solo quando si è
1104 consentita la scrittura sul file (cioè per un file mappato con
1105 \macro{PROT\_WRITE} e \macro{MAP\_SHARED}) e sono aggiornati dopo la scrittura
1106 o in corrispondenza di una eventuale \func{msync}.
1107
1108 Dato per i file mappati in memoria le operazioni di I/O sono gestite
1109 direttamente dalla memoria virtuale, occorre essere consapevoli delle
1110 interazioni che possono esserci con operazioni effettuate con l'interfaccia
1111 standard dei file di \capref{cha:file_unix_interface}. Il problema è che una
1112 volta che si è mappato un file, le operazioni di lettura e scrittura saranno
1113 eseguite sulla memoria, e riportate su disco in maniera autonoma dal sistema
1114 della memoria virtuale.
1115
1116 Pertanto se si modifica un file con l'interfaccia standard queste modifiche
1117 potranno essere visibili o meno a seconda del momento in cui la memoria
1118 virtuale trasporterà dal disco in memoria quella sezione del file, perciò è
1119 del tutto imprevedibile il risultato della modifica di un file nei confronti
1120 del contenuto della memoria mappata su cui è mappato.
1121
1122 Per quanto appena visto, è sempre sconsigliabile eseguire scritture su file
1123 attraverso l'interfaccia standard, quando lo si è mappato in memoria, è invece
1124 possibile usare l'interfaccia standard per leggere un file mappato in memoria,
1125 purché si abbia una certa cura; infatti l'interfaccia dell'I/O mappato in
1126 memoria mette a disposizione la funzione \func{msync} per sincronizzare il
1127 contenuto della memoria mappata con il file su disco; il suo prototipo è:
1128 \begin{functions}  
1129   \headdecl{unistd.h}
1130   \headdecl{sys/mman.h} 
1131
1132   \funcdecl{int msync(const void *start, size\_t length, int flags)}
1133   
1134   Sincronizza i contenuti di una sezione di un file mappato in memoria.
1135   
1136   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1137     errore nel qual caso \var{errno} assumerà uno dei valori:
1138     \begin{errlist}
1139     \item[\macro{EINVAL}] O \param{start} non è multiplo di \macro{PAGESIZE},
1140     o si è specificato un valore non valido per \param{flags}.
1141     \item[\macro{EFAULT}] L'intervallo specificato non ricade in una zona
1142       precedentemente mappata.
1143     \end{errlist}
1144   }
1145 \end{functions}
1146
1147 La funzione esegue la sincronizzazione di quanto scritto nella sezione di
1148 memoria indicata da \param{start} e \param{offset}, scrivendo le modifiche sul
1149 file (qualora questo non sia già stato fatto).  Provvede anche ad aggiornare i
1150 relativi tempi di modifica. In questo modo si è sicuri che dopo l'esecuzione
1151 di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto
1152 del file aggiornato.
1153
1154 \begin{table}[htb]
1155   \centering
1156   \footnotesize
1157   \begin{tabular}[c]{|l|l|}
1158     \hline
1159     \textbf{Valore} & \textbf{Significato} \\
1160     \hline
1161     \hline
1162     \macro{MS\_ASYNC}     & Richiede la sincronizzazione.\\
1163     \macro{MS\_SYNC}      & Attende che la sincronizzazione si eseguita.\\
1164     \macro{MS\_INVALIDATE}& Richiede che le altre mappature dello stesso file
1165                             siano invalidate.\\
1166     \hline    
1167   \end{tabular}
1168   \caption{Valori dell'argomento \param{flag} di \func{msync}.}
1169   \label{tab:file_mmap_rsync}
1170 \end{table}
1171
1172 L'argomento \param{flag} è specificato come maschera binaria composta da un OR
1173 dei valori riportati in \tabref{tab:file_mmap_rsync}, di questi però
1174 \macro{MS\_ASYNC} e \macro{MS\_SYNC} sono incompatibili; con il primo valore
1175 infatti la funzione si limita ad inoltrare la richiesta di sincronizzazione al
1176 meccanismo della memoria virtuale, ritornando subito, mentre con il secondo
1177 attende che la sincronizzazione sia stata effettivamente eseguita. Il terzo
1178 flag fa invalidare le pagine di cui si richiede la sincronizzazione per tutte
1179 le mappature dello stesso file, così che esse possano essere immediatamente
1180 aggiornate ai nuovi valori.
1181
1182 Una volta che si sono completate le operazioni di I/O si può eliminare la
1183 mappatura della memoria usando la funzione \func{munmap}, il suo prototipo è:
1184 \begin{functions}  
1185   \headdecl{unistd.h}
1186   \headdecl{sys/mman.h} 
1187
1188   \funcdecl{int munmap(void *start, size\_t length)}
1189   
1190   Rilascia la mappatura sulla sezione di memoria specificata.
1191
1192   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1193     errore nel qual caso \var{errno} assumerà uno dei valori:
1194     \begin{errlist}
1195     \item[\macro{EINVAL}] L'intervallo specificato non ricade in una zona
1196       precedentemente mappata.
1197     \end{errlist}
1198   }
1199 \end{functions}
1200
1201 La funzione cancella la mappatura per l'intervallo specificato attraverso
1202 \param{start} e \param{length}, ed ogni successivo accesso a tale regione
1203 causerà un errore di accesso in memoria. L'argomento \param{start} deve essere
1204 allineato alle dimensioni di una pagina di memoria, e la mappatura di tutte le
1205 pagine contenute (anche parzialmente) nell'intervallo indicato, verrà rimossa.
1206 Indicare un intervallo che non contiene pagine mappate non è un errore.
1207
1208 Alla conclusione del processo, ogni pagina mappata verrà automaticamente
1209 rilasciata, mentre la chiusura del file descriptor usato per effettuare la
1210 mappatura in memoria non ha alcun effetto sulla stessa.
1211
1212
1213 \section{Il file locking}
1214 \label{sec:file_locking}
1215
1216 In \secref{sec:file_sharing} abbiamo preso in esame le modalità in cui un
1217 sistema unix-like gestisce la condivisione dei file da parte di processi
1218 diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
1219 in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
1220 stesso file non è possibile determinare la sequenza in cui essi opereranno.
1221
1222 Questo causa la possibilità di race condition\index{race condition}; in
1223 generale le situazioni più comuni sono due: l'interazione fra un processo che
1224 scrive e altri che leggono, in cui questi ultimi possono leggere informazioni
1225 scritte solo in maniera parziale o incompleta; o quella in cui diversi
1226 processi scrivono, mescolando in maniera imprevedibile il loro output sul
1227 file.
1228
1229 In tutti questi casi il \textit{file locking} è la tecnica che permette di
1230 evitare le race condition, attraverso una serie di funzioni che permettono di
1231 bloccare l'accesso al file da parte di altri processi, così da evitare le
1232 sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
1233
1234
1235
1236 \subsection{L'\textit{advisory locking}}
1237 \label{sec:file_record_locking}
1238
1239 La prima modalità di file locking che è stata implementata nei sistemi
1240 unix-like è quella che viene usualmente chiamata \textit{advisory
1241   locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
1242   come al \textit{record locking}, dizione utilizzata anche dal manuale delle
1243   \acr{glibc}; nelle pagine di manuale si parla di \textit{discretionary file
1244     lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
1245   mentre questo nome viene usato anche da Stevens per riferirsi al
1246   \textit{file locking} di POSIX. Dato che la dizione \textit{record locking}
1247   è quantomeno ambigua in quanto non esiste niente che possa fare riferimento
1248   al concetto di \textit{record}, alla fine si è scelto di mantenere il nome
1249   \textit{advisory locking}.} in quanto sono i singoli processi, e non il
1250 sistema, che si incaricano di asserire e verificare se esistono delle
1251 condizioni di blocco per l'accesso ai file.  Questo significa che le funzioni
1252 \func{read} o \func{write} non risentono affatto della presenza di un
1253 eventuale blocco, e che sta ai vari processi controllare esplicitamente lo
1254 stato dei file condivisi prima di accedervi, implementando un opportuno
1255 protocollo.
1256
1257 In generale si distinguono due tipologie di blocco per un file: la prima è il
1258 cosiddetto \textit{shared lock}, detto anche \textit{read lock} in quanto
1259 serve a bloccare l'accesso in scrittura su un file affinché non venga
1260 modificato mentre lo si legge. Si parla di \textsl{blocco condiviso} in quanto
1261 più processi possono richiedere contemporaneamente uno \textit{shared lock}
1262 su un file per proteggere il loro accesso in lettura.
1263
1264 La seconda tipologia è il cosiddetto \textit{exclusive lock}, detto anche
1265 \textit{write lock} in quanto serve a bloccare l'accesso su un file (sia in
1266 lettura che in scrittura) da parte di altri processi mentre lo si sta
1267 scrivendo. Si parla di \textsl{blocco esclusivo} appunto perché un solo
1268 processo alla volta può richiedere un \textit{exclusive lock} su un file per
1269 proteggere il suo accesso in scrittura.
1270
1271 In Linux sono disponibili due interfacce per utilizzare l'\textit{advisory
1272   locking}, la prima è quella derivata da BSD, che è basata sulla funzione
1273 \func{flock}, la seconda è quella standardizzata da POSIX.1 (derivata da
1274 System V), che è basata sulla funzione \func{fcntl}.  I \textit{file lock}
1275 sono implementati in maniera completamente indipendente nelle due interfacce,
1276 che pertanto possono coesistere senza interferenze.
1277
1278 Entrambe le interfacce prevedono la stessa procedura di funzionamento: si
1279 inizia sempre con il richiedere l'opportuno \textit{file lock} (un
1280 \textit{exclusive lock} per una scrittura, uno \textit{shared lock} per una
1281 lettura) prima di eseguire l'accesso ad un file.  Se il lock viene acquisito
1282 il processo prosegue l'esecuzione, altrimenti (a meno di non aver richiesto un
1283 comportamento non bloccante) viene posto in stato di sleep. Una volta finite
1284 le operazioni sul file si deve provvedere a rimuovere il lock.  Si ricordi che
1285 la condizione per acquisire uno \textit{shared lock} è che il file non abbia
1286 già un \textit{exclusive lock} attivo, mentre per acquisire un
1287 \textit{exclusive lock} non deve essere presente nessun tipo di blocco.
1288
1289
1290 \subsection{La funzione \func{flock}}
1291 \label{sec:file_flock}
1292
1293 La prima interfaccia per il file locking, quella derivata da BSD, permette di
1294 eseguire un blocco solo su un intero file; la funzione usata per richiedere e
1295 rimuovere un \textit{file lock} è \func{flock}, ed il suo prototipo è:
1296 \begin{prototype}{sys/file.h}{int flock(int fd, int operation)}
1297   
1298   Applica o rimuove un \textit{file lock} sul file \param{fd}.
1299   
1300   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1301     errore, nel qual caso \var{errno} assumerà uno dei valori:
1302     \begin{errlist}
1303     \item[\macro{EWOULDBLOCK}] Il file ha già un blocco attivo, e si è
1304       specificato \macro{LOCK\_NB}.
1305     \end{errlist}
1306   }
1307 \end{prototype}
1308
1309 La funzione può essere usata per acquisire o rilasciare un blocco a seconda di
1310 quanto specificato tramite il valore dell'argomento \param{operation}, questo
1311 viene interpretato come maschera binaria, e deve essere passato utilizzando le
1312 costanti riportate in \tabref{tab:file_flock_operation}.
1313
1314 \begin{table}[htb]
1315   \centering
1316   \footnotesize
1317   \begin{tabular}[c]{|l|l|}
1318     \hline
1319     \textbf{Valore} & \textbf{Significato} \\
1320     \hline
1321     \hline
1322     \macro{LOCK\_SH} & Asserisce uno \textit{shared lock} sul file.\\ 
1323     \macro{LOCK\_EX} & Asserisce un \textit{esclusive lock} sul file.\\
1324     \macro{LOCK\_UN} & Sblocca il file.\\
1325     \macro{LOCK\_NB} & Impedisce che la funzione si blocchi nella
1326                        richiesta di un \textit{file lock}.\\
1327     \hline    
1328   \end{tabular}
1329   \caption{Valori dell'argomento \param{operation} di \func{flock}.}
1330   \label{tab:file_flock_operation}
1331 \end{table}
1332
1333 I primi due valori, \macro{LOCK\_SH} e \macro{LOCK\_EX} permettono di
1334 richiedere un \textit{file lock}, ed ovviamente devono essere usati in maniera
1335 alternativa. Se si specifica anche \macro{LOCK\_NB} la funzione non si
1336 bloccherà qualora il lock non possa essere acquisito, ma ritornerà subito con
1337 un errore di \macro{EWOULDBLOCK}. Per rilasciare un lock si dovrà invece usare
1338 \macro{LOCK\_NB}.
1339
1340 La semantica del file locking di BSD è diversa da quella del file locking
1341 POSIX, in particolare per quanto riguarda il comportamento dei lock nei
1342 confronti delle due funzioni \func{dup} e \func{fork}.  Per capire queste
1343 differenze occorre prima descrivere con maggiore dettaglio come viene
1344 realizzato il file locking nel kernel.
1345
1346 In \figref{fig:file_flock_struct} si è riportato uno schema essenziale
1347 dell'implementazione del file locking in Linux; il punto fondamentale da
1348 capire è che un lock, qualunque sia l'interfaccia che si usa, anche se
1349 richiesto attraverso un file descriptor, agisce sempre su un file; perciò le
1350 informazioni relative agli eventuali \textit{file lock} sono mantenute a
1351 livello di inode,\footnote{in particolare, come accennato in
1352   \figref{fig:file_flock_struct}, i \textit{file lock} sono mantenuti un una
1353   \textit{linked list}\index{linked list} di strutture \var{file\_lock}. La
1354   lista è referenziata dall'indirizzo di partenza mantenuto dal campo
1355   \var{i\_flock} della struttura \var{inode} (per le definizioni esatte si
1356   faccia riferimento al file \file{fs.h} nei sorgenti del kernel).  Un bit del
1357   campo \var{fl\_flags} di specifica se si tratta di un lock in semantica BSD
1358   (\macro{FL\_FLOCK}) o POSIX (\macro{FL\_POSIX}).} dato che questo è l'unico
1359 riferimento in comune che possono avere due processi diversi che aprono lo
1360 stesso file.
1361
1362 \begin{figure}[htb]
1363   \centering
1364   \includegraphics[width=13cm]{img/file_flock}
1365   \caption{Schema dell'architettura del file locking, nel caso particolare  
1366     del suo utilizzo da parte dalla funzione \func{flock}.}
1367   \label{fig:file_flock_struct}
1368 \end{figure}
1369
1370 La richiesta di un file lock prevede una scansione della lista per determinare
1371 se l'acquisizione è possibile, ed in caso positivo l'aggiunta di un nuovo
1372 elemento.\footnote{cioè una nuova struttura \var{file\_lock}.}  Nel caso dei
1373 lock creati con \func{flock} la semantica della funzione prevede che sia
1374 \func{dup} che \func{fork} non creino ulteriori istanze di un \textit{file
1375   lock} quanto piuttosto degli ulteriori riferimenti allo stesso. Questo viene
1376 realizzato dal kernel associando ad ogni nuovo \textit{file lock} un
1377 puntatore\footnote{il puntatore è mantenuto nel campo \var{fl\_file} di
1378   \var{file\_lock}, e viene utilizzato solo per i lock creati con la semantica
1379   BSD.} alla voce nella \textit{file table} da cui si è richiesto il blocco,
1380 che così ne identifica il titolare.
1381
1382 Questa struttura comporta che, quando si richiede la rimozione di un file
1383 lock, il kernel acconsenta solo se la richiesta proviene da un file descriptor
1384 che fa riferimento ad una voce nella file table corrispondente a quella
1385 registrata nel blocco.  Allora se ricordiamo quanto visto in
1386 \secref{sec:file_dup} e \secref{sec:file_sharing}, e cioè che i file
1387 descriptor duplicati e quelli ereditati in un processo figlio puntano sempre
1388 alla stessa voce nella file table, si può capire immediatamente quali sono le
1389 conseguenze nei confronti delle funzioni \func{dup} e \func{fork}.
1390
1391 Sarà cioè possibile rimuovere un file lock attraverso uno qualunque dei file
1392 descriptor che fanno riferimento alla stessa voce nella file table, quindi
1393 anche se questo è diverso da quello con cui lo si è
1394 creato,\footnote{attenzione, questo non vale se il file descriptor fa
1395   riferimento allo stesso file, ma attraverso una voce diversa della file
1396   table, come accade tutte le volte che si apre più volte lo stesso file.} o
1397 se si esegue la rimozione in un processo figlio; inoltre una volta tolto un
1398 file lock, la rimozione avrà effetto su tutti i file descriptor che
1399 condividono la stessa voce nella file table, e quindi, nel caso di file
1400 descriptor ereditati attraverso una \func{fork}, anche su processi diversi.
1401
1402 Infine, per evitare che la terminazione imprevista di un processo lasci attivi
1403 dei file lock, quando un file viene chiuso il kernel provveda anche a
1404 rimuovere tutti i lock ad esso associati. Anche in questo caso occorre tenere
1405 presente cosa succede quando si hanno file descriptor duplicati; in tal caso
1406 infatti il file non verrà effettivamente chiuso (ed il lock rimosso) fintanto
1407 che non viene rilasciata la relativa voce nella file table; la rimozione cioè
1408 avverrà solo quando tutti i file descriptor che fanno riferimento alla stessa
1409 voce sono stati chiusi, quindi, nel caso ci siano processi figli che
1410 mantengono ancora aperto un file descriptor, il lock non sarà rilasciato.
1411
1412 Si tenga presente che \func{flock} non è in grado di funzionare per i file
1413 mantenuti su NFS, in questo caso, se si ha la necessità di eseguire il
1414 \textit{file locking}, occorre usare l'interfaccia basata su \func{fcntl} che
1415 può funzionare anche attraverso NFS, a condizione che sia il client che il
1416 server supportino questa funzionalità.
1417  
1418
1419 \subsection{Il file locking POSIX}
1420 \label{sec:file_posix_lock}
1421
1422 La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è
1423 quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo
1424 già trattato questa funzione nelle sue molteplici funzionalità in
1425 \secref{sec:file_fcntl}; quando la si impiega per il \textit{file locking}
1426 però essa viene usata solo secondo il prototipo:
1427 \begin{prototype}{fcntl.h}{int fcntl(int fd, int cmd, struct flock *lock)}
1428   
1429   Applica o rimuove un \textit{file lock} sul file \param{fd}.
1430   
1431   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1432     errore, nel qual caso \var{errno} assumerà uno dei valori:
1433     \begin{errlist}
1434     \item[\macro{EACCES}] L'operazione è proibita per la presenza di
1435       \textit{file lock} da parte di altri processi.
1436     \item[\macro{ENOLCK}] Il sistema non ha le risorse per il locking: ci sono
1437       troppi segmenti di lock aperti, si è esaurita la tabella dei lock, o il
1438       protocollo per il locking remoto è fallito.
1439     \item[\macro{EDEADLK}] Si è richiesto un lock su una regione bloccata da
1440       un altro processo che è a sua volta in attesa dello sblocco di un lock
1441       mantenuto dal processo corrente; si avrebbe pertanto un
1442       \textit{deadlock}. Non è garantito che il sistema riconosca sempre
1443       questa situazione.
1444     \item[\macro{EINTR}] La funzione è stata interrotta da un segnale prima di
1445       poter acquisire un lock.
1446     \end{errlist}
1447     ed inoltre \macro{EBADF}, \macro{EFAULT}.
1448   }
1449 \end{prototype}
1450
1451 Al contrario di quanto avviene con l'interfaccia basata su \func{flock} con
1452 \func{fcntl} è possibile bloccare anche delle singole sezioni di un file;
1453 inoltre la funzione permette di leggere le informazioni relative ai blocchi
1454 esistenti.  Per poter fare tutto questo la funzione utilizza come terzo
1455 argomento una apposita struttura \var{flock} (la cui definizione è riportata
1456 in \figref{fig:struct_flock}) che contiene tutte le specifiche di un dato file
1457 lock.
1458
1459 \begin{figure}[!htb]
1460   \footnotesize \centering
1461   \begin{minipage}[c]{15cm}
1462     \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
1463 struct flock {
1464     short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
1465     short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
1466     off_t l_start;      /* Offset where the lock begins.  */
1467     off_t l_len;        /* Size of the locked area; zero means until EOF.  */
1468     pid_t l_pid;        /* Process holding the lock.  */
1469 };
1470     \end{lstlisting}
1471   \end{minipage} 
1472   \normalsize 
1473   \caption{La struttura \type{flock}, usata da \func{fcntl} per il file
1474     locking.} 
1475   \label{fig:struct_flock}
1476 \end{figure}
1477
1478 L'operazione effettivamente svolta dalla funzione è stabilita dal valore
1479 dall'argomento \param{cmd} che, come già riportato in \secref{sec:file_fcntl},
1480 specifica l'azione da compiere; i valori relativi al file locking sono tre:
1481 \begin{basedescript}{\desclabelwidth{2.0cm}}
1482 \item[\macro{F\_GETLK}] verifica se il file lock specificato dalla struttura
1483   puntata da \param{lock} non è bloccato da qualche altro lock: in caso
1484   affermativo sovrascrive la struttura con i valori relativi a quest'ultimo,
1485   altrimenti si limita a impostarne il campo \var{l\_type} con
1486   \macro{F\_UNLCK}.
1487 \item[\macro{F\_SETLK}] se il campo \var{l\_type} della struttura puntata da
1488   \param{lock} è \macro{F\_RDLCK} o \macro{F\_WRLCK} richiede il
1489   corrispondente file lock, se è \macro{F\_UNLCK} lo rilascia. Nel caso la
1490   richiesta non possa essere soddisfatta a causa di un lock preesistente la
1491   funzione ritorna immediatamente con un errore di \macro{EACCES} o di
1492   \macro{EAGAIN}.
1493 \item[\macro{F\_SETLKW}] è identica a \macro{F\_SETLK}, ma se la richiesta di
1494   un lock non può essere soddisfatta per la presenza di un altro blocco, mette
1495   il processo in stato di attesa fintanto che il lock precedente non viene
1496   rilasciato. Se l'attesa viene interrotta da un segnale la funzione ritorna
1497   con un errore di \macro{EINTR}.
1498 \end{basedescript}
1499
1500 Come accennato nell'interfaccia POSIX ogni file lock viene associato ad una
1501 struttura \func{flock}; i tre campi \var{l\_whence}, \var{l\_start} e
1502 \var{l\_len}, servono a specificare la sezione del file a cui fa riferimento
1503 il lock, \var{l\_start} specifica il byte di partenza, e \var{l\_len} la
1504 lunghezza della sezione; \var{l\_whence} infine imposta il riferimento da cui
1505 contare \var{l\_start} e segue la stessa semantica dell'omonimo argomento di
1506 \func{lseek}, coi tre possibili valori \macro{SEEK\_SET}, \macro{SEEK\_CUR} e
1507 \macro{SEEK\_END} (si vedano le relative descrizioni in
1508 \secref{sec:file_lseek}).
1509
1510 Si tenga presente che un lock può essere richiesto anche per una regione al di
1511 là della corrente fine del file, così che una eventuale estensione dello
1512 stesso resti coperta dal blocco. Se si specifica un valore nullo per
1513 \var{l\_len} il blocco si considera esteso fino alla dimensione massima del
1514 file; in questo modo è possibile bloccare una qualunque regione a partire da
1515 un certo punto fino alla fine del file, coprendo automaticamente quanto
1516 eventualmente aggiunto in coda allo stesso.
1517
1518 \begin{table}[htb]
1519   \centering
1520   \footnotesize
1521   \begin{tabular}[c]{|l|l|}
1522     \hline
1523     \textbf{Valore} & \textbf{Significato} \\
1524     \hline
1525     \hline
1526     \macro{F\_RDLCK} & Richiede un blocco condiviso (\textit{read lock}).\\
1527     \macro{F\_WRLCK} & Richiede un blocco esclusivo (\textit{write lock}).\\
1528     \macro{F\_UNLCK} & Richiede l'eliminazione di un lock.\\
1529     \hline    
1530   \end{tabular}
1531   \caption{Valori possibili per il campo \var{l\_type} di \func{flock}.}
1532   \label{tab:file_flock_type}
1533 \end{table}
1534
1535 Il tipo di file lock richiesto viene specificato dal campo \var{l\_type}, esso
1536 può assumere i tre valori riportati in \tabref{tab:file_flock_type}, che
1537 permettono di richiedere rispettivamente uno \textit{shared lock}, un
1538 \textit{esclusive lock}, e la rimozione di un lock precedentemente acquisito.
1539
1540 \begin{figure}[htb]
1541   \centering
1542   \includegraphics[width=13cm]{img/file_posix_lock}
1543   \caption{Schema dell'architettura del file locking, nel caso particolare  
1544     del suo utilizzo secondo l'interfaccia standard POSIX.}
1545   \label{fig:file_posix_lock}
1546 \end{figure}
1547
1548 Infine il campo \var{l\_pid} riporta (viene usato solo in lettura, quando si
1549 chiama \func{fcntl} con \macro{F\_GETLK}) qual'è il processo cui appartiene il
1550 file lock. Nella semantica POSIX infatti il comportamento dei lock è diverso
1551 rispetto a quanto visto in precedenza per \func{flock}. Lo schema della
1552 struttura usata in questo caso è riportato in \figref{fig:file_posix_lock};
1553 come si vede essa è molto simile a quanto visto in
1554 \figref{fig:file_flock_struct} per \func{flock}:\footnote{in questo caso si
1555   sono evidenziati nella figura i campi di \var{file\_lock} significativi per
1556   la semantica POSIX, in particolare adesso ciascun lock contiene, oltre al
1557   \acr{pid} del processo in \var{fl\_pid}, la sezione di file che viene
1558   bloccata grazie ai campi \var{fl\_start} e \var{fl\_end}.  La struttura è
1559   comunque la stessa, solo che in questo caso nel campo \var{fl\_flags} è
1560   impostato il bit \macro{FL\_POSIX} ed il campo \var{fl\_file} non viene
1561   usato.} il lock è sempre associato all'inode, solo che in questo caso la
1562 titolarità non viene identificata con il riferimento ad una voce nella file
1563 table, ma con il valore del \acr{pid} del processo.
1564
1565 Tutto ciò significa che la rimozione di un blocco viene effettuata
1566 controllando che il \acr{pid} del processo richiedente corrisponda a quello
1567 contenuto nel lock. Questa diversa modalità ha delle conseguenze precise
1568 riguardo il comportamento dei lock POSIX. La prima conseguenza è che un lock
1569 POSIX non viene mai ereditato attraverso una \func{fork}, dato che il processo
1570 figlio avrà un \acr{pid} diverso, mentre passa indenne attraverso una
1571 \func{exec} in quanto il \acr{pid} resta lo stesso.  Questo comporta che, al
1572 contrario di quanto avveniva con la semantica BSD, quando processo termina
1573 tutti i file lock da esso detenuti vengono immediatamente rilasciati.
1574
1575 La seconda conseguenza è che qualunque file descriptor che faccia riferimento
1576 allo stesso file (che sia stato ottenuto con una \func{dup} o con una
1577 \func{open} non fa differenza) può essere usato per rimuovere un lock, dato
1578 che quello che conta è solo il \acr{pid} del processo. Da questo deriva una
1579 ulteriore sottile differenza di comportamento: dato che alla chiusura di un
1580 file i lock ad esso associati vengono rimossi, nella semantica POSIX basterà
1581 chiudere un file descriptor per cancellare tutti i lock relativi al file cui
1582 esso faceva riferimento, anche se questi fossero stati creati usando altri
1583 file descriptor che restano aperti.
1584
1585 Abbiamo visto come l'interfaccia POSIX per il file locking sia molto più
1586 potente e flessibile di quella di BSD, ma è anche molto più complicata da
1587 usare per le varie opzioni da passare a \func{fcntl}. Per questo motivo è
1588 disponibile anche una interfaccia semplificata (ripresa da System V) che
1589 utilizza la funzione \func{lockf}, il cui prototipo è:
1590 \begin{prototype}{sys/file.h}{int lockf(int fd, int cmd, off\_t len)}
1591   
1592   Applica, controlla o rimuove un \textit{file lock} sul file \param{fd}.
1593   
1594   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1595     errore, nel qual caso \var{errno} assumerà uno dei valori:
1596     \begin{errlist}
1597     \item[\macro{EWOULDBLOCK}] Non è possibile acquisire il lock, e si è
1598       selezionato \macro{LOCK\_NB}, oppure l'operazione è proibita perché il
1599       file è mappato in memoria.
1600     \item[\macro{ENOLCK}] Il sistema non ha le risorse per il locking: ci sono
1601       troppi segmenti di lock aperti, si è esaurita la tabella dei lock.
1602     \end{errlist}
1603     ed inoltre \macro{EBADF}, \macro{EINVAL}.
1604   }
1605 \end{prototype}
1606
1607 Il comportamento della funzione dipende dal valore dell'argomento \param{cmd}
1608 che specifica quale azione eseguire; i valori possibili sono riportati in
1609 \tabref{tab:file_lockf_type}.
1610
1611 \begin{table}[htb]
1612   \centering
1613   \footnotesize
1614   \begin{tabular}[c]{|l|p{8cm}|}
1615     \hline
1616     \textbf{Valore} & \textbf{Significato} \\
1617     \hline
1618     \hline
1619     \macro{LOCK\_SH}& Richiede uno \textit{shared lock}. Più processi possono
1620                       mantenere un lock condiviso sullo stesso file.\\
1621     \macro{LOCK\_EX}& Richiede un \textit{exclusive lock}. Un solo processo
1622                       alla volta può mantenere un lock esclusivo su un file. \\
1623     \macro{LOCK\_UN}& Sblocca il file.\\
1624     \macro{LOCK\_NB}& Non blocca la funzione quando il lock non è disponibile,
1625                       si specifica sempre insieme ad una delle altre operazioni
1626                       con un OR aritmetico dei valori.\\ 
1627     \hline    
1628   \end{tabular}
1629   \caption{Valori possibili per il campo \var{cmd} di \func{lockf}.}
1630   \label{tab:file_lockf_type}
1631 \end{table}
1632
1633 Qualora il lock non possa essere acquisito, a meno di non aver specificato
1634 \macro{LOCK\_NB}, la funzione si blocca fino alla disponibilità dello stesso.
1635 Dato che la funzione è implementata utilizzando \func{fcntl} la semantica
1636 delle operazioni è la stessa di quest'ultima (pertanto la funzione non è
1637 affatto equivalente a \func{flock}).
1638
1639
1640
1641 \subsection{Il \textit{mandatory locking}}
1642 \label{sec:file_mand_locking}
1643
1644 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4,
1645 per introdurre un file locking che, come dice il nome, fosse effettivo
1646 indipendentemente dai controlli eseguiti da un processo. Con il
1647 \textit{mandatory locking} infatti è possibile far eseguire il blocco del file
1648 direttamente al sistema, così che, anche qualora non si predisponessero le
1649 opportune verifiche nei processi, questo verrebbe comunque rispettato.
1650
1651 Per poter utilizzare il \textit{mandatory locking} è stato introdotto un
1652 utilizzo particolare del bit \acr{sgid}. Se si ricorda quanto esposto in
1653 \secref{sec:file_suid_sgid}), esso viene di norma utilizzato per cambiare il
1654 groupid effettivo con cui viene eseguito un programma, ed è pertanto sempre
1655 associato alla presenza del permesso di esecuzione per il gruppo. Impostando
1656 questo bit su un file senza permesso di esecuzione in un sistema che supporta
1657 il \textit{mandatory locking}, fa sì che quest'ultimo venga attivato per il
1658 file in questione. In questo modo una combinazione dei permessi
1659 originariamente non contemplata, in quanto senza significato, diventa
1660 l'indicazione della presenza o meno del \textit{mandatory
1661   locking}.\footnote{un lettore attento potrebbe ricordare quanto detto in
1662   \secref{sec:file_chmod} e cioè che il bit \acr{sgid} viene cancellato (come
1663   misura di sicurezza) quando di scrive su un file, questo non vale quando
1664   esso viene utilizzato per attivare il \textit{mandatory locking}.}
1665
1666 L'uso del \textit{mandatory locking} presenta vari aspetti delicati, dato che
1667 neanche root può passare sopra ad un lock; pertanto un processo che blocchi un
1668 file cruciale può renderlo completamente inaccessibile, rendendo completamente
1669 inutilizzabile il sistema\footnote{il problema si potrebbe risolvere
1670   rimuovendo il bit \acr{sgid}, ma non è detto che sia così facile fare questa
1671   operazione con un sistema bloccato.} inoltre con il \textit{mandatory
1672   locking} si può bloccare completamente un server NFS richiedendo una lettura
1673 su un file su cui è attivo un lock. Per questo motivo l'abilitazione del
1674 mandatory locking è di norma disabilitata, e deve essere attivata filesystem
1675 per filesystem in fase di montaggio (specificando l'apposita opzione di
1676 \func{mount} riportata in \tabref{tab:sys_mount_flags}, o con l'opzione
1677 \cmd{mand} per il comando).
1678
1679 Si tenga presente inoltre che il \textit{mandatory locking} funziona
1680 sull'interfaccia POSIX di \func{fcntl}, questo significa che non ha nessun
1681 effetto sui lock richiesti con l'interfaccia di \func{flock}, ed inoltre che
1682 la granularità del lock è quella del singolo byte, come per \func{fcntl}.
1683
1684 La sintassi di acquisizione dei lock è esattamente la stessa vista in
1685 precedenza per \func{fcntl} e \func{lockf}, la differenza è che in caso di
1686 mandatory lock attivato non è più necessario controllare la disponibilità di
1687 accesso al file, ma si potranno usare direttamente le ordinarie funzioni di
1688 lettura e scrittura e sarà compito del kernel gestire direttamente il file
1689 locking.
1690
1691 Questo significa che in caso di read lock la lettura dal file potrà avvenire
1692 normalmente con \func{read}, mentre una \func{write} si bloccherà fino al
1693 rilascio del lock, a meno di non aver aperto il file con \macro{O\_NONBLOCK},
1694 nel qual caso essa ritornerà immediatamente con un errore di \macro{EAGAIN}.
1695
1696 Se invece si è acquisito un write lock tutti i tentativi di leggere o scrivere
1697 sulla regione del file bloccata fermeranno il processo fino al rilascio del
1698 lock, a meno che il file non sia stato aperto con \macro{O\_NONBLOCK}, nel
1699 qual caso di nuovo si otterrà un ritorno immediato con l'errore di
1700 \macro{EAGAIN}.
1701
1702 Infine occorre ricordare che le funzioni di lettura e scrittura non sono le
1703 sole ad operare sui contenuti di un file, e che sia \func{creat} che
1704 \func{open} (quando chiamata con \macro{O\_TRUNC}) effettuano dei cambiamenti,
1705 così come \func{truncate}, riducendone le dimensioni (a zero nei primi due
1706 casi, a quanto specificato nel secondo). Queste operazioni sono assimilate a
1707 degli accessi in scrittura e pertanto non potranno essere eseguite (fallendo
1708 con un errore di \macro{EAGAIN}) su un file su cui sia presente un qualunque
1709 lock (le prime due sempre, la terza solo nel caso che la riduzione delle
1710 dimensioni del file vada a sovrapporsi ad una regione bloccata).
1711
1712 L'ultimo aspetto della interazione del \textit{mandatory locking} con le
1713 funzioni di accesso ai file è quello relativo ai file mappati in memoria
1714 appena trattati in \secref{sec:file_memory_map}; anche in tal caso infatti,
1715 quando si esegue la mappatura con l'opzione \macro{MAP\_SHARED}, si ha un
1716 accesso al contenuto del file. Lo standard SVID prevede che sia impossibile
1717 eseguire il memory mapping di un file su cui sono presenti dei
1718 lock\footnote{alcuni sistemi, come HP-UX, sono ancora più restrittivi e lo
1719   impediscono anche in caso di \textit{advisory locking}, anche se questo non
1720   ha molto senso.} in Linux è stata però fatta la scelta implementativa di
1721 seguire questo comportamento soltanto quando si chiama \func{mmap} con
1722 l'opzione \macro{MAP\_SHARED} (nel qual caso la funzione fallisce con il
1723 solito \macro{EAGAIN}). 
1724
1725
1726
1727
1728 %%% Local Variables: 
1729 %%% mode: latex
1730 %%% TeX-master: "gapil"
1731 %%% End: