Tabella delle operazioni di flock
[gapil.git] / fileadv.tex
index ea80eb79f746f35335adbc777b8a36fad6ac0fa4..7ff5ff72f9ac965bb3682fa455e3d4d8e73b30aa 100644 (file)
@@ -1233,9 +1233,67 @@ sovrapposizioni, e garantire la atomicit
 
 La prima modalità di file locking che è stata implementata nei sistemi
 unix-like è quella che viene usualmente chiamata \textit{advisory locking}, in
-quanto è il processo, e non il sistema, che si incarica di verificare se
-esiste una condizione di blocco per l'accesso ai file.
+quanto sono i singoli processi, e non il sistema, che si incaricano di
+asserire e verificare se esistono delle condizioni di blocco per l'accesso ai
+file. Questo significa che le funzioni \func{read} o \func{write} non
+risentono affatto della presenza di un eventuale blocco, e che sta ai vari
+processi controllare esplicitamente lo stato dei file condivisi prima di
+accedervi ed implementare opportunamente un protocollo di accesso.
+
+In Linux sono disponibili due interfacce per utilizzare l'\textit{advisory
+  locking}, la prima è quella derivata da BSD, che è basata sulla funzione
+\func{flock}, la seconda è quella standardizzata da POSIX.1 (originaria di
+System V), che è basata sulla funzione \func{fcntl}.  I \textit{file lock}
+sono implementati in maniera completamente indipendente nelle due interfacce,
+che pertanto possono coesistere senza interferenze.
+
+L'interfaccia classica usata da BSD permette di eseguire il blocco solo su un
+intero file, come accennato essa è basata sulla funzione \func{flock}, il cui
+prototipo è:
+\begin{prototype}{sys/file.h}{int flock(int fd, int operation)}
+  
+  Applica o rimuove un \textit{file lock} sul file \param{fd}.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo, e -1 in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+    \begin{errlist}
+    \item[\macro{EWOULDBLOCK}] Il file ha già un blocco attivo, e si è
+      specificato \macro{LOCK\_NB}.
+    \end{errlist}
+  }
+\end{prototype}
+
+Il comportamento della funzione è specificato dal valore dell'argomento
+\param{operation}, da passare come maschera binaria dei valori riportati in 
+\tabref{tab:file_flock_operation}.
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|l|}
+    \hline
+    \textbf{Valore} & \textbf{Significato} \\
+    \hline
+    \hline
+    \macro{LOCK\_SH} & Asserisce uno \textit{shared lock} (blocco
+                       condiviso) sul file. Un blocco condiviso può essere
+                       mantenuto da più processi contemporaneamente.\\ 
+    \macro{LOCK\_EX} & Asserisce un \textit{esclusive lock} (blocco
+                       esclusivo) sul file. Un blocco esclusivo può essere
+                       mantenuto da un solo processo alla volta.\\
+    \macro{LOCK\_UN} & Sblocca il file.\\
+    \macro{LOCK\_NB} & Impedisce che la funzione si blocchi nella
+                       richiesta di un \textit{file lock}.\\
+    \hline    
+  \end{tabular}
+  \caption{Valori dell'argomento \param{operation} di \func{flock}.}
+  \label{tab:file_flock_operation}
+\end{table}
+
 
+Si tenga conto che la funzione non è in grado di eseguire un blocco su NFS, in
+tal caso occorre usare \func{fcntl} che funziona anche attraverso NFS, posto
+che il server supporti il \textit{file locking}.