From f2dfb330dfc756851edc4eecf828a435e7f5f279 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 18 Nov 2002 23:54:01 +0000 Subject: [PATCH 1/1] Chiarimenti sui permessi di accesso. --- fileadv.tex | 27 +++++++++++++++++---------- sources/Flock.c | 4 ++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 5ef95b0..811d9b1 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1307,6 +1307,11 @@ comportamento non bloccante) viene posto in stato di sleep. Una volta finite le operazioni sul file si deve provvedere a rimuovere il lock. La situazione delle varie possibilità è riassunta in \tabref{tab:file_file_lock}. +Si tenga presente infine che il controllo di accesso è effettuato quando si +apre un file, l'unico controllo residuo è che il tipo di lock che si vuole +otternere deve essere compatibile con le modalità di apertura dello stesso (di +lettura per un read lock e di scrittura per un write lock). + %% Si ricordi che %% la condizione per acquisire uno \textit{shared lock} è che il file non abbia %% già un \textit{exclusive lock} attivo, mentre per acquisire un @@ -1388,7 +1393,7 @@ stesso file. \begin{figure}[htb] \centering - \includegraphics[width=13cm]{img/file_flock} + \includegraphics[width=12.5cm]{img/file_flock} \caption{Schema dell'architettura del file locking, nel caso particolare del suo utilizzo da parte dalla funzione \func{flock}.} \label{fig:file_flock_struct} @@ -1612,7 +1617,7 @@ questo motivo il kernel si incarica di rilevare situazioni di questo tipo, ed impedirle restituendo un errore di \macro{EDEADLK} alla funzione che cerca di acquisire un lock che porterebbe ad un \textit{deadlock}. -\begin{figure}[htb] +\begin{figure}[!bht] \centering \includegraphics[width=13cm]{img/file_posix_lock} \caption{Schema dell'architettura del file locking, nel caso particolare del suo utilizzo secondo l'interfaccia standard POSIX.} @@ -1781,7 +1786,7 @@ comportamento dipende dalla semantica scelta; nel caso sia BSD occorre reimpostare il valore di \var{cmd} per l'uso con \func{flock}; infatti il valore preimpostato fa riferimento alla semantica POSIX e vale rispettivamente \macro{F\_SETLKW} o \macro{F\_SETLK} a seconda che si sia impostato o meno la -modalità bloccante. +modalità bloccante. Nel caso si sia scelta la semantica BSD (\texttt{\small 25--34}) prima si controlla (\texttt{\small 27--31}) il valore di \var{cmd} per determinare se @@ -2080,13 +2085,15 @@ quando si esegue la mappatura con l'opzione \macro{MAP\_SHARED}, si ha un accesso al contenuto del file. Lo standard SVID prevede che sia impossibile eseguire il memory mapping di un file su cui sono presenti dei lock\footnote{alcuni sistemi, come HP-UX, sono ancora più restrittivi e lo - impediscono anche in caso di \textit{advisory locking}, anche se questo non - ha molto senso.} in Linux è stata però fatta la scelta -implementativa\footnote{per i dettagli si possono leggere le note nel kernel, - mantenute nel file \file{Documentation/mandatory.txt}.} di seguire questo -comportamento soltanto quando si chiama \func{mmap} con l'opzione -\macro{MAP\_SHARED} (nel qual caso la funzione fallisce con il solito -\macro{EAGAIN}). + impediscono anche in caso di \textit{advisory locking}, anche se questo + comportamento non ha molto senso, dato che comunque qualunque accesso + diretto al file è consentito.} in Linux è stata però fatta la scelta +implementativa\footnote{per i dettagli si possono leggere le note relative + all'implementazione, mantenute insime ai sorgenti del kernel nel file + \file{Documentation/mandatory.txt}.} di seguire questo comportamento +soltanto quando si chiama \func{mmap} con l'opzione \macro{MAP\_SHARED} (nel +qual caso la funzione fallisce con il solito \macro{EAGAIN}) che comporta la +possibilità di modificare il file. diff --git a/sources/Flock.c b/sources/Flock.c index 8ea0ed5..55d84fe 100644 --- a/sources/Flock.c +++ b/sources/Flock.c @@ -26,7 +26,7 @@ * * Usage: flock -h give all info's * - * $Id: Flock.c,v 1.2 2002/11/17 17:30:51 piccardi Exp $ + * $Id: Flock.c,v 1.3 2002/11/18 23:54:01 piccardi Exp $ * *****************************************************************************/ /* @@ -111,7 +111,7 @@ int main(int argc, char *argv[]) printf("You should set a read or a write lock\n"); usage(); } - fd = open(argv[optind], O_RDWR); /* open the file to be locked */ + fd = open(argv[optind], O_RDONLY); /* open the file to be locked */ if (fd < 0) { /* on error exit */ perror("Wrong filename"); exit(1); -- 2.30.2