sovrapposizioni, e garantire la atomicità delle operazioni di scrittura.
+
\subsection{L'\textit{advisory locking}}
\label{sec:file_record_locking}
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.
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}.
}
\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]
\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
}
\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. */
-
-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}