X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=f0d7570d95d4c74d4ab43dd1c235f0fae116f2ef;hp=454396284aeb4eda50e21e3bc3db924ad9e84ccc;hb=f67bf0a685d61f70c3536e1f258b96a658162f9e;hpb=cd905cd37ac75847fdbfcc6fb4d2fd094dd808b7 diff --git a/fileadv.tex b/fileadv.tex index 4543962..f0d7570 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1228,6 +1228,16 @@ bloccare l'accesso al file da parte di altri processi, cos sovrapposizioni, e garantire la atomicità delle operazioni di scrittura. + +\subsection{Il file locking in Linux} +\label{sec:file_linux_file_lock} + +L'implementazione del \textit{file locking} in Linux, benché perfettamente +funzionante, resta una sovrapposizione di diverse interfacce, risultante in +una complessità + + + \subsection{L'\textit{advisory locking}} \label{sec:file_record_locking} @@ -1293,8 +1303,10 @@ 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 -\tabref{tab:file_flock_operation}. +\param{operation}, da passare come maschera binaria dei valori riportati in +\tabref{tab:file_flock_operation}. Quando si chiude un file i lock esistenti +su di esso vengono sempre cancellati. + \begin{table}[htb] \centering @@ -1315,20 +1327,15 @@ Il comportamento della funzione \label{tab:file_flock_operation} \end{table} - -Con \func{flock} il blocco è associato direttamente al file (cioè rispetto -allo schema di \secref{sec:file_fd} fa riferimento all'inode e non al file -descriptor); pertanto sia \func{dup} che \func{fork} non creano altre istanze -del blocco ma piuttosto degli ulteriori riferimenti allo stesso \textit{file - lock}. - -La funzione blocca direttamente il file (cioè rispetto allo schema di -\secref{fig:file_stat_struct} fa riferimento alla struttura \var{file}, 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 \textit{file lock}. Questo comporta che un lock può essere rimosso -su uno qualunque dei file descriptor che fanno riferimento allo stesso file, -ed esso . +La funzione esegue il blocco direttamente il file (cioè rispetto allo schema +di \secref{fig:file_stat_struct} il blocco è mantenuto in riferimento alla +struttura \var{file}, 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 è @@ -1360,15 +1367,26 @@ 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. */ @@ -1385,12 +1403,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}