X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=fileadv.tex;h=7ff5ff72f9ac965bb3682fa455e3d4d8e73b30aa;hb=821f26c01a474d3e79c15855d855683c7b37085e;hp=ea80eb79f746f35335adbc777b8a36fad6ac0fa4;hpb=ce3357edd5e55104fcb94ce5de3c7325ab7b2564;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index ea80eb7..7ff5ff7 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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}.