X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=8ec9dc39ef9fe88d52bc17969c4ba5830fb2ea73;hp=0d6e2f08d1f3160ce34f94cd4b847d0ebc9526dd;hb=796a9f553337f614a14cbbcec7a112334d6b20da;hpb=933c31be4afaf6d54c982bd493195f9fb1b5c9b6 diff --git a/fileadv.tex b/fileadv.tex index 0d6e2f0..8ec9dc3 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1228,6 +1228,7 @@ bloccare l'accesso al file da parte di altri processi, cos sovrapposizioni, e garantire la atomicità delle operazioni di scrittura. + \subsection{L'\textit{advisory locking}} \label{sec:file_record_locking} @@ -1246,12 +1247,12 @@ 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. +stato dei file condivisi prima di accedervi, implementando un opportuno +protocollo. 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 +\func{flock}, la seconda è quella standardizzata da POSIX.1 (derivata da 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. @@ -1261,24 +1262,25 @@ cosiddetto \textit{shared lock}, detto anche \textit{read lock} in quanto serve a bloccare l'accesso in scrittura su un file affinché non venga modificato mentre lo si legge. Si parla di \textsl{blocco condiviso} in quanto più processi possono richiedere contemporaneamente uno \textit{shared lock} -per proteggere un accesso in lettura. +su un file per proteggere il loro accesso in lettura. -La seconda è il cosiddetto \textit{exclusive lock}, detto anche \textit{write - lock} in quanto serve a bloccare l'accesso su un file da parte di altri (sia -in lettura che in scrittura) mentre lo si sta scrivendo. Si parla di -\textsl{blocco esclusivo} appunto perché un solo processo alla volta può -richiedere un \textit{exclusive lock} per proteggere un accesso in scrittura. +La seconda tipologia è il cosiddetto \textit{exclusive lock}, detto anche +\textit{write lock} in quanto serve a bloccare l'accesso su un file (sia in +lettura che in scrittura) da parte di altri processi mentre lo si sta +scrivendo. Si parla di \textsl{blocco esclusivo} appunto perché un solo +processo alla volta può richiedere un \textit{exclusive lock} su un file per +proteggere il suo accesso in scrittura. Entrambe le interfacce garantiscono che quando si richiede un \textit{file lock} su un file su cui ne sia già presente un altro che non ne consente l'acquisizione (uno \textit{shared lock} su un file con un \textit{exclusive - lock}, o un \textit{exclusive lock} su un file con altro \textit{file lock}) -la funzione blocca il processo fintanto che \textit{file lock} preesistente -non viene rimosso. + lock} attivo, o un \textit{exclusive lock} su un file con un qualunque +blocco attivo) la funzione blocca il processo fintanto che \textit{file lock} +preesistente non viene rimosso. -L'interfaccia classica usata da BSD permette di eseguire il blocco solo su un -intero file, funzione usata per richiedere e rimuovere un \textit{file lock} è -\func{flock}, il cui prototipo è: +La prima interfaccia, quella derivata da BSD, permette di eseguire il blocco +solo su di un intero file; funzione usata per richiedere e rimuovere un +\textit{file lock} è \func{flock}, ed il suo prototipo è: \begin{prototype}{sys/file.h}{int flock(int fd, int operation)} Applica o rimuove un \textit{file lock} sul file \param{fd}. @@ -1292,8 +1294,9 @@ intero file, funzione usata per richiedere e rimuovere un \textit{file lock} } \end{prototype} -Il comportamento della funzione è specificato dal valore dell'argomento -\param{operation}, da passare come maschera binaria dei valori riportati in +La funzione può essere usata per acquisire o rilasciare un blocco a seconda di +quanto specificato tramite il valore dell'argomento \param{operation}, questo +deve essere passato come maschera binaria dei valori riportati in \tabref{tab:file_flock_operation}. \begin{table}[htb] @@ -1315,10 +1318,16 @@ Il comportamento della funzione \label{tab:file_flock_operation} \end{table} -La funzione blocca direttamente il file (cioè rispetto allo schema di -\secref{fig:file_stat_struct} fa riferimento all'inode, non al file -descriptor). Pertanto sia \func{dup} che \func{fork} non creano altre istanze -di un \textit{file lock}. +Si tenga presente che la funzione blocca direttamente un file (cioè, rispetto +allo schema di \secref{fig:file_stat_struct}, il blocco è mantenuto in +riferimento alla struttura \var{file}, e non al file descriptor). Pertanto sia +\func{dup} che \func{fork} non creano ulteriori istanze di un \textit{file + lock} quanto piuttosto degli ulteriori riferimenti allo stesso. Questo +comporta che un \textit{file lock} può essere rimosso su uno qualunque dei +file descriptor che fanno riferimento allo stesso file: quindi se si toglie il +blocco in un processo figlio o su un file descriptor duplicato, questo sarà +cancellato rispettivamente anche nel processo padre e sul file descriptor +originario. La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo @@ -1349,15 +1358,27 @@ per } \end{prototype} +Si tenga presente che \func{flock} non è in grado di funzionare per i file +manetenuti su NFS, in questo caso, se si ha la necessità di eseguire il +\textit{file locking}, occorre usare l'interfaccia basata su \func{fcntl} che +può funzionare anche attraverso NFS, a condizione che sia il client che il +server supportino questa funzionalità. + +La standardizzatione operata con POSIX.1 ha adottato le API per il +\textit{file locking} originarie di System V, basate sulla funzione + + + Al contrario di \func{flock} con \func{fcntl} è possibile bloccare anche solo -delle sezioni di un file. La funzione prende come argomento +delle sezioni di un file. La funzione prende come argomento una struttura +\var{flock} la cui definizione è riportata in \figref{fig:struct_flock}. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{} -struct struct { +struct flock { short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */ short int l_whence; /* Where `l_start' is relative to (like `lseek'). */ off_t l_start; /* Offset where the lock begins. */ @@ -1374,12 +1395,6 @@ struct struct { - -Si tenga conto che \func{flock} non è in grado di eseguire il \textit{file - locking} su NFS, se si ha questa necessità occorre usare \func{fcntl} che -funziona anche attraverso NFS, posto che il server supporti il \textit{file - locking}. - \subsection{Il \textit{mandatory locking}} \label{sec:file_mand_locking}