X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=2a2d9162862cd5f380e6b98f5a102026b2ba4235;hp=ea80eb79f746f35335adbc777b8a36fad6ac0fa4;hb=4693c008411fc78ee1df605820a151d0adfa5c18;hpb=b962dde7e38380bb770e6625d2b211e7c14a52e4 diff --git a/fileadv.tex b/fileadv.tex index ea80eb7..2a2d916 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1233,9 +1233,38 @@ 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 blocco 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 di \param{operation}, +che è espresso come maschera binaria,