Altre modifiche che mi ero dimenticato di buttar giu ieri
[gapil.git] / fileadv.tex
1 %% fileadv.tex
2 %%
3 %% Copyright (C) 2000-2003 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \chapter{La gestione avanzata dei file}
12 \label{cha:file_advanced}
13
14 In questo capitolo affronteremo le tematiche relative alla gestione avanzata
15 dei file. In particolare tratteremo delle funzioni di input/output avanzato,
16 che permettono una gestione più sofisticata dell'I/O su file, a partire da
17 quelle che permettono di gestire l'accesso contemporaneo a più file, per
18 concludere con la gestione dell'I/O mappato in memoria. Dedicheremo poi la
19 fine del capitolo alle problematiche del \textit{file locking}.
20
21
22 \section{L'\textit{I/O multiplexing}}
23 \label{sec:file_multiplexing}
24
25 Uno dei problemi che si presentano quando si deve operare contemporaneamente
26 su molti file usando le funzioni illustrate in
27 \capref{cha:file_unix_interface} e \capref{cha:files_std_interface} è che si
28 può essere bloccati nelle operazioni su un file mentre un altro potrebbe
29 essere disponibile. L'\textit{I/O multiplexing} nasce risposta a questo
30 problema. In questa sezione forniremo una introduzione a questa problematica
31 ed analizzeremo le varie funzioni usate per implementare questa modalità di
32 I/O.
33
34
35 \subsection{La problematica dell'\textit{I/O multiplexing} e l'uso
36   dell'\textsl{I/O non-bloccante}}
37 \label{sec:file_noblocking}
38
39 Abbiamo visto in \secref{sec:sig_gen_beha}, affrontando la suddivisione fra
40 \textit{fast} e \textit{slow} system call, che in certi casi le funzioni di
41 I/O possono bloccarsi indefinitamente.\footnote{si ricordi però che questo può
42   accadere solo per le pipe, i socket\index{socket} ed alcuni file di
43   dispositivo\index{file!di dispositivo}; sui file normali le funzioni di
44   lettura e scrittura ritornano sempre subito.}  Ad esempio le operazioni di
45 lettura possono bloccarsi quando non ci sono dati disponibili sul descrittore
46 su cui si sta operando.
47
48 Questo comportamento causa uno dei problemi più comuni che ci si trova ad
49 affrontare nelle operazioni di I/O, che si verifica quando si deve operare con
50 più file descriptor eseguendo funzioni che possono bloccarsi senza che sia
51 possibile prevedere quando questo può avvenire (il caso più classico è quello
52 di un server in attesa di dati in ingresso da vari client). Quello che può
53 accadere è di restare bloccati nell'eseguire una operazione su un file
54 descriptor che non è ``\textsl{pronto}'', quando ce ne potrebbe essere
55 un'altro disponibile. Questo comporta nel migliore dei casi una operazione
56 ritardata inutilmente nell'attesa del completamento di quella bloccata, mentre
57 nel peggiore dei casi (quando la conclusione della operazione bloccata dipende
58 da quanto si otterrebbe dal file descriptor ``\textsl{disponibile}'') si
59 potrebbe addirittura arrivare ad un \textit{deadlock}\index{deadlock}.
60
61 Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
62 questo tipo di comportamento delle funzioni di I/O aprendo un file in quella
63 che viene chiamata \textsl{modalità non-bloccante}, attraverso l'uso del flag
64 \const{O\_NONBLOCK} nella chiamata di \func{open}. In questo caso le funzioni
65 di input/output eseguite sul file che si sarebbero bloccate, ritornano
66 immediatamente, restituendo l'errore \errcode{EAGAIN}.
67
68 L'utilizzo di questa modalità di I/O permette di risolvere il problema
69 controllando a turno i vari file descriptor, in un ciclo in cui si ripete
70 l'accesso fintanto che esso non viene garantito.  Ovviamente questa tecnica,
71 detta \textit{polling}\index{polling}, è estremamente inefficiente: si tiene
72 costantemente impiegata la CPU solo per eseguire in continuazione delle system
73 call che nella gran parte dei casi falliranno. 
74
75 Per superare questo problema è stato introdotto il concetto di \textit{I/O
76   multiplexing}, una nuova modalità di operazioni che consenta di tenere sotto
77 controllo più file descriptor in contemporanea, permettendo di bloccare un
78 processo quando le operazioni volute non sono possibili, e di riprenderne
79 l'esecuzione una volta che almeno una di quelle richieste sia disponibile, in
80 modo da poterla eseguire con la sicurezza di non restare bloccati.
81
82 Dato che, come abbiamo già accennato, per i normali file su disco non si ha
83 mai un accesso bloccante, l'uso più comune delle funzioni che esamineremo nei
84 prossimi paragrafi è per i server di rete, in cui esse vengono utilizzate per
85 tenere sotto controllo dei socket; pertanto ritorneremo su di esse con
86 ulteriori dettagli e qualche esempio in \secref{sec:TCP_sock_multiplexing}.
87
88
89 \subsection{Le funzioni \func{select} e \func{pselect}}
90 \label{sec:file_select}
91
92 Il primo ad introdurre una interfaccia per l'\textit{I/O multiplexing} è stato
93 BSD,\footnote{la funzione \func{select} è apparsa in BSD4.2 e standardizzata
94   in BSD4.4, ma è stata portata su tutti i sistemi che supportano i
95   \textit{socket}\index{socket}, compreso le varianti di System V.}  con la
96 funzione \funcd{select}, il cui prototipo è:
97 \begin{functions}
98   \headdecl{sys/time.h}
99   \headdecl{sys/types.h}
100   \headdecl{unistd.h}
101   \funcdecl{int select(int n, fd\_set *readfds, fd\_set *writefds, fd\_set
102     *exceptfds, struct timeval *timeout)}
103   
104   Attende che uno dei file descriptor degli insiemi specificati diventi
105   attivo.
106   
107   \bodydesc{La funzione in caso di successo restituisce il numero di file
108     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
109     caso \var{errno} assumerà uno dei valori:
110   \begin{errlist}
111   \item[\errcode{EBADF}] Si è specificato un file descriptor sbagliato in uno
112     degli insiemi.
113   \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
114   \item[\errcode{EINVAL}] Si è specificato per \param{n} un valore negativo o
115     un valore non valido per \param{timeout}.
116   \end{errlist}
117   ed inoltre \errval{ENOMEM}.
118 }
119 \end{functions}
120
121 La funzione mette il processo in stato di \textit{sleep} (vedi
122 \tabref{tab:proc_proc_states}) fintanto che almeno uno dei file descriptor
123 degli insiemi specificati (\param{readfds}, \param{writefds} e
124 \param{exceptfds}), non diventa attivo, per un tempo massimo specificato da
125 \param{timeout}.
126
127 Per specificare quali file descriptor si intende \textsl{selezionare}, la
128 funzione usa un particolare oggetto, il \textit{file descriptor set},
129 identificato dal tipo \type{fd\_set}, che serve ad identificare un insieme di
130 file descriptor, in maniera analoga a come un \textit{signal set} (vedi
131 \secref{sec:sig_sigset}) identifica un insieme di segnali. Per la
132 manipolazione di questi \textit{file descriptor set} si possono usare delle
133 opportune macro di preprocessore:
134 \begin{functions}
135   \headdecl{sys/time.h}
136   \headdecl{sys/types.h}
137   \headdecl{unistd.h}
138   \funcdecl{FD\_ZERO(fd\_set *set)}
139   Inizializza l'insieme (vuoto).
140
141   \funcdecl{FD\_SET(int fd, fd\_set *set)}
142   Inserisce il file descriptor \param{fd} nell'insieme.
143
144   \funcdecl{FD\_CLR(int fd, fd\_set *set)}
145   Rimuove il file descriptor \param{fd} nell'insieme.
146   
147   \funcdecl{FD\_ISSET(int fd, fd\_set *set)}
148   Controlla se il file descriptor \param{fd} è nell'insieme.
149 \end{functions}
150
151 In genere un \textit{file descriptor set} può contenere fino ad un massimo di
152 \const{FD\_SETSIZE} file descriptor.  Questo valore in origine corrispondeva
153 al limite per il numero massimo di file aperti\footnote{ad esempio in Linux,
154   fino alla serie 2.0.x, c'era un limite di 256 file per processo.}, ma da
155 quando, come nelle versioni più recenti del kernel, non c'è più un limite
156 massimo, esso indica le dimensioni massime dei numeri usati nei \textit{file
157   descriptor set}.\footnote{il suo valore, secondo lo standard POSIX
158   1003.1-2001, è definito in \file{sys/select.h}, ed è pari a 1024.} Si tenga
159 presente che i \textit{file descriptor set} devono sempre essere inizializzati
160 con \macro{FD\_ZERO}; passare a \func{select} un valore non inizializzato può
161 dar luogo a comportamenti non prevedibili.
162
163 La funzione richiede di specificare tre insiemi distinti di file descriptor;
164 il primo, \param{readfds}, verrà osservato per rilevare la disponibilità di
165 effettuare una lettura,\footnote{per essere precisi la funzione ritornerà in
166   tutti i casi in cui la successiva esecuzione di \func{read} risulti non
167   bloccante, quindi anche in caso di \textit{end-of-file}.} il secondo,
168 \param{writefds}, per verificare la possibilità effettuare una scrittura ed il
169 terzo, \param{exceptfds}, per verificare l'esistenza di eccezioni (come i
170 messaggi urgenti su un \textit{socket}\index{socket}, vedi
171 \secref{sec:TCP_urgent_data}).
172
173 Dato che in genere non si tengono mai sotto controllo fino a
174 \const{FD\_SETSIZE} file contemporaneamente la funzione richiede di
175 specificare qual'è il numero massimo dei file descriptor indicati nei tre
176 insiemi precedenti. Questo viene fatto per efficienza, per evitare di passare
177 e far controllare al kernel una quantità di memoria superiore a quella
178 necessaria. Questo limite viene indicato tramite l'argomento \param{n}, che
179 deve corrispondere al valore massimo aumentato di uno.\footnote{i file
180   descriptor infatti sono contati a partire da zero, ed il valore indica il
181   numero di quelli da tenere sotto controllo; dimenticarsi di aumentare di uno
182   il valore di \param{n} è un errore comune.}
183
184 Infine l'argomento \param{timeout}, specifica un tempo massimo di attesa prima
185 che la funzione ritorni; se impostato a \val{NULL} la funzione attende
186 indefinitamente. Si può specificare anche un tempo nullo (cioè una struttura
187 \struct{timeval} con i campi impostati a zero), qualora si voglia
188 semplicemente controllare lo stato corrente dei file descriptor.
189
190 La funzione restituisce il numero di file descriptor pronti,\footnote{questo è
191   il comportamento previsto dallo standard, ma la standardizzazione della
192   funzione è recente, ed esistono ancora alcune versioni di Unix che non si
193   comportano in questo modo.}  e ciascun insieme viene sovrascritto per
194 indicare i file descriptor pronti per le operazioni ad esso relative, in modo
195 da poterli controllare con \const{FD\_ISSET}.  Se invece si ha un timeout
196 viene restituito un valore nullo e gli insiemi non vengono modificati.  In
197 caso di errore la funzione restituisce -1, ed i valori dei tre insiemi sono
198 indefiniti e non si può fare nessun affidamento sul loro contenuto.
199
200 In Linux \func{select} modifica anche il valore di \param{timeout},
201 impostandolo al tempo restante in caso di interruzione prematura; questo è
202 utile quando la funzione viene interrotta da un segnale, in tal caso infatti
203 si ha un errore di \errcode{EINTR}, ed occorre rilanciare la funzione; in
204 questo modo non è necessario ricalcolare tutte le volte il tempo
205 rimanente.\footnote{questo può causare problemi di portabilità sia quando si
206   trasporta codice scritto su Linux che legge questo valore, sia quando si
207   usano programmi scritti per altri sistemi che non dispongono di questa
208   caratteristica e ricalcolano \param{timeout} tutte le volte. In genere la
209   caratteristica è disponibile nei sistemi che derivano da System V e non
210   disponibile per quelli che derivano da BSD.}
211
212 Uno dei problemi che si presentano con l'uso di \func{select} è che il suo
213 comportamento dipende dal valore del file descriptor che si vuole tenere sotto
214 controllo.  Infatti il kernel riceve con \param{n} un valore massimo per tale
215 valore, e per capire quali sono i file descriptor da tenere sotto controllo
216 dovrà effettuare una scansione su tutto l'intervallo, che può anche essere
217 anche molto ampio anche se i file descriptor sono solo poche unità; tutto ciò
218 ha ovviamente delle conseguenze ampiamente negative per le prestazioni.
219
220 Inoltre c'è anche il problema che il numero massimo dei file che si possono
221 tenere sotto controllo, la funzione è nata quando il kernel consentiva un
222 numero massimo di 1024 file descriptor per processo, adesso che il numero può
223 essere arbitario si viene a creare una dipendenza del tutto artificiale dalle
224 dimensioni della struttura \type{fd\_set}, che può necessitare di essere
225 estesa, con ulteriori perdite di prestazioni. 
226
227 Lo standard POSIX è rimasto a lungo senza primitive per l'\textit{I/O
228   multiplexing}, introdotto solo con le ultime revisioni dello standard (POSIX
229 1003.1g-2000 e POSIX 1003.1-2001). La scelta è stata quella di seguire
230 l'interfaccia creata da BSD, ma prevede che tutte le funzioni ad esso relative
231 vengano dichiarate nell'header \file{sys/select.h}, che sostituisce i
232 precedenti, ed inoltre aggiunge a \func{select} una nuova funzione
233 \funcd{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed
234   l'header \file{sys/select.h}, compaiono in Linux a partire dalle \acr{glibc}
235   2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header, le
236   \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal},
237   senza l'argomento \param{sigmask}, la definizione corretta è presente dalle
238   \acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle
239   \acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore
240   maggiore di 600.} il cui prototipo è:
241 \begin{prototype}{sys/select.h}
242   {int pselect(int n, fd\_set *readfds, fd\_set *writefds, fd\_set *exceptfds,
243     struct timespec *timeout, sigset\_t *sigmask)}
244   
245   Attende che uno dei file descriptor degli insiemi specificati diventi
246   attivo.
247   
248   \bodydesc{La funzione in caso di successo restituisce il numero di file
249     descriptor (anche nullo) che sono attivi, e -1 in caso di errore, nel qual
250     caso \var{errno} assumerà uno dei valori:
251   \begin{errlist}
252   \item[\errcode{EBADF}] Si è specificato un file descriptor sbagliato in uno
253     degli insiemi.
254   \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
255   \item[\errcode{EINVAL}] Si è specificato per \param{n} un valore negativo o
256     un valore non valido per \param{timeout}.
257   \end{errlist}
258   ed inoltre \errval{ENOMEM}.}
259 \end{prototype}
260
261 La funzione è sostanzialmente identica a \func{select}, solo che usa una
262 struttura \struct{timespec} (vedi \figref{fig:sys_timeval_struct}) per
263 indicare con maggiore precisione il timeout e non ne aggiorna il valore in
264 caso di interruzione. Inoltre prende un argomento aggiuntivo \param{sigmask}
265 che è il puntatore ad una maschera di segnali (si veda
266 \secref{sec:sig_sigmask}). La maschera corrente viene sostituita da questa
267 immediatamente prima di eseguire l'attesa, e ripristinata al ritorno della
268 funzione.
269
270 L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili
271 race condition\index{race condition} quando ci si deve porre in attesa sia di
272 un segnale che di dati.\footnote{in Linux però non è stata ancora introdotta
273   la relativa system call, pertanto la funzione è implementata nelle
274   \acr{glibc} attraverso \func{select} e la possibilità di race condition
275   permane.} La tecnica classica è quella di utilizzare il gestore per
276 impostare una variabile globale e controllare questa nel corpo principale del
277 programma; abbiamo visto in \secref{sec:sig_example} come questo lasci spazio
278 a possibili race condition, per cui diventa essenziale utilizzare
279 \func{sigprocmask} per disabilitare la ricezione del segnale prima di eseguire
280 il controllo e riabilitarlo dopo l'esecuzione delle relative operazioni, onde
281 evitare l'arrivo di un segnale immediatamente dopo il controllo, che andrebbe
282 perso.
283
284 Nel nostro caso il problema si pone quando oltre al segnale si devono tenere
285 sotto controllo anche dei file descriptor con \func{select}, in questo caso si
286 può fare conto sul fatto che all'arrivo di un segnale essa verrebbe interrotta
287 e si potrebbero eseguire di conseguenza le operazioni relative al segnale e
288 alla gestione dati con un ciclo del tipo:
289 \includecodesnip{listati/select_race.c} 
290 qui però emerge una race condition, perché se il segnale arriva prima della
291 chiamata a \func{select}, questa non verrà interrotta, e la ricezione del
292 segnale non sarà rilevata.
293
294 Per questo è stata introdotta \func{pselect}, che attraverso l'argomento
295 \param{sigmask} permette di riabilitare la ricezione il segnale
296 contestualmente all'esecuzione della funzione, e ribloccandolo non appena essa
297 ritorna. In questo modo il precedente codice potrebbe essere essere modificato
298 nel seguente modo: 
299 \includecodesnip{listati/pselect_norace.c} 
300 in questo caso utilizzando \var{oldmask} durante l'esecuzione di
301 \func{pselect} la ricezione del segnale sarà abilitata, ed in caso di
302 interruzione si potranno eseguire le relative operazioni.
303
304
305
306 \subsection{La funzione \func{poll}}
307 \label{sec:file_poll}
308
309 Nello sviluppo di System V, invece di utilizzare l'interfaccia di
310 \func{select}, che è una estensione tipica di BSD, è stata introdotta un'altra
311 interfaccia, basata sulla funzione \funcd{poll},\footnote{la funzione è
312   prevista dallo standard XPG4, ed è stata introdotta in Linux come system
313   call a partire dal kernel 2.1.23 ed inserita nelle \acr{libc} 5.4.28.} il
314 cui prototipo è:
315 \begin{prototype}{sys/poll.h}
316   {int poll(struct pollfd *ufds, unsigned int nfds, int timeout)}
317   
318   La funzione attende un cambiamento di stato per uno dei file descriptor
319   specificati da \param{ufds}.
320   
321   \bodydesc{La funzione restituisce il numero di file descriptor con attività
322     in caso di successo, o 0 se c'è stato un timeout; in caso di errore viene
323     restituito -1 ed \var{errno} assumerà uno dei valori:
324   \begin{errlist}
325   \item[\errcode{EBADF}] Si è specificato un file descriptor sbagliato in uno
326     degli insiemi.
327   \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
328   \item[\errcode{EINVAL}] Il valore di \param{nfds} eccede il limite
329     \macro{RLIMIT\_NOFILE}.
330   \end{errlist}
331   ed inoltre \errval{EFAULT} e \errval{ENOMEM}.}
332 \end{prototype}
333
334 La funzione permette di tenere sotto controllo contemporaneamente \param{ndfs}
335 file descriptor, specificati attraverso il puntatore \param{ufds} ad un
336 vettore di strutture \struct{pollfd}.  Come con \func{select} si può
337 interrompere l'attesa dopo un certo tempo, questo deve essere specificato con
338 l'argomento \param{timeout} in numero di millisecondi: un valore negativo
339 indica un'attesa indefinita, mentre un valore comporta il ritorno immediato (e
340 può essere utilizzato per impiegare \func{poll} in modalità
341 \textsl{non-bloccante}).
342
343 \begin{figure}[!htb]
344   \footnotesize \centering
345   \begin{minipage}[c]{15cm}
346     \includestruct{listati/pollfd.h}
347   \end{minipage} 
348   \normalsize 
349   \caption{La struttura \structd{pollfd}, utilizzata per specificare le
350     modalità di controllo di un file descriptor alla funzione \func{poll}.}
351   \label{fig:file_pollfd}
352 \end{figure}
353
354 Per ciascun file da controllare deve essere inizializzata una struttura
355 \struct{pollfd} nel vettore indicato dall'argomento \param{ufds}.  La
356 struttura, la cui definizione è riportata in \figref{fig:file_pollfd}, prevede
357 tre campi: in \var{fd} deve essere indicato il numero del file descriptor da
358 controllare, in \var{events} deve essere specificata una maschera binaria di
359 flag che indichino il tipo di evento che si vuole controllare, mentre in
360 \var{revents} il kernel restituirà il relativo risultato.  Usando un valore
361 negativo per \param{fd} la corrispondente struttura sarà ignorata da
362 \func{poll}. Dato che i dati in ingresso sono del tutto indipendenti da quelli
363 in uscita (che vengono restituiti in \var{revents}) non è necessario
364 reinizializzare tutte le volte il valore delle strutture \struct{pollfd} a
365 meno di non voler cambiare qualche condizione.
366
367 Le costanti che definiscono i valori relativi ai bit usati nelle maschere
368 binarie dei campi \var{events} e \var{revents} sono riportati in
369 \tabref{tab:file_pollfd_flags}, insieme al loro significato. Le si sono
370 suddivise in tre gruppi, nel primo gruppo si sono indicati i bit utilizzati
371 per controllare l'attività in ingresso, nel secondo quelli per l'attività in
372 uscita, mentre il terzo gruppo contiene dei valori che vengono utilizzati solo
373 nel campo \var{revents} per notificare delle condizioni di errore. 
374
375 \begin{table}[htb]
376   \centering
377   \footnotesize
378   \begin{tabular}[c]{|l|l|}
379     \hline
380     \textbf{Flag}  & \textbf{Significato} \\
381     \hline
382     \hline
383     \const{POLLIN}    & È possibile la lettura.\\
384     \const{POLLRDNORM}& Sono disponibili in lettura dati normali.\\ 
385     \const{POLLRDBAND}& Sono disponibili in lettura dati prioritari. \\
386     \const{POLLPRI}   & È possibile la lettura di dati urgenti.\\
387     \hline
388     \const{POLLOUT}   & È possibile la scrittura immediata.\\
389     \const{POLLWRNORM}& È possibile la scrittura di dati normali.  \\ 
390     \const{POLLWRBAND}& È possibile la scrittura di dati prioritari. \\
391     \hline
392     \const{POLLERR}   & C'è una condizione di errore.\\
393     \const{POLLHUP}   & Si è verificato un hung-up.\\
394     \const{POLLNVAL}  & Il file descriptor non è aperto.\\
395     \hline
396     \const{POLLMSG}   & Definito per compatobilità con SysV.\\
397     \hline    
398   \end{tabular}
399   \caption{Costanti per l'identificazione dei vari bit dei campi
400     \var{events} e \var{revents} di \struct{pollfd}.}
401   \label{tab:file_pollfd_flags}
402 \end{table}
403
404 Il valore \const{POLLMSG} non viene utilizzato ed è definito solo per
405 compatibilità con l'implementazione di SysV che usa gli
406 \textit{stream};\footnote{essi sono una interfaccia specifica di SysV non
407   presente in Linux, e non hanno nulla a che fare con i file \textit{stream}
408   delle librerie standard del C.} è da questi che derivano i nomi di alcune
409 costanti, in quanto per essi sono definite tre classi di dati:
410 \textsl{normali}, \textit{prioritari} ed \textit{urgenti}.}  In Linux la
411 distinzione ha senso solo per i dati \textit{out-of-band} dei socket (vedi
412 \secref{sec:TCP_urgent_data}), ma su questo e su come \func{poll} reagisce
413 alle varie condizioni dei socket torneremo in \secref{sec:TCP_serv_poll}, dove
414 vedremo anche un esempio del suo utilizzo. Si tenga conto comunque che le
415 costanti relative ai diversi tipi di dati (come \macro{POLLRDNORM} e
416 \macro{POLLRDBAND}) sono utilizzabili soltanto qualora si sia definito
417 \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di farlo sempre in testa al
418   file, definirla soltanto prima di includere \file{sys/poll.h} non è
419   sufficiente.}
420
421 In caso di successo funzione ritorna restituendo il numero di file (un valore
422 positivo) per i quali si è verificata una delle condizioni di attesa richieste
423 o per i quali si è verificato un errore (nel qual caso vengono utilizzati i
424 valori di \tabref{tab:file_pollfd_flags} esclusivi di \var{revents}). Un
425 valore nullo indica che si è raggiunto il timeout, mentre un valore negativo
426 indica un errore nella chiamata, il cui codice viene riportato al solito
427 tramite \var{errno}.
428
429
430 %\subsection{L'interfaccia di \textit{epoll}}
431 %\label{sec:file_epoll}
432 % placeholder ...
433
434 %da fare
435
436 \section{Altre modalità e funzioni di I/O avanzato}
437 \label{sec:file_advanced_io}
438
439 Benché l'\textit{I/O multiplexing} sia stata la prima, e sia tutt'ora una fra
440 le più diffuse modalità di gestire l'I/O in situazioni complesse che
441 coivolgono molti file, esistono altre modalità di gestione delle stesse
442 problematiche, oltre che differenti interfacce per la gestione di altre
443 problematiche avanzate riguardanti l'I/O su file, tratteremo tutto ciò in
444 questa sezione.
445
446
447 \subsection{L'apertura asincrona dei file}
448 \label{sec:file_asyncronous_open}
449
450 Una modalità alternativa all'uso dell'\textit{I/O multiplexing} per gestione
451 dell'I/O simultaneo su molti file, è costituita dal cosiddetto \textsl{I/O
452   asincrono}. Il concetto base dell'\textsl{I/O asincrono} è che le funzioni
453 di I/O non attendono il completamento delle operazioni prima di ritornare,
454 così che il processo non viene bloccato.  In questo modo diventa ad esempio
455 possibile effettuare una richiesta preventiva di dati, in modo da poter
456 effettuare in contemporanea le operazioni di calcolo e quelle di I/O.
457
458 Abbiamo accennato in \secref{sec:file_open} che è possibile, attraverso l'uso
459 del flag \const{O\_ASYNC},\footnote{l'uso del flag di \const{O\_ASYNC} e dei
460   comandi \const{F\_SETOWN} e \const{F\_GETOWN} per \func{fcntl} è specifico
461   di Linux e BSD.} aprire un file in modalità asincrona, così come è possibile
462 attivare in un secondo tempo questa modalità impostando questo flag attraverso
463 l'uso di \func{fcntl} con il comando \const{F\_SETFL} (vedi
464 \secref{sec:file_fcntl}). 
465
466 In realtà in questo caso non si tratta di I/O asincrono vero e proprio (che
467 vedremo in \secref{sec:file_asyncronous_io}), quanto di un meccanismo
468 asincrono di notifica delle variazione dello stato del file descriptor; quello
469 che succede è che il sistema genera un segnale (normalmente \const{SIGIO}, ma
470 è possibile usarne altri) tutte le volte che diventa possibile leggere o
471 scrivere dal file descriptor che si è posto in questa modalità. Si può inoltre
472 selezionare, con il comando \const{F\_SETOWN} di \func{fcntl}, quale processo
473 (o gruppo di processi) riceverà il segnale. Se pertanto si effettuano le
474 operazioni in risposta alla ricezione del segnale non ci sarà più la necessità
475 di restare bloccati in attesa della disponibilità di accesso ai file.
476
477 In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select}
478 che, quando vengono usate con un numero molto grande di file descriptor, non
479 hanno buone prestazioni. % aggiungere cenno a epoll quando l'avrò scritta
480  In tal caso infatti la maggior parte del loro tempo
481 di esecuzione è impegnato ad eseguire una scansione su tutti i file descriptor
482 tenuti sotto controllo per determinare quali di essi (in genere una piccola
483 percentuale) sono diventati attivi.
484
485 Tuttavia con l'implementazione classica dei segnali questa modalità di I/O
486 presenta notevoli problemi, dato che non è possibile determinare, quando sono
487 più di uno, qual'è il file descriptor responsabile dell'emissione del segnale.
488 Linux però supporta le estensioni POSIX.1b dei segnali che permettono di
489 superare il problema facendo ricorso alle informazioni aggiuntive restituite
490 attraverso la struttura \struct{siginfo\_t}, utilizzando la forma estesa
491 \var{sa\_sigaction} del gestore (si riveda quanto illustrato in
492 \secref{sec:sig_sigaction}).
493
494 Per far questo però occorre utilizzare le funzionalità dei segnali real-time
495 (vedi \secref{sec:sig_real_time}) impostando esplicitamente con il comando
496 \const{F\_SETSIG} di \func{fcntl} un segnale real-time da inviare in caso di
497 I/O asincrono (il segnale predefinito è \const{SIGIO}). In questo caso il
498 gestore tutte le volte che riceverà \const{SI\_SIGIO} come valore del
499 campo \var{si\_code}\footnote{il valore resta \const{SI\_SIGIO} qualunque sia
500   il segnale che si è associato all'I/O asincrono, ed indica appunto che il
501   segnale è stato generato a causa di attività nell'I/O asincrono.} di
502 \struct{siginfo\_t}, troverà nel campo \var{si\_fd} il valore del file
503 descriptor che ha generato il segnale.
504
505 Un secondo vantaggio dell'uso dei segnali real-time è che essendo dotati di
506 una coda di consegna ogni segnale sarà associato ad uno solo file descriptor;
507 inoltre sarà possibile stabilire delle priorità nella risposta a seconda del
508 segnale usato. In questo modo si può identificare immediatamente un file su
509 cui l'accesso è diventato possibile evitando completamente l'uso di funzioni
510 come \func{poll} e \func{select}, almeno fintanto che non si satura la coda;
511 si eccedono le dimensioni di quest'ultima; in tal caso infatti il kernel, non
512 potendo più assicurare il comportamento corretto per un segnale real-time,
513 invierà al suo posto un \const{SIGIO}, su cui si accumuleranno tutti i segnali
514 in eccesso, e si dovrà determinare al solito modo quali sono i file diventati
515 attivi.
516
517 \subsection{L'interfaccia POSIX per l'I/O asincrono}
518 \label{sec:file_asyncronous_io}
519
520 Benché la modalità di apertura asincrona di un file possa risultare utile in
521 varie occasioni (in particolar modo con i socket\index{socket} e gli altri
522 file per i quali le funzioni di I/O sono system call lente), essa è comunque
523 limitata alla notifica della disponibilità del file descriptor per le
524 operazioni di I/O, e non ad uno svolgimento asincrono delle medesime.  Lo
525 standard POSIX.1b definisce anche una interfaccia apposita per l'I/O
526 asincrono, che prevede un insieme di funzioni dedicate, completamente separate
527 rispetto a quelle usate normalmente.
528
529 In generale questa interfaccia è completamente astratta e può essere
530 implementata sia direttamente nel kernel, che in user space attraverso l'uso
531 di thread. Al momento esiste una sola versione stabile di questa interfaccia,
532 quella delle \acr{glibc}, che è realizzata completamente in user space, ed
533 accessibile linkando i programmi con la libreria \file{librt}. Nei kernel
534 della nuova serie è stato anche introdotta (a partire dal 2.5.32) un nuovo
535 layer per l'I/O asincrono.
536
537 Lo standard prevede che tutte le operazioni di I/O asincrono siano controllate
538 attraverso l'uso di una apposita struttura \struct{aiocb} (il cui nome sta per
539 \textit{asyncronous I/O control block}), che viene passata come argomento a
540 tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in
541 \file{aio.h}, è riportata in \figref{fig:file_aiocb}. Nello steso file è
542 definita la macro \macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la
543 disponibilità dell'interfaccia per l'I/O asincrono.
544
545 \begin{figure}[!htb]
546   \footnotesize \centering
547   \begin{minipage}[c]{15cm}
548     \includestruct{listati/aiocb.h}
549   \end{minipage} 
550   \normalsize 
551   \caption{La struttura \structd{aiocb}, usata per il controllo dell'I/O
552     asincrono.}
553   \label{fig:file_aiocb}
554 \end{figure}
555
556 Le operazioni di I/O asincrono possono essere effettuate solo su un file già
557 aperto; il file deve inoltre supportare la funzione \func{lseek}, pertanto
558 terminali e pipe sono esclusi. Non c'è limite al numero di operazioni
559 contemporanee effettuabili su un singolo file.  Ogni operazione deve
560 inizializzare opportunamente un \textit{control block}.  Il file descriptor su
561 cui operare deve essere specificato tramite il campo \var{aio\_fildes}; dato
562 che più operazioni possono essere eseguita in maniera asincrona, il concetto
563 di posizione corrente sul file viene a mancare; pertanto si deve sempre
564 specificare nel campo \var{aio\_offset} la posizione sul file da cui i dati
565 saranno letti o scritti.  Nel campo \var{aio\_buf} deve essere specificato
566 l'indirizzo del buffer usato per l'I/O, ed in \var{aio\_nbytes} la lunghezza
567 del blocco di dati da trasferire.
568
569 Il campo \var{aio\_reqprio} permette di impostare la priorità delle operazioni
570 di I/O.\footnote{in generale perché ciò sia possibile occorre che la
571   piattaforma supporti questa caratteristica, questo viene indicato definendo
572   le macro \macro{\_POSIX\_PRIORITIZED\_IO}, e
573   \macro{\_POSIX\_PRIORITY\_SCHEDULING}.} La priorità viene impostata a
574 partire da quella del processo chiamante (vedi \secref{sec:proc_priority}),
575 cui viene sottratto il valore di questo campo.  Il campo
576 \var{aio\_lio\_opcode} è usato solo dalla funzione \func{lio\_listio}, che,
577 come vedremo, permette di eseguire con una sola chiamata una serie di
578 operazioni, usando un vettore di \textit{control block}. Tramite questo campo
579 si specifica quale è la natura di ciascuna di esse.
580
581 \begin{figure}[!htb]
582   \footnotesize \centering
583   \begin{minipage}[c]{15cm}
584     \includestruct{listati/sigevent.h}
585   \end{minipage} 
586   \normalsize 
587   \caption{La struttura \structd{sigevent}, usata per specificare le modalità
588     di notifica degli eventi relativi alle operazioni di I/O asincrono.}
589   \label{fig:file_sigevent}
590 \end{figure}
591
592 Infine il campo \var{aio\_sigevent} è una struttura di tipo \struct{sigevent}
593 che serve a specificare il modo in cui si vuole che venga effettuata la
594 notifica del completamento delle operazioni richieste. La struttura è
595 riportata in \secref{fig:file_sigevent}; il campo \var{sigev\_notify} è quello
596 che indica le modalità della notifica, esso può assumere i tre valori:
597 \begin{basedescript}{\desclabelwidth{2.6cm}}
598 \item[\const{SIGEV\_NONE}]  Non viene inviata nessuna notifica.
599 \item[\const{SIGEV\_SIGNAL}] La notifica viene effettuata inviando al processo
600   chiamante il segnale specificato da \var{sigev\_signo}; se il gestore di
601   questo è stato installato con \const{SA\_SIGINFO} gli verrà restituito il
602   valore di \var{sigev\_value} (la cui definizione è in
603   \figref{fig:sig_sigval}) come valore del campo \var{si\_value} di
604   \struct{siginfo\_t}.
605 \item[\const{SIGEV\_THREAD}] La notifica viene effettuata creando un nuovo
606   thread che esegue la funzione specificata da \var{sigev\_notify\_function}
607   con argomento \var{sigev\_value}, e con gli attributi specificati da
608   \var{sigev\_notify\_attribute}.
609 \end{basedescript}
610
611 Le due funzioni base dell'interfaccia per l'I/O asincrono sono
612 \funcd{aio\_read} ed \funcd{aio\_write}.  Esse permettono di richiedere una
613 lettura od una scrittura asincrona di dati, usando la struttura \struct{aiocb}
614 appena descritta; i rispettivi prototipi sono:
615 \begin{functions}
616   \headdecl{aio.h}
617
618   \funcdecl{int aio\_read(struct aiocb *aiocbp)}
619   Richiede una lettura asincrona secondo quanto specificato con \param{aiocbp}.
620
621   \funcdecl{int aio\_write(struct aiocb *aiocbp)}
622   Richiede una scrittura asincrona secondo quanto specificato con
623   \param{aiocbp}.
624   
625   \bodydesc{Le funzioni restituiscono 0 in caso di successo, e -1 in caso di
626     errore, nel qual caso \var{errno} assumerà uno dei valori:
627   \begin{errlist}
628   \item[\errcode{EBADF}] Si è specificato un file descriptor sbagliato.
629   \item[\errcode{ENOSYS}] La funzione non è implementata.
630   \item[\errcode{EINVAL}] Si è specificato un valore non valido per i campi
631     \var{aio\_offset} o \var{aio\_reqprio} di \param{aiocbp}.
632   \item[\errcode{EAGAIN}] La coda delle richieste è momentaneamente piena.
633   \end{errlist}
634 }
635 \end{functions}
636
637 Entrambe le funzioni ritornano immediatamente dopo aver messo in coda la
638 richiesta, o in caso di errore. Non è detto che gli errori \errcode{EBADF} ed
639 \errcode{EINVAL} siano rilevati immediatamente al momento della chiamata,
640 potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e
641 scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che
642 il file non sia stato aperto in \textit{append mode} (vedi
643 \secref{sec:file_open}), nel qual caso le scritture vengono effettuate
644 comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}.
645
646 Si tenga inoltre presente che deallocare la memoria indirizzata da
647 \param{aiocbp} o modificarne i valori prima della conclusione di una
648 operazione può dar luogo a risultati impredicibili, perché l'accesso ai vari
649 campi per eseguire l'operazione può avvenire in un momento qualsiasi dopo la
650 richiesta.  Questo comporta che non si devono usare per \param{aiocbp}
651 variabili automatiche e che non si deve riutilizzare la stessa struttura per
652 un'altra operazione fintanto che la precedente non sia stata ultimata. In
653 generale per ogni operazione si deve utilizzare una diversa struttura
654 \struct{aiocb}.
655
656 Dato che si opera in modalità asincrona, il successo di \func{aio\_read} o
657 \func{aio\_write} non implica che le operazioni siano state effettivamente
658 eseguite in maniera corretta; per verificarne l'esito l'interfaccia prevede
659 altre due funzioni, che permettono di controllare lo stato di esecuzione. La
660 prima è \funcd{aio\_error}, che serve a determinare un eventuale stato di
661 errore; il suo prototipo è:
662 \begin{prototype}{aio.h}
663   {int aio\_error(const struct aiocb *aiocbp)}  
664
665   Determina lo stato di errore delle operazioni di I/O associate a
666   \param{aiocbp}.
667   
668   \bodydesc{La funzione restituisce 0 se le operazioni si sono concluse con
669     successo, altrimenti restituisce il codice di errore relativo al loro
670     fallimento.}
671 \end{prototype}
672
673 Se l'operazione non si è ancora completata viene restituito l'errore di
674 \errcode{EINPROGRESS}. La funzione ritorna zero quando l'operazione si è
675 conclusa con successo, altrimenti restituisce il codice dell'errore
676 verificatosi, ed esegue la corrispondente impostazione di \var{errno}. Il
677 codice può essere sia \errcode{EINVAL} ed \errcode{EBADF}, dovuti ad un valore
678 errato per \param{aiocbp}, che uno degli errori possibili durante l'esecuzione
679 dell'operazione di I/O richiesta, nel qual caso saranno restituiti, a seconda
680 del caso, i codici di errore delle system call \func{read}, \func{write} e
681 \func{fsync}.
682
683 Una volta che si sia certi che le operazioni siano state concluse (cioè dopo
684 che una chiamata ad \func{aio\_error} non ha restituito
685 \errcode{EINPROGRESS}), si potrà usare la funzione \funcd{aio\_return}, che
686 permette di verificare il completamento delle operazioni di I/O asincrono; il
687 suo prototipo è:
688 \begin{prototype}{aio.h}
689 {ssize\_t aio\_return(const struct aiocb *aiocbp)} 
690
691 Recupera il valore dello stato di ritorno delle operazioni di I/O associate a
692 \param{aiocbp}.
693   
694 \bodydesc{La funzione restituisce lo stato di uscita dell'operazione
695   eseguita.}
696 \end{prototype}
697
698 La funzione deve essere chiamata una sola volte per ciascuna operazione
699 asincrona, essa infatti fa sì che il sistema rilasci le risorse ad essa
700 associate. É per questo motivo che occorre chiamare la funzione solo dopo che
701 l'operazione cui \param{aiocbp} fa riferimento si è completata. Una chiamata
702 precedente il completamento delle operazioni darebbe risultati indeterminati.
703
704 La funzione restituisce il valore di ritorno relativo all'operazione eseguita,
705 così come ricavato dalla sottostante system call (il numero di byte letti,
706 scritti o il valore di ritorno di \func{fsync}).  É importante chiamare sempre
707 questa funzione, altrimenti le risorse disponibili per le operazioni di I/O
708 asincrono non verrebbero liberate, rischiando di arrivare ad un loro
709 esaurimento.
710
711 Oltre alle operazioni di lettura e scrittura l'interfaccia POSIX.1b mette a
712 disposizione un'altra operazione, quella di sincronizzazione dell'I/O,
713 compiuta dalla funzione \func{aio\_fsync}, che ha lo stesso effetto della
714 analoga \func{fsync}, ma viene eseguita in maniera asincrona; il suo prototipo
715 è:
716 \begin{prototype}{aio.h}
717 {ssize\_t aio\_return(int op, struct aiocb *aiocbp)} 
718
719 Richiede la sincronizzazione dei dati per il file indicato da \param{aiocbp}.
720   
721 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
722   errore, che può essere, con le stesse modalità di \func{aio\_read},
723   \errval{EAGAIN}, \errval{EBADF} o \errval{EINVAL}.}
724 \end{prototype}
725
726 La funzione richiede la sincronizzazione delle operazioni di I/O, ritornando
727 immediatamente. L'esecuzione effettiva della sincronizzazione dovrà essere
728 verificata con \func{aio\_error} e \func{aio\_return} come per le operazioni
729 di lettura e scrittura. L'argomento \param{op} permette di indicare la
730 modalità di esecuzione, se si specifica il valore \const{O\_DSYNC} le
731 operazioni saranno completate con una chiamata a \func{fdatasync}, se si
732 specifica \const{O\_SYNC} con una chiamata a \func{fsync} (per i dettagli vedi
733 \secref{sec:file_sync}).
734
735 Il successo della chiamata assicura la sincronizzazione delle operazioni fino
736 allora richieste, niente è garantito riguardo la sincronizzazione dei dati
737 relativi ad eventuali operazioni richieste successivamente. Se si è
738 specificato un meccanismo di notifica questo sarà innescato una volta che le
739 operazioni di sincronizzazione dei dati saranno completate.
740
741 In alcuni casi può essere necessario interrompere le operazioni (in genere
742 quando viene richiesta un'uscita immediata dal programma), per questo lo
743 standard POSIX.1b prevede una funzioni apposita, \funcd{aio\_cancel}, che
744 permette di cancellare una operazione richiesta in precedenza; il suo
745 prototipo è:
746 \begin{prototype}{aio.h}
747 {int aio\_cancel(int fildes, struct aiocb *aiocbp)} 
748
749 Richiede la cancellazione delle operazioni sul file \param{fildes} specificate
750 da \param{aiocbp}.
751   
752 \bodydesc{La funzione restituisce il risultato dell'operazione con un codice
753   di positivo, e -1 in caso di errore, che avviene qualora si sia specificato
754   un valore non valido di \param{fildes}, imposta \var{errno} al valore
755   \errval{EBADF}.}
756 \end{prototype}
757
758 La funzione permette di cancellare una operazione specifica sul file
759 \param{fildes}, o tutte le operazioni pendenti, specificando \val{NULL} come
760 valore di \param{aiocbp}.  Quando una operazione viene cancellata una
761 successiva chiamata ad \func{aio\_error} riporterà \errcode{ECANCELED} come
762 codice di errore, ed il suo codice di ritorno sarà -1, inoltre il meccanismo
763 di notifica non verrà invocato. Se si specifica una operazione relativa ad un
764 altro file descriptor il risultato è indeterminato.
765
766 In caso di successo, i possibili valori di ritorno per \func{aio\_cancel} sono
767 tre (anch'essi definiti in \file{aio.h}):
768 \begin{basedescript}{\desclabelwidth{3.0cm}}
769 \item[\const{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la
770   cancellazione sono state già completate,
771   
772 \item[\const{AIO\_CANCELED}] indica che tutte le operazioni richieste sono
773   state cancellate,  
774   
775 \item[\const{AIO\_NOTCANCELED}] indica che alcune delle operazioni erano in
776   corso e non sono state cancellate.
777 \end{basedescript}
778
779 Nel caso si abbia \const{AIO\_NOTCANCELED} occorrerà chiamare
780 \func{aio\_error} per determinare quali sono le operazioni effettivamente
781 cancellate. Le operazioni che non sono state cancellate proseguiranno il loro
782 corso normale, compreso quanto richiesto riguardo al meccanismo di notifica
783 del loro avvenuto completamento.
784
785 Benché l'I/O asincrono preveda un meccanismo di notifica, l'interfaccia
786 fornisce anche una apposita funzione, \funcd{aio\_suspend}, che permette di
787 sospendere l'esecuzione del processo chiamante fino al completamento di una
788 specifica operazione; il suo prototipo è:
789 \begin{prototype}{aio.h}
790 {int aio\_suspend(const struct aiocb * const list[], int nent, const struct
791     timespec *timeout)}
792   
793   Attende, per un massimo di \param{timeout}, il completamento di una delle
794   operazioni specificate da \param{list}.
795   
796   \bodydesc{La funzione restituisce 0 se una (o più) operazioni sono state
797     completate, e -1 in caso di errore nel qual caso \var{errno} assumerà uno
798     dei valori:
799     \begin{errlist}
800     \item[\errcode{EAGAIN}] Nessuna operazione è stata completata entro
801       \param{timeout}.
802     \item[\errcode{ENOSYS}] La funzione non è implementata.
803     \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
804     \end{errlist}
805   }
806 \end{prototype}
807
808 La funzione permette di bloccare il processo fintanto che almeno una delle
809 \param{nent} operazioni specificate nella lista \param{list} è completata, per
810 un tempo massimo specificato da \param{timout}, o fintanto che non arrivi un
811 segnale.\footnote{si tenga conto che questo segnale può anche essere quello
812   utilizzato come meccanismo di notifica.} La lista deve essere inizializzata
813 con delle strutture \struct{aiocb} relative ad operazioni effettivamente
814 richieste, ma può contenere puntatori nulli, che saranno ignorati. In caso si
815 siano specificati valori non validi l'effetto è indefinito.  Un valore
816 \val{NULL} per \param{timout} comporta l'assenza di timeout.
817
818 Lo standard POSIX.1b infine ha previsto pure una funzione, \funcd{lio\_listio},
819 che permette di effettuare la richiesta di una intera lista di operazioni di
820 lettura o scrittura; il suo prototipo è:
821 \begin{prototype}{aio.h}
822   {int lio\_listio(int mode, struct aiocb * const list[], int nent, struct
823     sigevent *sig)}
824   
825   Richiede l'esecuzione delle operazioni di I/O elencata da \param{list},
826   secondo la modalità \param{mode}.
827   
828   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
829     errore, nel qual caso \var{errno} assumerà uno dei valori:
830     \begin{errlist}
831     \item[\errcode{EAGAIN}] Nessuna operazione è stata completata entro
832       \param{timeout}.
833     \item[\errcode{EINVAL}] Si è passato un valore di \param{mode} non valido
834       o un numero di operazioni \param{nent} maggiore di
835       \const{AIO\_LISTIO\_MAX}.
836     \item[\errcode{ENOSYS}] La funzione non è implementata.
837     \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale.
838     \end{errlist}
839   }
840 \end{prototype}
841
842 La funzione esegue la richiesta delle \param{nent} operazioni indicate dalla
843 lista \param{list}; questa deve contenere gli indirizzi di altrettanti
844 \textit{control block}, opportunamente inizializzati; in particolare nel caso
845 dovrà essere specificato il tipo di operazione tramite il campo
846 \var{aio\_lio\_opcode}, che può prendere i tre valori:
847 \begin{basedescript}{\desclabelwidth{2.0cm}}
848 \item[\const{LIO\_READ}]  si richiede una operazione di lettura.
849 \item[\const{LIO\_WRITE}] si richiede una operazione di scrittura.
850 \item[\const{LIO\_NOP}] non si effettua nessuna operazione.
851 \end{basedescript}
852 l'ultimo valore viene usato quando si ha a che fare con un vettore di
853 dimensione fissa, per poter specificare solo alcune operazioni, o quando si è
854 dovuto cancellare delle operazioni e si deve ripetere la richiesta per quelle
855 non completate.
856
857 L'argomento \param{mode} permette di stabilire il comportamento della
858 funzione, se viene specificato il valore \const{LIO\_WAIT} la funzione si
859 blocca fino al completamento di tutte le operazioni richieste; se invece si
860 specifica \const{LIO\_NOWAIT} la funzione ritorna immediatamente dopo aver
861 messo in coda tutte le richieste. In questo caso il chiamante può richiedere
862 la notifica del completamento di tutte le richieste, impostando l'argomento
863 \param{sig} in maniera analoga a come si fa per il campo \var{aio\_sigevent}
864 di \struct{aiocb}.
865
866
867
868 \subsection{I/O vettorizzato}
869 \label{sec:file_multiple_io}
870
871 Un caso abbastanza comune è quello in cui ci si trova a dover eseguire una
872 serie multipla di operazioni di I/O, come una serie di letture o scritture di
873 vari buffer. Un esempio tipico è quando i dati sono strutturati nei campi di
874 una struttura ed essi devono essere caricati o salvati su un file.  Benché
875 l'operazione sia facilmente eseguibile attraverso una serie multipla di
876 chiamate, ci sono casi in cui si vuole poter contare sulla atomicità delle
877 operazioni.
878
879 Per questo motivo BSD 4.2\footnote{Le due funzioni sono riprese da BSD4.4 ed
880   integrate anche dallo standard Unix 98. Fino alle libc5, Linux usava
881   \type{size\_t} come tipo dell'argomento \param{count}, una scelta logica,
882   che però è stata dismessa per restare aderenti allo standard.} ha introdotto
883 due nuove system call, \funcd{readv} e \funcd{writev}, che permettono di
884 effettuare con una sola chiamata una lettura o una scrittura su una serie di
885 buffer (quello che viene chiamato \textsl{I/O vettorizzato}. I relativi
886 prototipi sono:
887 \begin{functions}
888   \headdecl{sys/uio.h}
889   
890   \funcdecl{int readv(int fd, const struct iovec *vector, int count)} Esegue
891   una lettura vettorizzata da \param{fd} nei \param{count} buffer specificati
892   da \param{vector}.
893   
894   \funcdecl{int writev(int fd, const struct iovec *vector, int count)} Esegue
895   una scrittura vettorizzata da \param{fd} nei \param{count} buffer
896   specificati da \param{vector}.
897   
898   \bodydesc{Le funzioni restituiscono il numero di byte letti o scritti in
899     caso di successo, e -1 in caso di errore, nel qual caso \var{errno}
900     assumerà uno dei valori:
901   \begin{errlist}
902   \item[\errcode{EBADF}] si è specificato un file descriptor sbagliato.
903   \item[\errcode{EINVAL}] si è specificato un valore non valido per uno degli
904     argomenti (ad esempio \param{count} è maggiore di \const{MAX\_IOVEC}).
905   \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale prima di
906     di avere eseguito una qualunque lettura o scrittura.
907   \item[\errcode{EAGAIN}] \param{fd} è stato aperto in modalità non bloccante e
908   non ci sono dati in lettura.
909   \item[\errcode{EOPNOTSUPP}] La coda delle richieste è momentaneamente piena.
910   \end{errlist}
911   ed inoltre \errval{EISDIR}, \errval{ENOMEM}, \errval{EFAULT} (se non sono
912   stato allocati correttamente i buffer specificati nei campi
913   \func{iov\_base}), più tutti gli ulteriori errori che potrebbero avere le
914   usuali funzioni di lettura e scrittura eseguite su \param{fd}.}
915 \end{functions}
916
917 Entrambe le funzioni usano una struttura \struct{iovec}, definita in
918 \figref{fig:file_iovec}, che definisce dove i dati devono essere letti o
919 scritti. Il primo campo, \var{iov\_base}, contiene l'indirizzo del buffer ed
920 il secondo, \var{iov\_len}, la dimensione dello stesso. 
921
922 \begin{figure}[!htb]
923   \footnotesize \centering
924   \begin{minipage}[c]{15cm}
925     \includestruct{listati/iovec.h}
926   \end{minipage} 
927   \normalsize 
928   \caption{La struttura \structd{iovec}, usata dalle operazioni di I/O
929     vettorizzato.} 
930   \label{fig:file_iovec}
931 \end{figure}
932
933 I buffer da utilizzare sono indicati attraverso l'argomento \param{vector} che
934 è un vettore di strutture \struct{iovec}, la cui lunghezza è specificata da
935 \param{count}.  Ciascuna struttura dovrà essere inizializzata per
936 opportunamente per indicare i vari buffer da/verso i quali verrà eseguito il
937 trasferimento dei dati. Essi verranno letti (o scritti) nell'ordine in cui li
938 si sono specificati nel vettore \param{vector}.
939
940
941 \subsection{File mappati in memoria}
942 \label{sec:file_memory_map}
943
944 Una modalità alternativa di I/O, che usa una interfaccia completamente diversa
945 rispetto a quella classica vista in \capref{cha:file_unix_interface}, è il
946 cosiddetto \textit{memory-mapped I/O}, che, attraverso il meccanismo della
947 \textsl{paginazione}\index{paginazione} usato dalla memoria virtuale (vedi
948 \secref{sec:proc_mem_gen}), permette di \textsl{mappare} il contenuto di un
949 file in una sezione dello spazio di indirizzi del processo. Il meccanismo è
950 illustrato in \figref{fig:file_mmap_layout}, una sezione del file viene
951 riportata direttamente nello spazio degli indirizzi del programma. Tutte le
952 operazioni su questa zona verranno riportate indietro sul file dal meccanismo
953 della memoria virtuale che trasferirà il contenuto di quel segmento sul file
954 invece che nella swap, per cui si può parlare tanto di file mappato in
955 memoria, quanto di memoria mappata su file.
956
957 \begin{figure}[htb]
958   \centering
959   \includegraphics[width=7.cm]{img/mmap_layout}
960   \caption{Disposizione della memoria di un processo quando si esegue la
961   mappatura in memoria di un file.}
962   \label{fig:file_mmap_layout}
963 \end{figure}
964
965 Tutto questo comporta una notevole semplificazione delle operazioni di I/O, in
966 quanto non sarà più necessario utilizzare dei buffer intermedi su cui
967 appoggiare i dati da traferire, ma questi potranno essere acceduti
968 direttamente nella sezione di memoria mappata; inoltre questa interfaccia è
969 più efficiente delle usuali funzioni di I/O, in quanto permette di caricare in
970 memoria solo le parti del file che sono effettivamente usate ad un dato
971 istante.
972
973 Infatti, dato che l'accesso è fatto direttamente attraverso la memoria
974 virtuale, la sezione di memoria mappata su cui si opera sarà a sua volta letta
975 o scritta sul file una pagina alla volta e solo per le parti effettivamente
976 usate, il tutto in maniera completamente trasparente al processo; l'accesso
977 alle pagine non ancora caricate avverrà allo stesso modo con cui vengono
978 caricate in memoria le pagine che sono state salvate sullo swap.  Infine in
979 situazioni in cui la memoria è scarsa, le pagine che mappano un file vengono
980 salvate automaticamente, così come le pagine dei programmi vengono scritte
981 sulla swap; questo consente di accedere ai file su dimensioni il cui solo
982 limite è quello dello spazio di indirizzi disponibile, e non della memoria su
983 cui possono esserne lette delle porzioni.
984
985 L'interfaccia prevede varie funzioni per la gestione del \textit{memory mapped
986   I/O}, la prima di queste è \funcd{mmap}, che serve ad eseguire la mappatura
987 in memoria di un file; il suo prototipo è:
988 \begin{functions}
989   
990   \headdecl{unistd.h}
991   \headdecl{sys/mman.h} 
992
993   \funcdecl{void * mmap(void * start, size\_t length, int prot, int flags, int
994     fd, off\_t offset)}
995   
996   Esegue la mappatura in memoria del file \param{fd}.
997   
998   \bodydesc{La funzione restituisce il puntatore alla zona di memoria mappata
999     in caso di successo, e \const{MAP\_FAILED} (-1) in caso di errore, nel
1000     qual caso \var{errno} assumerà uno dei valori:
1001     \begin{errlist}
1002     \item[\errcode{EBADF}] Il file descriptor non è valido, e non si è usato
1003       \const{MAP\_ANONYMOUS}.
1004     \item[\errcode{EACCES}] o \param{fd} non si riferisce ad un file regolare,
1005       o si è usato \const{MAP\_PRIVATE} ma \param{fd} non è aperto in lettura,
1006       o si è usato \const{MAP\_SHARED} e impostato \const{PROT\_WRITE} ed
1007       \param{fd} non è aperto in lettura/scrittura, o si è impostato
1008       \const{PROT\_WRITE} ed \param{fd} è in \textit{append-only}.
1009     \item[\errcode{EINVAL}] I valori di \param{start}, \param{length} o
1010       \param{offset} non sono validi (o troppo grandi o non allineati sulla
1011       dimensione delle pagine).
1012     \item[\errcode{ETXTBSY}] Si è impostato \const{MAP\_DENYWRITE} ma
1013       \param{fd} è aperto in scrittura.
1014     \item[\errcode{EAGAIN}] Il file è bloccato, o si è bloccata troppa memoria.
1015     \item[\errcode{ENOMEM}] Non c'è memoria o si è superato il limite sul
1016       numero di mappature possibili.
1017     \item[\errcode{ENODEV}] Il filesystem di \param{fd} non supporta il memory
1018       mapping.
1019     \end{errlist}
1020   }
1021 \end{functions}
1022
1023 La funzione richiede di mappare in memoria la sezione del file \param{fd} a
1024 partire da \param{offset} per \param{lenght} byte, preferibilmente
1025 all'indirizzo \param{start}. Il valore di \param{offset} deve essere un
1026 multiplo della dimensione di una pagina di memoria. 
1027
1028
1029 \begin{table}[htb]
1030   \centering
1031   \footnotesize
1032   \begin{tabular}[c]{|l|l|}
1033     \hline
1034     \textbf{Valore} & \textbf{Significato} \\
1035     \hline
1036     \hline
1037     \const{PROT\_EXEC}  & Le pagine possono essere eseguite.\\
1038     \const{PROT\_READ}  & Le pagine possono essere lette.\\
1039     \const{PROT\_WRITE} & Le pagine possono essere scritte.\\
1040     \const{PROT\_NONE}  & L'accesso alle pagine è vietato.\\
1041     \hline    
1042   \end{tabular}
1043   \caption{Valori dell'argomento \param{prot} di \func{mmap}, relativi alla
1044     protezione applicate alle pagine del file mappate in memoria.}
1045   \label{tab:file_mmap_prot}
1046 \end{table}
1047
1048
1049 Il valore dell'argomento \param{prot} indica la protezione\footnote{in Linux
1050   la memoria reale è divisa in pagine: ogni processo vede la sua memoria
1051   attraverso uno o più segmenti lineari di memoria virtuale.  Per ciascuno di
1052   questi segmenti il kernel mantiene nella \textit{page table} la mappatura
1053   sulle pagine di memoria reale, ed le modalità di accesso (lettura,
1054   esecuzione, scrittura); una loro violazione causa quella che si chiama una
1055   \textit{segment violation}, e la relativa emissione del segnale
1056   \const{SIGSEGV}.} da applicare al segmento di memoria e deve essere
1057 specificato come maschera binaria ottenuta dall'OR di uno o più dei valori
1058 riportati in \tabref{tab:file_mmap_flag}; il valore specificato deve essere
1059 compatibile con la modalità di accesso con cui si è aperto il file.
1060
1061 L'argomento \param{flags} specifica infine qual'è il tipo di oggetto mappato,
1062 le opzioni relative alle modalità con cui è effettuata la mappatura e alle
1063 modalità con cui le modifiche alla memoria mappata vengono condivise o
1064 mantenute private al processo che le ha effettuate. Deve essere specificato
1065 come maschera binaria ottenuta dall'OR di uno o più dei valori riportati in
1066 \tabref{tab:file_mmap_flag}.
1067
1068 \begin{table}[htb]
1069   \centering
1070   \footnotesize
1071   \begin{tabular}[c]{|l|p{10cm}|}
1072     \hline
1073     \textbf{Valore} & \textbf{Significato} \\
1074     \hline
1075     \hline
1076     \const{MAP\_FIXED}     & Non permette di restituire un indirizzo diverso
1077                              da \param{start}, se questo non può essere usato
1078                              \func{mmap} fallisce. Se si imposta questo flag il
1079                              valore di \param{start} deve essere allineato
1080                              alle dimensioni di una pagina. \\
1081     \const{MAP\_SHARED}    & I cambiamenti sulla memoria mappata vengono
1082                              riportati sul file e saranno immediatamente
1083                              visibili agli altri processi che mappano lo stesso
1084                              file.\footnotemark Il file su disco però non sarà
1085                              aggiornato fino alla chiamata di \func{msync} o
1086                              \func{unmap}), e solo allora le modifiche saranno
1087                              visibili per l'I/O convenzionale. Incompatibile
1088                              con \const{MAP\_PRIVATE}. \\ 
1089     \const{MAP\_PRIVATE}   & I cambiamenti sulla memoria mappata non vengono
1090                              riportati sul file. Ne viene fatta una copia
1091                              privata cui solo il processo chiamante ha
1092                              accesso.  Le modifiche sono mantenute attraverso
1093                              il meccanismo del 
1094                              \textit{copy on write}\index{copy on write} e
1095                              salvate su swap in caso di necessità. Non è
1096                              specificato se i cambiamenti sul file originale
1097                              vengano riportati sulla regione
1098                              mappata. Incompatibile con \const{MAP\_SHARED}. \\
1099     \const{MAP\_DENYWRITE} & In Linux viene ignorato per evitare
1100                              \textit{DoS}\index{DoS} (veniva usato per
1101                              segnalare che tentativi di scrittura sul file
1102                              dovevano fallire con \errcode{ETXTBSY}).\\
1103     \const{MAP\_EXECUTABLE}& Ignorato. \\
1104     \const{MAP\_NORESERVE} & Si usa con \const{MAP\_PRIVATE}. Non riserva
1105                              delle pagine di swap ad uso del meccanismo di
1106                              \textit{copy on write}\index{copy on write}
1107                              per mantenere le
1108                              modifiche fatte alla regione mappata, in
1109                              questo caso dopo una scrittura, se non c'è più
1110                              memoria disponibile, si ha l'emissione di
1111                              un \const{SIGSEGV}. \\
1112     \const{MAP\_LOCKED}    & Se impostato impedisce lo swapping delle pagine
1113                              mappate. \\
1114     \const{MAP\_GROWSDOWN} & Usato per gli stack. Indica 
1115                              che la mappatura deve essere effettuata con gli
1116                              indirizzi crescenti verso il basso.\\
1117     \const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli
1118                              argomenti \param{fd} e \param{offset} sono
1119                              ignorati.\footnotemark\\
1120     \const{MAP\_ANON}      & Sinonimo di \const{MAP\_ANONYMOUS}, deprecato.\\
1121     \const{MAP\_FILE}      & Valore di compatibilità, deprecato.\\
1122     \hline
1123   \end{tabular}
1124   \caption{Valori possibili dell'argomento \param{flag} di \func{mmap}.}
1125   \label{tab:file_mmap_flag}
1126 \end{table}
1127
1128 \footnotetext{Dato che tutti faranno riferimento alle stesse pagine di
1129   memoria.}  
1130 \footnotetext{L'uso di questo flag con \const{MAP\_SHARED} è
1131   stato implementato in Linux a partire dai kernel della serie 2.4.x.}
1132
1133 Gli effetti dell'accesso ad una zona di memoria mappata su file possono essere
1134 piuttosto complessi, essi si possono comprendere solo tenendo presente che
1135 tutto quanto è comunque basato sul basato sul meccanismo della memoria
1136 virtuale. Questo comporta allora una serie di conseguenze. La più ovvia è che
1137 se si cerca di scrivere su una zona mappata in sola lettura si avrà
1138 l'emissione di un segnale di violazione di accesso (\const{SIGSEGV}), dato che
1139 i permessi sul segmento di memoria relativo non consentono questo tipo di
1140 accesso.
1141
1142 \begin{figure}[!htb]
1143   \centering
1144   \includegraphics[width=10cm]{img/mmap_boundary}
1145   \caption{Schema della mappatura in memoria di una sezione di file di
1146     dimensioni non corrispondenti al bordo di una pagina.}
1147   \label{fig:file_mmap_boundary}
1148 \end{figure}
1149
1150 È invece assai diversa la questione relativa agli accessi al di fuori della
1151 regione di cui si è richiesta la mappatura. A prima vista infatti si potrebbe
1152 ritenere che anch'essi debbano generare un segnale di violazione di accesso;
1153 questo però non tiene conto del fatto che, essendo basata sul meccanismo della
1154 paginazione\index{paginazione}, la mappatura in memoria non può che essere
1155 eseguita su un segmento di dimensioni rigorosamente multiple di quelle di una
1156 pagina, ed in generale queste potranno non corrispondere alle dimensioni
1157 effettive del file o della sezione che si vuole mappare. Il caso più comune è
1158 quello illustrato in \figref{fig:file_mmap_boundary}, in cui la sezione di
1159 file non rientra nei confini di una pagina: in tal caso verrà il file sarà
1160 mappato su un segmento di memoria che si estende fino al bordo della pagina
1161 successiva.
1162
1163 In questo caso è possibile accedere a quella zona di memoria che eccede le
1164 dimensioni specificate da \param{lenght}, senza ottenere un \const{SIGSEGV}
1165 poiché essa è presente nello spazio di indirizzi del processo, anche se non è
1166 mappata sul file. Il comportamento del sistema è quello di restituire un
1167 valore nullo per quanto viene letto, e di non riportare su file quanto viene
1168 scritto.
1169
1170 Un caso più complesso è quello che si viene a creare quando le dimensioni del
1171 file mappato sono più corte delle dimensioni della mappatura, oppure quando il
1172 file è stato troncato, dopo che è stato mappato, ad una dimensione inferiore a
1173 quella della mappatura in memoria.
1174
1175 \begin{figure}[htb]
1176   \centering
1177   \includegraphics[width=10cm]{img/mmap_exceed}
1178   \caption{Schema della mappatura in memoria di file di dimensioni inferiori
1179     alla lunghezza richiesta.}
1180   \label{fig:file_mmap_exceed}
1181 \end{figure}
1182
1183 In questa situazione, per la sezione di pagina parzialmente coperta dal
1184 contenuto del file, vale esattamente quanto visto in precedenza; invece per la
1185 parte che eccede, fino alle dimensioni date da \param{length}, l'accesso non
1186 sarà più possibile, ma il segnale emesso non sarà \const{SIGSEGV}, ma
1187 \const{SIGBUS}, come illustrato in \figref{fig:file_mmap_exceed}.
1188
1189 Non tutti i file possono venire mappati in memoria, dato che, come illustrato
1190 in \figref{fig:file_mmap_layout}, la mappatura introduce una corrispondenza
1191 biunivoca fra una sezione di un file ed una sezione di memoria. Questo
1192 comporta che ad esempio non è possibile mappare in memoria file descriptor
1193 relativi a pipe, socket e fifo, per i quali non ha senso parlare di
1194 \textsl{sezione}. Lo stesso vale anche per alcuni file di dispositivo, che non
1195 dispongono della relativa operazione \func{mmap} (si ricordi quanto esposto in
1196 \secref{sec:file_vfs_work}). Si tenga presente però che esistono anche casi di
1197 dispositivi (un esempio è l'interfaccia al ponte PCI-VME del chip Universe)
1198 che sono utilizzabili solo con questa interfaccia.
1199
1200 Dato che passando attraverso una \func{fork} lo spazio di indirizzi viene
1201 copiato integralmente, i file mappati in memoria verranno ereditati in maniera
1202 trasparente dal processo figlio, mantenendo gli stessi attributi avuti nel
1203 padre; così se si è usato \const{MAP\_SHARED} padre e figlio accederanno allo
1204 stesso file in maniera condivisa, mentre se si è usato \const{MAP\_PRIVATE}
1205 ciascuno di essi manterrà una sua versione privata indipendente. Non c'è
1206 invece nessun passaggio attraverso una \func{exec}, dato che quest'ultima
1207 sostituisce tutto lo spazio degli indirizzi di un processo con quello di un
1208 nuovo programma.
1209
1210 Quando si effettua la mappatura di un file vengono pure modificati i tempi ad
1211 esso associati (di cui si è trattato in \secref{sec:file_file_times}). Il
1212 valore di \var{st\_atime} può venir cambiato in qualunque istante a partire
1213 dal momento in cui la mappatura è stata effettuata: il primo riferimento ad
1214 una pagina mappata su un file aggiorna questo tempo.  I valori di
1215 \var{st\_ctime} e \var{st\_mtime} possono venir cambiati solo quando si è
1216 consentita la scrittura sul file (cioè per un file mappato con
1217 \const{PROT\_WRITE} e \const{MAP\_SHARED}) e sono aggiornati dopo la scrittura
1218 o in corrispondenza di una eventuale \func{msync}.
1219
1220 Dato per i file mappati in memoria le operazioni di I/O sono gestite
1221 direttamente dalla memoria virtuale, occorre essere consapevoli delle
1222 interazioni che possono esserci con operazioni effettuate con l'interfaccia
1223 standard dei file di \capref{cha:file_unix_interface}. Il problema è che una
1224 volta che si è mappato un file, le operazioni di lettura e scrittura saranno
1225 eseguite sulla memoria, e riportate su disco in maniera autonoma dal sistema
1226 della memoria virtuale.
1227
1228 Pertanto se si modifica un file con l'interfaccia standard queste modifiche
1229 potranno essere visibili o meno a seconda del momento in cui la memoria
1230 virtuale trasporterà dal disco in memoria quella sezione del file, perciò è
1231 del tutto imprevedibile il risultato della modifica di un file nei confronti
1232 del contenuto della memoria su cui è mappato.
1233
1234 Per questo, è sempre sconsigliabile eseguire scritture su file attraverso
1235 l'interfaccia standard, quando lo si è mappato in memoria, è invece possibile
1236 usare l'interfaccia standard per leggere un file mappato in memoria, purché si
1237 abbia una certa cura; infatti l'interfaccia dell'I/O mappato in memoria mette
1238 a disposizione la funzione \funcd{msync} per sincronizzare il contenuto della
1239 memoria mappata con il file su disco; il suo prototipo è:
1240 \begin{functions}  
1241   \headdecl{unistd.h}
1242   \headdecl{sys/mman.h} 
1243
1244   \funcdecl{int msync(const void *start, size\_t length, int flags)}
1245   
1246   Sincronizza i contenuti di una sezione di un file mappato in memoria.
1247   
1248   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1249     errore nel qual caso \var{errno} assumerà uno dei valori:
1250     \begin{errlist}
1251     \item[\errcode{EINVAL}] O \param{start} non è multiplo di \const{PAGESIZE},
1252     o si è specificato un valore non valido per \param{flags}.
1253     \item[\errcode{EFAULT}] L'intervallo specificato non ricade in una zona
1254       precedentemente mappata.
1255     \end{errlist}
1256   }
1257 \end{functions}
1258
1259 La funzione esegue la sincronizzazione di quanto scritto nella sezione di
1260 memoria indicata da \param{start} e \param{offset}, scrivendo le modifiche sul
1261 file (qualora questo non sia già stato fatto).  Provvede anche ad aggiornare i
1262 relativi tempi di modifica. In questo modo si è sicuri che dopo l'esecuzione
1263 di \func{msync} le funzioni dell'interfaccia standard troveranno un contenuto
1264 del file aggiornato.
1265
1266 \begin{table}[htb]
1267   \centering
1268   \footnotesize
1269   \begin{tabular}[c]{|l|l|}
1270     \hline
1271     \textbf{Valore} & \textbf{Significato} \\
1272     \hline
1273     \hline
1274     \const{MS\_ASYNC}     & Richiede la sincronizzazione.\\
1275     \const{MS\_SYNC}      & Attende che la sincronizzazione si eseguita.\\
1276     \const{MS\_INVALIDATE}& Richiede che le altre mappature dello stesso file
1277                             siano invalidate.\\
1278     \hline    
1279   \end{tabular}
1280   \caption{Valori dell'argomento \param{flag} di \func{msync}.}
1281   \label{tab:file_mmap_rsync}
1282 \end{table}
1283
1284 L'argomento \param{flag} è specificato come maschera binaria composta da un OR
1285 dei valori riportati in \tabref{tab:file_mmap_rsync}, di questi però
1286 \const{MS\_ASYNC} e \const{MS\_SYNC} sono incompatibili; con il primo valore
1287 infatti la funzione si limita ad inoltrare la richiesta di sincronizzazione al
1288 meccanismo della memoria virtuale, ritornando subito, mentre con il secondo
1289 attende che la sincronizzazione sia stata effettivamente eseguita. Il terzo
1290 flag fa invalidare le pagine di cui si richiede la sincronizzazione per tutte
1291 le mappature dello stesso file, così che esse possano essere immediatamente
1292 aggiornate ai nuovi valori.
1293
1294 Una volta che si sono completate le operazioni di I/O si può eliminare la
1295 mappatura della memoria usando la funzione \funcd{munmap}, il suo prototipo è:
1296 \begin{functions}  
1297   \headdecl{unistd.h}
1298   \headdecl{sys/mman.h} 
1299
1300   \funcdecl{int munmap(void *start, size\_t length)}
1301   
1302   Rilascia la mappatura sulla sezione di memoria specificata.
1303
1304   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1305     errore nel qual caso \var{errno} assumerà uno dei valori:
1306     \begin{errlist}
1307     \item[\errcode{EINVAL}] L'intervallo specificato non ricade in una zona
1308       precedentemente mappata.
1309     \end{errlist}
1310   }
1311 \end{functions}
1312
1313 La funzione cancella la mappatura per l'intervallo specificato attraverso
1314 \param{start} e \param{length}, ed ogni successivo accesso a tale regione
1315 causerà un errore di accesso in memoria. L'argomento \param{start} deve essere
1316 allineato alle dimensioni di una pagina di memoria, e la mappatura di tutte le
1317 pagine contenute (anche parzialmente) nell'intervallo indicato, verrà rimossa.
1318 Indicare un intervallo che non contiene pagine mappate non è un errore.
1319
1320 Alla conclusione del processo, ogni pagina mappata verrà automaticamente
1321 rilasciata, mentre la chiusura del file descriptor usato per effettuare la
1322 mappatura in memoria non ha alcun effetto sulla stessa.
1323
1324
1325 \section{Il file locking}
1326 \label{sec:file_locking}
1327
1328 \index{file!locking|(}
1329 In \secref{sec:file_sharing} abbiamo preso in esame le modalità in cui un
1330 sistema unix-like gestisce la condivisione dei file da parte di processi
1331 diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti
1332 in \textit{append mode}, quando più processi scrivono contemporaneamente sullo
1333 stesso file non è possibile determinare la sequenza in cui essi opereranno.
1334
1335 Questo causa la possibilità di race condition\index{race condition}; in
1336 generale le situazioni più comuni sono due: l'interazione fra un processo che
1337 scrive e altri che leggono, in cui questi ultimi possono leggere informazioni
1338 scritte solo in maniera parziale o incompleta; o quella in cui diversi
1339 processi scrivono, mescolando in maniera imprevedibile il loro output sul
1340 file.
1341
1342 In tutti questi casi il \textit{file locking} è la tecnica che permette di
1343 evitare le race condition\index{race condition}, attraverso una serie di
1344 funzioni che permettono di bloccare l'accesso al file da parte di altri
1345 processi, così da evitare le sovrapposizioni, e garantire la atomicità delle
1346 operazioni di scrittura.
1347
1348
1349
1350 \subsection{L'\textit{advisory locking}}
1351 \label{sec:file_record_locking}
1352
1353 La prima modalità di \textit{file locking} che è stata implementata nei
1354 sistemi unix-like è quella che viene usualmente chiamata \textit{advisory
1355   locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
1356   come al \textit{record locking}, dizione utilizzata anche dal manuale delle
1357   \acr{glibc}; nelle pagine di manuale si parla di \textit{discretionary file
1358     lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
1359   mentre questo nome viene usato da Stevens per riferirsi al \textit{file
1360     locking} POSIX. Dato che la dizione \textit{record locking} è quantomeno
1361   ambigua, in quanto in un sistema Unix non esiste niente che possa fare
1362   riferimento al concetto di \textit{record}, alla fine si è scelto di
1363   mantenere il nome \textit{advisory locking}.} in quanto sono i singoli
1364 processi, e non il sistema, che si incaricano di asserire e verificare se
1365 esistono delle condizioni di blocco per l'accesso ai file.  Questo significa
1366 che le funzioni \func{read} o \func{write} vengono eseguite comunque e non
1367 risentono affatto della presenza di un eventuale \textit{lock}; pertanto è
1368 sempre compito dei vari processi che intendono usare il file locking,
1369 controllare esplicitamente lo stato dei file condivisi prima di accedervi,
1370 utilizzando le relative funzioni.
1371
1372 In generale si distinguono due tipologie di \textit{file lock}:\footnote{di
1373   seguito ci riferiremo sempre ai blocchi di accesso ai file con la
1374   nomenclatura inglese di \textit{file lock}, o più brevemente con
1375   \textit{lock}, per evitare confusioni linguistiche con il blocco di un
1376   processo (cioè la condizione in cui il processo viene posto in stato di
1377   \textit{sleep}).} la prima è il cosiddetto \textit{shared lock}, detto anche
1378 \textit{read lock} in quanto serve a bloccare l'accesso in scrittura su un
1379 file affinché il suo contenuto non venga modificato mentre lo si legge. Si
1380 parla appunto di \textsl{blocco condiviso} in quanto più processi possono
1381 richiedere contemporaneamente uno \textit{shared lock} su un file per
1382 proteggere il loro accesso in lettura.
1383
1384 La seconda tipologia è il cosiddetto \textit{exclusive lock}, detto anche
1385 \textit{write lock} in quanto serve a bloccare l'accesso su un file (sia in
1386 lettura che in scrittura) da parte di altri processi mentre lo si sta
1387 scrivendo. Si parla di \textsl{blocco esclusivo} appunto perché un solo
1388 processo alla volta può richiedere un \textit{exclusive lock} su un file per
1389 proteggere il suo accesso in scrittura.
1390
1391 \begin{table}[htb]
1392   \centering
1393   \footnotesize
1394   \begin{tabular}[c]{|l|c|c|c|}
1395     \hline
1396     \textbf{Richiesta} & \multicolumn{3}{|c|}{\textbf{Stato del file}}\\
1397     \cline{2-4}
1398                        &Nessun lock&\textit{Read lock}&\textit{Write lock}\\
1399     \hline
1400     \hline
1401     \textit{Read lock} & SI & SI & NO \\
1402     \textit{Write lock}& SI & NO & NO \\
1403     \hline    
1404   \end{tabular}
1405   \caption{Tipologie di file locking.}
1406   \label{tab:file_file_lock}
1407 \end{table}
1408
1409 In Linux sono disponibili due interfacce per utilizzare l'\textit{advisory
1410   locking}, la prima è quella derivata da BSD, che è basata sulla funzione
1411 \func{flock}, la seconda è quella standardizzata da POSIX.1 (derivata da
1412 System V), che è basata sulla funzione \func{fcntl}.  I \textit{file lock}
1413 sono implementati in maniera completamente indipendente nelle due interfacce,
1414 che pertanto possono coesistere senza interferenze.
1415
1416 Entrambe le interfacce prevedono la stessa procedura di funzionamento: si
1417 inizia sempre con il richiedere l'opportuno \textit{file lock} (un
1418 \textit{exclusive lock} per una scrittura, uno \textit{shared lock} per una
1419 lettura) prima di eseguire l'accesso ad un file.  Se il lock viene acquisito
1420 il processo prosegue l'esecuzione, altrimenti (a meno di non aver richiesto un
1421 comportamento non bloccante) viene posto in stato di sleep. Una volta finite
1422 le operazioni sul file si deve provvedere a rimuovere il lock. La situazione
1423 delle varie possibilità è riassunta in \tabref{tab:file_file_lock}, dove si
1424 sono riportati, per le varie tipologie di lock presenti su un file, il
1425 risultato che si ha in corrispondenza alle due tipologie di \textit{file lock}
1426 menzionate, nel successo della richiesta.
1427
1428 Si tenga presente infine che il controllo di accesso e la gestione dei
1429 permessi viene effettuata quando si apre un file, l'unico controllo residuo
1430 che si può avere riguardo il \textit{file locking} è che il tipo di lock che
1431 si vuole ottenere su un file deve essere compatibile con le modalità di
1432 apertura dello stesso (in lettura per un read lock e in scrittura per un write
1433 lock).
1434
1435 %%  Si ricordi che
1436 %% la condizione per acquisire uno \textit{shared lock} è che il file non abbia
1437 %% già un \textit{exclusive lock} attivo, mentre per acquisire un
1438 %% \textit{exclusive lock} non deve essere presente nessun tipo di blocco.
1439
1440
1441 \subsection{La funzione \func{flock}} 
1442 \label{sec:file_flock}
1443
1444 La prima interfaccia per il file locking, quella derivata da BSD, permette di
1445 eseguire un blocco solo su un intero file; la funzione usata per richiedere e
1446 rimuovere un \textit{file lock} è \funcd{flock}, ed il suo prototipo è:
1447 \begin{prototype}{sys/file.h}{int flock(int fd, int operation)}
1448   
1449   Applica o rimuove un \textit{file lock} sul file \param{fd}.
1450   
1451   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1452     errore, nel qual caso \var{errno} assumerà uno dei valori:
1453     \begin{errlist}
1454     \item[\errcode{EWOULDBLOCK}] Il file ha già un blocco attivo, e si è
1455       specificato \const{LOCK\_NB}.
1456     \end{errlist}
1457   }
1458 \end{prototype}
1459
1460 La funzione può essere usata per acquisire o rilasciare un \textit{file lock}
1461 a seconda di quanto specificato tramite il valore dell'argomento
1462 \param{operation}, questo viene interpretato come maschera binaria, e deve
1463 essere passato utilizzando le costanti riportate in
1464 \tabref{tab:file_flock_operation}.
1465
1466 \begin{table}[htb]
1467   \centering
1468   \footnotesize
1469   \begin{tabular}[c]{|l|l|}
1470     \hline
1471     \textbf{Valore} & \textbf{Significato} \\
1472     \hline
1473     \hline
1474     \const{LOCK\_SH} & Asserisce uno \textit{shared lock} sul file.\\ 
1475     \const{LOCK\_EX} & Asserisce un \textit{esclusive lock} sul file.\\
1476     \const{LOCK\_UN} & Rilascia il \textit{file lock}.\\
1477     \const{LOCK\_NB} & Impedisce che la funzione si blocchi nella
1478                        richiesta di un \textit{file lock}.\\
1479     \hline    
1480   \end{tabular}
1481   \caption{Valori dell'argomento \param{operation} di \func{flock}.}
1482   \label{tab:file_flock_operation}
1483 \end{table}
1484
1485 I primi due valori, \const{LOCK\_SH} e \const{LOCK\_EX} permettono di
1486 richiedere un \textit{file lock}, ed ovviamente devono essere usati in maniera
1487 alternativa. Se si specifica anche \const{LOCK\_NB} la funzione non si
1488 bloccherà qualora il lock non possa essere acquisito, ma ritornerà subito con
1489 un errore di \errcode{EWOULDBLOCK}. Per rilasciare un lock si dovrà invece
1490 usare \const{LOCK\_UN}.
1491
1492 La semantica del file locking di BSD è diversa da quella del file locking
1493 POSIX, in particolare per quanto riguarda il comportamento dei lock nei
1494 confronti delle due funzioni \func{dup} e \func{fork}.  Per capire queste
1495 differenze occorre descrivere con maggiore dettaglio come viene realizzato il
1496 file locking nel kernel in entrambe le interfacce.
1497
1498 In \figref{fig:file_flock_struct} si è riportato uno schema essenziale
1499 dell'implementazione del file locking in stile BSD in Linux; il punto
1500 fondamentale da capire è che un lock, qualunque sia l'interfaccia che si usa,
1501 anche se richiesto attraverso un file descriptor, agisce sempre su un file;
1502 perciò le informazioni relative agli eventuali \textit{file lock} sono
1503 mantenute a livello di inode\index{inode},\footnote{in particolare, come
1504   accennato in \figref{fig:file_flock_struct}, i \textit{file lock} sono
1505   mantenuti un una \textit{linked list}\index{linked list} di strutture
1506   \struct{file\_lock}. La lista è referenziata dall'indirizzo di partenza
1507   mantenuto dal campo \var{i\_flock} della struttura \struct{inode} (per le
1508   definizioni esatte si faccia riferimento al file \file{fs.h} nei sorgenti
1509   del kernel).  Un bit del campo \var{fl\_flags} di specifica se si tratta di
1510   un lock in semantica BSD (\const{FL\_FLOCK}) o POSIX (\const{FL\_POSIX}).}
1511 dato che questo è l'unico riferimento in comune che possono avere due processi
1512 diversi che aprono lo stesso file.
1513
1514 \begin{figure}[htb]
1515   \centering
1516   \includegraphics[width=14cm]{img/file_flock}
1517   \caption{Schema dell'architettura del file locking, nel caso particolare  
1518     del suo utilizzo da parte dalla funzione \func{flock}.}
1519   \label{fig:file_flock_struct}
1520 \end{figure}
1521
1522 La richiesta di un file lock prevede una scansione della lista per determinare
1523 se l'acquisizione è possibile, ed in caso positivo l'aggiunta di un nuovo
1524 elemento.\footnote{cioè una nuova struttura \struct{file\_lock}.}  Nel caso
1525 dei lock creati con \func{flock} la semantica della funzione prevede che sia
1526 \func{dup} che \func{fork} non creino ulteriori istanze di un file lock quanto
1527 piuttosto degli ulteriori riferimenti allo stesso. Questo viene realizzato dal
1528 kernel secondo lo schema di \figref{fig:file_flock_struct}, associando ad ogni
1529 nuovo \textit{file lock} un puntatore\footnote{il puntatore è mantenuto nel
1530   campo \var{fl\_file} di \struct{file\_lock}, e viene utilizzato solo per i
1531   lock creati con la semantica BSD.} alla voce nella \textit{file table} da
1532 cui si è richiesto il lock, che così ne identifica il titolare.
1533
1534 Questa struttura prevede che, quando si richiede la rimozione di un file lock,
1535 il kernel acconsenta solo se la richiesta proviene da un file descriptor che
1536 fa riferimento ad una voce nella file table corrispondente a quella registrata
1537 nel lock.  Allora se ricordiamo quanto visto in \secref{sec:file_dup} e
1538 \secref{sec:file_sharing}, e cioè che i file descriptor duplicati e quelli
1539 ereditati in un processo figlio puntano sempre alla stessa voce nella file
1540 table, si può capire immediatamente quali sono le conseguenze nei confronti
1541 delle funzioni \func{dup} e \func{fork}.
1542
1543 Sarà così possibile rimuovere un file lock attraverso uno qualunque dei file
1544 descriptor che fanno riferimento alla stessa voce nella file table, anche se
1545 questo è diverso da quello con cui lo si è creato,\footnote{attenzione, questo
1546   non vale se il file descriptor fa riferimento allo stesso file, ma
1547   attraverso una voce diversa della file table, come accade tutte le volte che
1548   si apre più volte lo stesso file.} o se si esegue la rimozione in un
1549 processo figlio; inoltre una volta tolto un file lock, la rimozione avrà
1550 effetto su tutti i file descriptor che condividono la stessa voce nella file
1551 table, e quindi, nel caso di file descriptor ereditati attraverso una
1552 \func{fork}, anche su processi diversi.
1553
1554 Infine, per evitare che la terminazione imprevista di un processo lasci attivi
1555 dei file lock, quando un file viene chiuso il kernel provveda anche a
1556 rimuovere tutti i lock ad esso associati. Anche in questo caso occorre tenere
1557 presente cosa succede quando si hanno file descriptor duplicati; in tal caso
1558 infatti il file non verrà effettivamente chiuso (ed il lock rimosso) fintanto
1559 che non viene rilasciata la relativa voce nella file table; e questo avverrà
1560 solo quando tutti i file descriptor che fanno riferimento alla stessa voce
1561 sono stati chiusi.  Quindi, nel caso ci siano duplicati o processi figli che
1562 mantengono ancora aperto un file descriptor, il lock non viene rilasciato.
1563
1564 Si tenga presente infine che \func{flock} non è in grado di funzionare per i
1565 file mantenuti su NFS, in questo caso, se si ha la necessità di eseguire il
1566 \textit{file locking}, occorre usare l'interfaccia basata su \func{fcntl} che
1567 può funzionare anche attraverso NFS, a condizione che sia il client che il
1568 server supportino questa funzionalità.
1569  
1570
1571 \subsection{Il file locking POSIX}
1572 \label{sec:file_posix_lock}
1573
1574 La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è
1575 quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo
1576 già trattato questa funzione nelle sue molteplici possibilità di utilizzo in
1577 \secref{sec:file_fcntl}. Quando la si impiega per il \textit{file locking}
1578 essa viene usata solo secondo il prototipo:
1579 \begin{prototype}{fcntl.h}{int fcntl(int fd, int cmd, struct flock *lock)}
1580   
1581   Applica o rimuove un \textit{file lock} sul file \param{fd}.
1582   
1583   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
1584     errore, nel qual caso \var{errno} assumerà uno dei valori:
1585     \begin{errlist}
1586     \item[\errcode{EACCES}] L'operazione è proibita per la presenza di
1587       \textit{file lock} da parte di altri processi.
1588     \item[\errcode{ENOLCK}] Il sistema non ha le risorse per il locking: ci
1589       sono troppi segmenti di lock aperti, si è esaurita la tabella dei lock,
1590       o il protocollo per il locking remoto è fallito.
1591     \item[\errcode{EDEADLK}] Si è richiesto un lock su una regione bloccata da
1592       un altro processo che è a sua volta in attesa dello sblocco di un lock
1593       mantenuto dal processo corrente; si avrebbe pertanto un
1594       \textit{deadlock}\index{deadlock}. Non è garantito che il sistema
1595       riconosca sempre questa situazione.
1596     \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale prima
1597       di poter acquisire un lock.
1598     \end{errlist}
1599     ed inoltre \errval{EBADF}, \errval{EFAULT}.
1600   }
1601 \end{prototype}
1602
1603 Al contrario di quanto avviene con l'interfaccia basata su \func{flock} con
1604 \func{fcntl} è possibile bloccare anche delle singole sezioni di un file, fino
1605 al singolo byte. Inoltre la funzione permette di ottenere alcune informazioni
1606 relative agli eventuali lock preesistenti.  Per poter fare tutto questo la
1607 funzione utilizza come terzo argomento una apposita struttura \struct{flock}
1608 (la cui definizione è riportata in \figref{fig:struct_flock}) nella quale
1609 inserire tutti i dati relativi ad un determinato lock. Si tenga presente poi
1610 che un lock fa sempre riferimento ad una regione, per cui si potrà avere un
1611 conflitto anche se c'è soltanto una sovrapposizione parziale con un'altra
1612 regione bloccata.
1613
1614 \begin{figure}[!bht]
1615   \footnotesize \centering
1616   \begin{minipage}[c]{15cm}
1617     \includestruct{listati/flock.h}
1618   \end{minipage} 
1619   \normalsize 
1620   \caption{La struttura \structd{flock}, usata da \func{fcntl} per il file
1621     locking.} 
1622   \label{fig:struct_flock}
1623 \end{figure}
1624
1625
1626 I primi tre campi della struttura, \var{l\_whence}, \var{l\_start} e
1627 \var{l\_len}, servono a specificare la sezione del file a cui fa riferimento
1628 il lock: \var{l\_start} specifica il byte di partenza, \var{l\_len} la
1629 lunghezza della sezione e infine \var{l\_whence} imposta il riferimento da cui
1630 contare \var{l\_start}. Il valore di \var{l\_whence} segue la stessa semantica
1631 dell'omonimo argomento di \func{lseek}, coi tre possibili valori
1632 \const{SEEK\_SET}, \const{SEEK\_CUR} e \const{SEEK\_END}, (si vedano le
1633 relative descrizioni in \secref{sec:file_lseek}). 
1634
1635 Si tenga presente che un lock può essere richiesto anche per una regione al di
1636 là della corrente fine del file, così che una eventuale estensione dello
1637 stesso resti coperta dal blocco. Inoltre se si specifica un valore nullo per
1638 \var{l\_len} il blocco si considera esteso fino alla dimensione massima del
1639 file; in questo modo è possibile bloccare una qualunque regione a partire da
1640 un certo punto fino alla fine del file, coprendo automaticamente quanto
1641 eventualmente aggiunto in coda allo stesso.
1642
1643 \begin{table}[htb]
1644   \centering
1645   \footnotesize
1646   \begin{tabular}[c]{|l|l|}
1647     \hline
1648     \textbf{Valore} & \textbf{Significato} \\
1649     \hline
1650     \hline
1651     \const{F\_RDLCK} & Richiede un blocco condiviso (\textit{read lock}).\\
1652     \const{F\_WRLCK} & Richiede un blocco esclusivo (\textit{write lock}).\\
1653     \const{F\_UNLCK} & Richiede l'eliminazione di un file lock.\\
1654     \hline    
1655   \end{tabular}
1656   \caption{Valori possibili per il campo \var{l\_type} di \struct{flock}.}
1657   \label{tab:file_flock_type}
1658 \end{table}
1659
1660 Il tipo di file lock richiesto viene specificato dal campo \var{l\_type}, esso
1661 può assumere i tre valori definiti dalle costanti riportate in
1662 \tabref{tab:file_flock_type}, che permettono di richiedere rispettivamente uno
1663 \textit{shared lock}, un \textit{esclusive lock}, e la rimozione di un lock
1664 precedentemente acquisito. Infine il campo \var{l\_pid} viene usato solo in
1665 caso di lettura, quando si chiama \func{fcntl} con \const{F\_GETLK}, e riporta
1666 il \acr{pid} del processo che detiene il lock.
1667
1668 Oltre a quanto richiesto tramite i campi di \struct{flock}, l'operazione
1669 effettivamente svolta dalla funzione è stabilita dal valore dall'argomento
1670 \param{cmd} che, come già riportato in \secref{sec:file_fcntl}, specifica
1671 l'azione da compiere; i valori relativi al file locking sono tre:
1672 \begin{basedescript}{\desclabelwidth{2.0cm}}
1673 \item[\const{F\_GETLK}] verifica se il file lock specificato dalla struttura
1674   puntata da \param{lock} può essere acquisito: in caso negativo sovrascrive
1675   la struttura \param{flock} con i valori relativi al lock già esistente che
1676   ne blocca l'acquisizione, altrimenti si limita a impostarne il campo
1677   \var{l\_type} con il valore \const{F\_UNLCK}. 
1678 \item[\const{F\_SETLK}] se il campo \var{l\_type} della struttura puntata da
1679   \param{lock} è \const{F\_RDLCK} o \const{F\_WRLCK} richiede il
1680   corrispondente file lock, se è \const{F\_UNLCK} lo rilascia. Nel caso la
1681   richiesta non possa essere soddisfatta a causa di un lock preesistente la
1682   funzione ritorna immediatamente con un errore di \errcode{EACCES} o di
1683   \errcode{EAGAIN}.
1684 \item[\const{F\_SETLKW}] è identica a \const{F\_SETLK}, ma se la richiesta di
1685   non può essere soddisfatta per la presenza di un altro lock, mette il
1686   processo in stato di attesa fintanto che il lock precedente non viene
1687   rilasciato. Se l'attesa viene interrotta da un segnale la funzione ritorna
1688   con un errore di \errcode{EINTR}.
1689 \end{basedescript}
1690
1691 Si noti che per quanto detto il comando \const{F\_GETLK} non serve a rilevare
1692 una presenza generica di lock su un file, perché se ne esistono altri
1693 compatibili con quello richiesto, la funzione ritorna comunque impostando
1694 \var{l\_type} a \const{F\_UNLCK}.  Inoltre a seconda del valore di
1695 \var{l\_type} si potrà controllare o l'esistenza di un qualunque tipo di lock
1696 (se è \const{F\_WRLCK}) o di write lock (se è \const{F\_RDLCK}). Si consideri
1697 poi che può esserci più di un lock che impedisce l'acquisizione di quello
1698 richiesto (basta che le regioni si sovrappongano), ma la funzione ne riporterà
1699 sempre soltanto uno, impostando \var{l\_whence} a \const{SEEK\_SET} ed i
1700 valori \var{l\_start} e \var{l\_len} per indicare quale è la regione bloccata.
1701
1702 Infine si tenga presente che effettuare un controllo con il comando
1703 \const{F\_GETLK} e poi tentare l'acquisizione con \const{F\_SETLK} non è una
1704 operazione atomica (un altro processo potrebbe acquisire un lock fra le due
1705 chiamate) per cui si deve sempre verificare il codice di ritorno di
1706 \func{fcntl}\footnote{controllare il codice di ritorno delle funzioni invocate
1707   è comunque una buona norma di programmazione, che permette di evitare un
1708   sacco di errori difficili da tracciare proprio perché non vengono rilevati.}
1709 quando la si invoca con \const{F\_SETLK}, per controllare che il lock sia
1710 stato effettivamente acquisito.
1711
1712 \begin{figure}[htb]
1713   \centering \includegraphics[width=9cm]{img/file_lock_dead}
1714   \caption{Schema di una situazione di \textit{deadlock}\index{deadlock}.}
1715   \label{fig:file_flock_dead}
1716 \end{figure}
1717
1718 Non operando a livello di interi file, il file locking POSIX introduce
1719 un'ulteriore complicazione; consideriamo la situazione illustrata in
1720 \figref{fig:file_flock_dead}, in cui il processo A blocca la regione 1 e il
1721 processo B la regione 2. Supponiamo che successivamente il processo A richieda
1722 un lock sulla regione 2 che non può essere acquisito per il preesistente lock
1723 del processo 2; il processo 1 si bloccherà fintanto che il processo 2 non
1724 rilasci il blocco. Ma cosa accade se il processo 2 nel frattempo tenta a sua
1725 volta di ottenere un lock sulla regione A? Questa è una tipica situazione che
1726 porta ad un \textit{deadlock}\index{deadlock}, dato che a quel punto anche il
1727 processo 2 si bloccherebbe, e niente potrebbe sbloccare l'altro processo. Per
1728 questo motivo il kernel si incarica di rilevare situazioni di questo tipo, ed
1729 impedirle restituendo un errore di \errcode{EDEADLK} alla funzione che cerca
1730 di acquisire un lock che porterebbe ad un \textit{deadlock}.
1731
1732 \begin{figure}[!bht]
1733   \centering \includegraphics[width=13cm]{img/file_posix_lock}
1734   \caption{Schema dell'architettura del file locking, nel caso particolare  
1735     del suo utilizzo secondo l'interfaccia standard POSIX.}
1736   \label{fig:file_posix_lock}
1737 \end{figure}
1738
1739
1740 Per capire meglio il funzionamento del file locking in semantica POSIX (che
1741 differisce alquanto rispetto da quello di BSD, visto \secref{sec:file_flock})
1742 esaminiamo più in dettaglio come viene gestito dal kernel. Lo schema delle
1743 strutture utilizzate è riportato in \figref{fig:file_posix_lock}; come si vede
1744 esso è molto simile all'analogo di \figref{fig:file_flock_struct}:\footnote{in
1745   questo caso nella figura si sono evidenziati solo i campi di
1746   \struct{file\_lock} significativi per la semantica POSIX, in particolare
1747   adesso ciascuna struttura contiene, oltre al \acr{pid} del processo in
1748   \var{fl\_pid}, la sezione di file che viene bloccata grazie ai campi
1749   \var{fl\_start} e \var{fl\_end}.  La struttura è comunque la stessa, solo
1750   che in questo caso nel campo \var{fl\_flags} è impostato il bit
1751   \const{FL\_POSIX} ed il campo \var{fl\_file} non viene usato.} il lock è
1752 sempre associato all'inode\index{inode}, solo che in questo caso la titolarità
1753 non viene identificata con il riferimento ad una voce nella file table, ma con
1754 il valore del \acr{pid} del processo.
1755
1756 Quando si richiede un lock il kernel effettua una scansione di tutti i lock
1757 presenti sul file\footnote{scandisce cioè la linked list delle strutture
1758   \struct{file\_lock}, scartando automaticamente quelle per cui
1759   \var{fl\_flags} non è \const{FL\_POSIX}, così che le due interfacce restano
1760   ben separate.}  per verificare se la regione richiesta non si sovrappone ad
1761 una già bloccata, in caso affermativo decide in base al tipo di lock, in caso
1762 negativo il nuovo lock viene comunque acquisito ed aggiunto alla lista.
1763
1764 Nel caso di rimozione invece questa viene effettuata controllando che il
1765 \acr{pid} del processo richiedente corrisponda a quello contenuto nel lock.
1766 Questa diversa modalità ha delle conseguenze precise riguardo il comportamento
1767 dei lock POSIX. La prima conseguenza è che un lock POSIX non viene mai
1768 ereditato attraverso una \func{fork}, dato che il processo figlio avrà un
1769 \acr{pid} diverso, mentre passa indenne attraverso una \func{exec} in quanto
1770 il \acr{pid} resta lo stesso.  Questo comporta che, al contrario di quanto
1771 avveniva con la semantica BSD, quando processo termina tutti i file lock da
1772 esso detenuti vengono immediatamente rilasciati.
1773
1774 La seconda conseguenza è che qualunque file descriptor che faccia riferimento
1775 allo stesso file (che sia stato ottenuto con una \func{dup} o con una
1776 \func{open} in questo caso non fa differenza) può essere usato per rimuovere
1777 un lock, dato che quello che conta è solo il \acr{pid} del processo. Da questo
1778 deriva una ulteriore sottile differenza di comportamento: dato che alla
1779 chiusura di un file i lock ad esso associati vengono rimossi, nella semantica
1780 POSIX basterà chiudere un file descriptor qualunque per cancellare tutti i
1781 lock relativi al file cui esso faceva riferimento, anche se questi fossero
1782 stati creati usando altri file descriptor che restano aperti.
1783
1784 Dato che il controllo sull'accesso ai lock viene eseguito sulla base del
1785 \acr{pid} del processo, possiamo anche prendere in considerazione un'altro
1786 degli aspetti meno chiari di questa interfaccia e cioè cosa succede quando si
1787 richiedono dei lock su regioni che si sovrappongono fra loro all'interno
1788 stesso processo. Siccome il controllo, come nel caso della rimozione, si basa
1789 solo sul \acr{pid} del processo che chiama la funzione, queste richieste
1790 avranno sempre successo.
1791
1792 Nel caso della semantica BSD, essendo i lock relativi a tutto un file e non
1793 accumulandosi,\footnote{questa ultima caratteristica è vera in generale, se
1794   cioè si richiede più volte lo stesso file lock, o più lock sulla stessa
1795   sezione di file, le richieste non si cumulano e basta una sola richiesta di
1796   rilascio per cancellare il lock.}  la cosa non ha alcun effetto; la funzione
1797 ritorna con successo, senza che il kernel debba modificare la lista dei lock.
1798 In questo caso invece si possono avere una serie di situazioni diverse: ad
1799 esempio è possibile rimuovere con una sola chiamata più lock distinti
1800 (indicando in una regione che si sovrapponga completamente a quelle di questi
1801 ultimi), o rimuovere solo una parte di un lock preesistente (indicando una
1802 regione contenuta in quella di un altro lock), creando un buco, o coprire con
1803 un nuovo lock altri lock già ottenuti, e così via, a secondo di come si
1804 sovrappongono le regioni richieste e del tipo di operazione richiesta.  Il
1805 comportamento seguito in questo caso che la funzione ha successo ed esegue
1806 l'operazione richiesta sulla regione indicata; è compito del kernel
1807 preoccuparsi di accorpare o dividere le voci nella lista dei lock per far si
1808 che le regioni bloccate da essa risultanti siano coerenti con quanto
1809 necessario a soddisfare l'operazione richiesta.
1810
1811 \begin{figure}[!htb]
1812   \footnotesize \centering
1813   \begin{minipage}[c]{15cm}
1814     \includecodesample{listati/Flock.c}
1815   \end{minipage} 
1816   \normalsize 
1817   \caption{Sezione principale del codice del programma \file{Flock.c}.}
1818   \label{fig:file_flock_code}
1819 \end{figure}
1820
1821 Per fare qualche esempio sul file locking si è scritto un programma che
1822 permette di bloccare una sezione di un file usando la semantica POSIX, o un
1823 intero file usando la semantica BSD; in \figref{fig:file_flock_code} è
1824 riportata il corpo principale del codice del programma, (il testo completo è
1825 allegato nella directory dei sorgenti).
1826
1827 La sezione relativa alla gestione delle opzioni al solito si è omessa, come la
1828 funzione che stampa le istruzioni per l'uso del programma, essa si cura di
1829 impostare le variabili \var{type}, \var{start} e \var{len}; queste ultime due
1830 vengono inizializzate al valore numerico fornito rispettivamente tramite gli
1831 switch \code{-s} e \cmd{-l}, mentre il valore della prima viene impostato con
1832 le opzioni \cmd{-w} e \cmd{-r} si richiede rispettivamente o un write lock o
1833 read lock (i due valori sono esclusivi, la variabile assumerà quello che si è
1834 specificato per ultimo). Oltre a queste tre vengono pure impostate la
1835 variabile \var{bsd}, che abilita la semantica omonima quando si invoca
1836 l'opzione \cmd{-f} (il valore preimpostato è nullo, ad indicare la semantica
1837 POSIX), e la variabile \var{cmd} che specifica la modalità di richiesta del
1838 lock (bloccante o meno), a seconda dell'opzione \cmd{-b}.
1839
1840 Il programma inizia col controllare (\texttt{\small 11--14}) che venga passato
1841 un parametro (il file da bloccare), che sia stato scelto (\texttt{\small
1842   15--18}) il tipo di lock, dopo di che apre (\texttt{\small 19}) il file,
1843 uscendo (\texttt{\small 20--23}) in caso di errore. A questo punto il
1844 comportamento dipende dalla semantica scelta; nel caso sia BSD occorre
1845 reimpostare il valore di \var{cmd} per l'uso con \func{flock}; infatti il
1846 valore preimpostato fa riferimento alla semantica POSIX e vale rispettivamente
1847 \const{F\_SETLKW} o \const{F\_SETLK} a seconda che si sia impostato o meno la
1848 modalità bloccante.
1849
1850 Nel caso si sia scelta la semantica BSD (\texttt{\small 25--34}) prima si
1851 controlla (\texttt{\small 27--31}) il valore di \var{cmd} per determinare se
1852 si vuole effettuare una chiamata bloccante o meno, reimpostandone il valore
1853 opportunamente, dopo di che a seconda del tipo di lock al valore viene
1854 aggiunta la relativa opzione (con un OR aritmetico, dato che \func{flock}
1855 vuole un argomento \param{operation} in forma di maschera binaria.  Nel caso
1856 invece che si sia scelta la semantica POSIX le operazioni sono molto più
1857 immediate, si prepara (\texttt{\small 36--40}) la struttura per il lock, e lo
1858 esegue (\texttt{\small 41}).
1859
1860 In entrambi i casi dopo aver richiesto il lock viene controllato il risultato
1861 uscendo (\texttt{\small 44--46}) in caso di errore, o stampando un messaggio
1862 (\texttt{\small 47--49}) in caso di successo. Infine il programma si pone in
1863 attesa (\texttt{\small 50}) finché un segnale (ad esempio un \cmd{C-c} dato da
1864 tastiera) non lo interrompa; in questo caso il programma termina, e tutti i
1865 lock vengono rilasciati.
1866
1867 Con il programma possiamo fare varie verifiche sul funzionamento del file
1868 locking; cominciamo con l'eseguire un read lock su un file, ad esempio usando
1869 all'interno di un terminale il seguente comando:
1870
1871 \vspace{1mm}
1872 \begin{minipage}[c]{12cm}
1873 \begin{verbatim}
1874 [piccardi@gont sources]$ ./flock -r Flock.c
1875 Lock acquired
1876 \end{verbatim}%$
1877 \end{minipage}\vspace{1mm}
1878 \par\noindent
1879 il programma segnalerà di aver acquisito un lock e si bloccherà; in questo
1880 caso si è usato il file locking POSIX e non avendo specificato niente riguardo
1881 alla sezione che si vuole bloccare sono stati usati i valori preimpostati che
1882 bloccano tutto il file. A questo punto se proviamo ad eseguire lo stesso
1883 comando in un altro terminale, e avremo lo stesso risultato. Se invece
1884 proviamo ad eseguire un write lock avremo:
1885
1886 \vspace{1mm}
1887 \begin{minipage}[c]{12cm}
1888 \begin{verbatim}
1889 [piccardi@gont sources]$ ./flock -w Flock.c
1890 Failed lock: Resource temporarily unavailable
1891 \end{verbatim}%$
1892 \end{minipage}\vspace{1mm}
1893 \par\noindent
1894 come ci aspettiamo il programma terminerà segnalando l'indisponibilità del
1895 lock, dato che il file è bloccato dal precedente read lock. Si noti che il
1896 risultato è lo stesso anche se si richiede il blocco su una sola parte del
1897 file con il comando:
1898
1899 \vspace{1mm}
1900 \begin{minipage}[c]{12cm}
1901 \begin{verbatim}
1902 [piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c
1903 Failed lock: Resource temporarily unavailable
1904 \end{verbatim}%$
1905 \end{minipage}\vspace{1mm}
1906 \par\noindent
1907 se invece blocchiamo una regione con: 
1908
1909 \vspace{1mm}
1910 \begin{minipage}[c]{12cm}
1911 \begin{verbatim}
1912 [piccardi@gont sources]$ ./flock -r -s0 -l10 Flock.c
1913 Lock acquired
1914 \end{verbatim}%$
1915 \end{minipage}\vspace{1mm}
1916 \par\noindent
1917 una volta che riproviamo ad acquisire il write lock i risultati dipenderanno
1918 dalla regione richiesta; ad esempio nel caso in cui le due regioni si
1919 sovrappongono avremo che:
1920
1921 \vspace{1mm}
1922 \begin{minipage}[c]{12cm}
1923 \begin{verbatim}
1924 [piccardi@gont sources]$ ./flock -w -s5 -l15  Flock.c
1925 Failed lock: Resource temporarily unavailable
1926 \end{verbatim}%$
1927 \end{minipage}\vspace{1mm}
1928 \par\noindent
1929 ed il lock viene rifiutato, ma se invece si richiede una regione distinta
1930 avremo che:
1931
1932 \vspace{1mm}
1933 \begin{minipage}[c]{12cm}
1934 \begin{verbatim}
1935 [piccardi@gont sources]$ ./flock -w -s11 -l15  Flock.c
1936 Lock acquired
1937 \end{verbatim}%$
1938 \end{minipage}\vspace{1mm}
1939 \par\noindent
1940 ed il lock viene acquisito. Se a questo punto si prova ad eseguire un read
1941 lock che comprende la nuova regione bloccata in scrittura:
1942
1943 \vspace{1mm}
1944 \begin{minipage}[c]{12cm}
1945 \begin{verbatim}
1946 [piccardi@gont sources]$ ./flock -r -s10 -l20 Flock.c
1947 Failed lock: Resource temporarily unavailable
1948 \end{verbatim}%$
1949 \end{minipage}\vspace{1mm}
1950 \par\noindent
1951 come ci aspettiamo questo non sarà consentito.
1952
1953 Il programma di norma esegue il tentativo di acquisire il lock in modalità non
1954 bloccante, se però usiamo l'opzione \cmd{-b} possiamo impostare la modalità
1955 bloccante, riproviamo allora a ripetere le prove precedenti con questa
1956 opzione:
1957
1958 \vspace{1mm}
1959 \begin{minipage}[c]{12cm}
1960 \begin{verbatim}
1961 [piccardi@gont sources]$ ./flock -r -b -s0 -l10 Flock.c Lock acquired
1962 \end{verbatim}%$
1963 \end{minipage}\vspace{1mm}
1964 \par\noindent
1965 il primo comando acquisisce subito un read lock, e quindi non cambia nulla, ma
1966 se proviamo adesso a richiedere un write lock che non potrà essere acquisito
1967 otterremo:
1968
1969 \vspace{1mm}
1970 \begin{minipage}[c]{12cm}
1971 \begin{verbatim}
1972 [piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c
1973 \end{verbatim}%$
1974 \end{minipage}\vspace{1mm}
1975 \par\noindent
1976 il programma cioè si bloccherà nella chiamata a \func{fcntl}; se a questo
1977 punto rilasciamo il precedente lock (terminando il primo comando un
1978 \texttt{C-c} sul terminale) potremo verificare che sull'altro terminale il
1979 lock viene acquisito, con la comparsa di una nuova riga:
1980
1981 \vspace{1mm}
1982 \begin{minipage}[c]{12cm}
1983 \begin{verbatim}
1984 [piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c
1985 Lock acquired
1986 \end{verbatim}%$
1987 \end{minipage}\vspace{3mm}
1988 \par\noindent
1989
1990 Un'altra cosa che si può controllare con il nostro programma è l'interazione
1991 fra i due tipi di lock; se ripartiamo dal primo comando con cui si è ottenuto
1992 un lock in lettura sull'intero file, possiamo verificare cosa succede quando
1993 si cerca di ottenere un lock in scrittura con la semantica BSD:
1994
1995 \vspace{1mm}
1996 \begin{minipage}[c]{12cm}
1997 \begin{verbatim}
1998 [root@gont sources]# ./flock -f -w Flock.c
1999 Lock acquired
2000 \end{verbatim}
2001 \end{minipage}\vspace{1mm}
2002 \par\noindent
2003 che ci mostra come i due tipi di lock siano assolutamente indipendenti; per
2004 questo motivo occorre sempre tenere presente quale fra le due semantiche
2005 disponibili stanno usando i programmi con cui si interagisce, dato che i lock
2006 applicati con l'altra non avrebbero nessun effetto.
2007
2008
2009
2010 \subsection{La funzione \func{lockf}}
2011 \label{sec:file_lockf}
2012
2013 Abbiamo visto come l'interfaccia POSIX per il file locking sia molto più
2014 potente e flessibile di quella di BSD, questo comporta anche una maggiore
2015 complessità per via delle varie opzioni da passare a \func{fcntl}. Per questo
2016 motivo è disponibile anche una interfaccia semplificata (ripresa da System V)
2017 che utilizza la funzione \funcd{lockf}, il cui prototipo è:
2018 \begin{prototype}{sys/file.h}{int lockf(int fd, int cmd, off\_t len)}
2019   
2020   Applica, controlla o rimuove un \textit{file lock} sul file \param{fd}.
2021   
2022   \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
2023     errore, nel qual caso \var{errno} assumerà uno dei valori:
2024     \begin{errlist}
2025     \item[\errcode{EWOULDBLOCK}] Non è possibile acquisire il lock, e si è
2026       selezionato \const{LOCK\_NB}, oppure l'operazione è proibita perché il
2027       file è mappato in memoria.
2028     \item[\errcode{ENOLCK}] Il sistema non ha le risorse per il locking: ci
2029       sono troppi segmenti di lock aperti, si è esaurita la tabella dei lock.
2030     \end{errlist}
2031     ed inoltre \errval{EBADF}, \errval{EINVAL}.
2032   }
2033 \end{prototype}
2034
2035 Il comportamento della funzione dipende dal valore dell'argomento \param{cmd},
2036 che specifica quale azione eseguire; i valori possibili sono riportati in
2037 \tabref{tab:file_lockf_type}.
2038
2039 \begin{table}[htb]
2040   \centering
2041   \footnotesize
2042   \begin{tabular}[c]{|l|p{7cm}|}
2043     \hline
2044     \textbf{Valore} & \textbf{Significato} \\
2045     \hline
2046     \hline
2047     \const{LOCK\_SH}& Richiede uno \textit{shared lock}. Più processi possono
2048                       mantenere un lock condiviso sullo stesso file.\\
2049     \const{LOCK\_EX}& Richiede un \textit{exclusive lock}. Un solo processo
2050                       alla volta può mantenere un lock esclusivo su un file. \\
2051     \const{LOCK\_UN}& Sblocca il file.\\
2052     \const{LOCK\_NB}& Non blocca la funzione quando il lock non è disponibile,
2053                       si specifica sempre insieme ad una delle altre operazioni
2054                       con un OR aritmetico dei valori.\\ 
2055     \hline    
2056   \end{tabular}
2057   \caption{Valori possibili per l'argomento \param{cmd} di \func{lockf}.}
2058   \label{tab:file_lockf_type}
2059 \end{table}
2060
2061 Qualora il lock non possa essere acquisito, a meno di non aver specificato
2062 \const{LOCK\_NB}, la funzione si blocca fino alla disponibilità dello stesso.
2063 Dato che la funzione è implementata utilizzando \func{fcntl} la semantica
2064 delle operazioni è la stessa di quest'ultima (pertanto la funzione non è
2065 affatto equivalente a \func{flock}).
2066
2067
2068
2069 \subsection{Il \textit{mandatory locking}}
2070 \label{sec:file_mand_locking}
2071
2072 Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4,
2073 per introdurre un file locking che, come dice il nome, fosse effettivo
2074 indipendentemente dai controlli eseguiti da un processo. Con il
2075 \textit{mandatory locking} infatti è possibile far eseguire il blocco del file
2076 direttamente al sistema, così che, anche qualora non si predisponessero le
2077 opportune verifiche nei processi, questo verrebbe comunque rispettato.
2078
2079 Per poter utilizzare il \textit{mandatory locking} è stato introdotto un
2080 utilizzo particolare del bit \acr{sgid}. Se si ricorda quanto esposto in
2081 \secref{sec:file_suid_sgid}), esso viene di norma utilizzato per cambiare il
2082 group-ID effettivo con cui viene eseguito un programma, ed è pertanto sempre
2083 associato alla presenza del permesso di esecuzione per il gruppo. Impostando
2084 questo bit su un file senza permesso di esecuzione in un sistema che supporta
2085 il \textit{mandatory locking}, fa sì che quest'ultimo venga attivato per il
2086 file in questione. In questo modo una combinazione dei permessi
2087 originariamente non contemplata, in quanto senza significato, diventa
2088 l'indicazione della presenza o meno del \textit{mandatory
2089   locking}.\footnote{un lettore attento potrebbe ricordare quanto detto in
2090   \secref{sec:file_chmod} e cioè che il bit \acr{sgid} viene cancellato (come
2091   misura di sicurezza) quando di scrive su un file, questo non vale quando
2092   esso viene utilizzato per attivare il \textit{mandatory locking}.}
2093
2094 L'uso del \textit{mandatory locking} presenta vari aspetti delicati, dato che
2095 neanche root può passare sopra ad un lock; pertanto un processo che blocchi un
2096 file cruciale può renderlo completamente inaccessibile, rendendo completamente
2097 inutilizzabile il sistema\footnote{il problema si potrebbe risolvere
2098   rimuovendo il bit \acr{sgid}, ma non è detto che sia così facile fare questa
2099   operazione con un sistema bloccato.} inoltre con il \textit{mandatory
2100   locking} si può bloccare completamente un server NFS richiedendo una lettura
2101 su un file su cui è attivo un lock. Per questo motivo l'abilitazione del
2102 mandatory locking è di norma disabilitata, e deve essere attivata filesystem
2103 per filesystem in fase di montaggio (specificando l'apposita opzione di
2104 \func{mount} riportata in \tabref{tab:sys_mount_flags}, o con l'opzione
2105 \cmd{mand} per il comando).
2106
2107 Si tenga presente inoltre che il \textit{mandatory locking} funziona solo
2108 sull'interfaccia POSIX di \func{fcntl}. Questo ha due conseguenze: che non si
2109 ha nessun effetto sui lock richiesti con l'interfaccia di \func{flock}, e che
2110 la granularità del lock è quella del singolo byte, come per \func{fcntl}.
2111
2112 La sintassi di acquisizione dei lock è esattamente la stessa vista in
2113 precedenza per \func{fcntl} e \func{lockf}, la differenza è che in caso di
2114 mandatory lock attivato non è più necessario controllare la disponibilità di
2115 accesso al file, ma si potranno usare direttamente le ordinarie funzioni di
2116 lettura e scrittura e sarà compito del kernel gestire direttamente il file
2117 locking.
2118
2119 Questo significa che in caso di read lock la lettura dal file potrà avvenire
2120 normalmente con \func{read}, mentre una \func{write} si bloccherà fino al
2121 rilascio del lock, a meno di non aver aperto il file con \const{O\_NONBLOCK},
2122 nel qual caso essa ritornerà immediatamente con un errore di \errcode{EAGAIN}.
2123
2124 Se invece si è acquisito un write lock tutti i tentativi di leggere o scrivere
2125 sulla regione del file bloccata fermeranno il processo fino al rilascio del
2126 lock, a meno che il file non sia stato aperto con \const{O\_NONBLOCK}, nel
2127 qual caso di nuovo si otterrà un ritorno immediato con l'errore di
2128 \errcode{EAGAIN}.
2129
2130 Infine occorre ricordare che le funzioni di lettura e scrittura non sono le
2131 sole ad operare sui contenuti di un file, e che sia \func{creat} che
2132 \func{open} (quando chiamata con \const{O\_TRUNC}) effettuano dei cambiamenti,
2133 così come \func{truncate}, riducendone le dimensioni (a zero nei primi due
2134 casi, a quanto specificato nel secondo). Queste operazioni sono assimilate a
2135 degli accessi in scrittura e pertanto non potranno essere eseguite (fallendo
2136 con un errore di \errcode{EAGAIN}) su un file su cui sia presente un qualunque
2137 lock (le prime due sempre, la terza solo nel caso che la riduzione delle
2138 dimensioni del file vada a sovrapporsi ad una regione bloccata).
2139
2140 L'ultimo aspetto della interazione del \textit{mandatory locking} con le
2141 funzioni di accesso ai file è quello relativo ai file mappati in memoria (che
2142 abbiamo trattato in \secref{sec:file_memory_map}); anche in tal caso infatti,
2143 quando si esegue la mappatura con l'opzione \const{MAP\_SHARED}, si ha un
2144 accesso al contenuto del file. Lo standard SVID prevede che sia impossibile
2145 eseguire il memory mapping di un file su cui sono presenti dei
2146 lock\footnote{alcuni sistemi, come HP-UX, sono ancora più restrittivi e lo
2147   impediscono anche in caso di \textit{advisory locking}, anche se questo
2148   comportamento non ha molto senso, dato che comunque qualunque accesso
2149   diretto al file è consentito.} in Linux è stata però fatta la scelta
2150 implementativa\footnote{per i dettagli si possono leggere le note relative
2151   all'implementazione, mantenute insieme ai sorgenti del kernel nel file
2152   \file{Documentation/mandatory.txt}.}  di seguire questo comportamento
2153 soltanto quando si chiama \func{mmap} con l'opzione \const{MAP\_SHARED} (nel
2154 qual caso la funzione fallisce con il solito \errcode{EAGAIN}) che comporta la
2155 possibilità di modificare il file.
2156 \index{file!locking|)}
2157
2158
2159
2160
2161 %%% Local Variables: 
2162 %%% mode: latex
2163 %%% TeX-master: "gapil"
2164 %%% End: