From: Simone Piccardi Date: Sun, 17 Nov 2002 21:37:15 +0000 (+0000) Subject: Altri esempi di locking X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=6f6eab8c180eab2c8456261cb21bfd1b8f719705 Altri esempi di locking --- diff --git a/fileadv.tex b/fileadv.tex index 43451b7..454e595 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1793,7 +1793,6 @@ invece che si sia scelta la semantica POSIX le operazioni sono molto pi immediate, si prepara (\texttt{\small 36--40}) la struttura per il lock, e lo esegue (\texttt{\small 41}). - In entrambi i casi dopo aver richiesto il lock viene controllato il risultato uscendo (\texttt{\small 44--46}) in caso di errore, o stampando un messaggio (\texttt{\small 47--49}) in caso di successo. Infine il programma si pone in @@ -1801,6 +1800,148 @@ attesa (\texttt{\small 50}) finch tastiera) non lo interrompa; in questo caso il programma termina, e tutti i lock vengono rilasciati. +Con il programma possiamo fare varie verifiche sul funzionamento del file +locking; cominciamo con l'eseguire un read lock su un file, ad esempio usando +all'interno di un terminale il seguente comando: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -r Flock.c +Lock acquired +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +il programma segnalerà di aver acquisito un lock e si bloccherà; in questo +caso si è usato il file locking POSIX e non avendo specificato niente riguardo +alla sezione che si vuole bloccare sono stati usati i valori preimpostati che +bloccano tutto il file. A questo punto se proviamo ad eseguire lo stesso +comando in un altro terminale, e avremo lo stesso risultato. Se invece +proviamo ad eseguire un write lock avremo: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w Flock.c +Failed lock: Resource temporarily unavailable +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +come ci aspettiamo il programma terminerà segnalando l'indisponibilità del +lock, dato che il file è bloccato dal precedente read lock. Si noti che il +risultato è lo stesso anche se si richiede il blocco su una sola parte del +file con il comando: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c +Failed lock: Resource temporarily unavailable +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +se invece blocchiamo una regione con: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -r -s0 -l10 Flock.c +Lock acquired +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +una volta che riproviamo ad acquisire il write lock i risultati dipenderanno +dalla regione richiesta; ad esempio nel caso in cui le due regioni si +sovrappongono avremo che: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w -s5 -l15 Flock.c +Failed lock: Resource temporarily unavailable +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +ed il lock viene rifiutato, ma se invece si richiede una regione distinta +avremo che: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w -s11 -l15 Flock.c +Lock acquired +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +ed il lock viene acquisito. Se a questo punto si prova ad eseguire un read +lock che comprende la nuova regione bloccata in scrittura: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -r -s10 -l20 Flock.c +Failed lock: Resource temporarily unavailable +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +come ci aspettimo questo non sarà consentito. + +Il programma di norma esegue il tentativo di acquisire il lock in modalità non +bloccante, se però usiamo l'opzione \cmd{-b} possiamo impostare la modalità +bloccante, riproviamo allora a ripetere le prove precedenti con questa +opzione: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -r -b -s0 -l10 Flock.c Lock acquired +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +il primo comando acquisisce subito un read lock, e quindi non cambia nulla, ma +se proviamo adesso a richidere un write lock che non potrà essere acquisito +otterremo: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c +\end{verbatim}%$ +\end{minipage}\vspace{1mm} +\par\noindent +il programma cioè si bloccherà nella chiamata a \func{fcntl}; se a questo +punto rilasciamo il precedente lock (terminando il primo comando un +\texttt{C-c} sul terminale) potremo verificare che sull'altro terminale il +lock viene acquisito, con la comparsa di una nuova riga: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[piccardi@gont sources]$ ./flock -w -s0 -l10 Flock.c +Lock acquired +\end{verbatim}%$ +\end{minipage}\vspace{3mm} +\par\noindent + +Un'altra cosa che si può controllare con il nostro programma è l'interazione +fra i due tipi di lock; se ripartiamo dal primo comando con cui si è ottenuto +un lock in lettura sull'intero file, possiamo verificare cosa succede quando +si cerca di ottenere un lock in scrittura con la semantica BSD: + +\vspace{1mm} +\begin{minipage}[c]{12cm} +\begin{verbatim} +[root@gont sources]# ./flock -f -w Flock.c +Lock acquired +\end{verbatim} +\end{minipage}\vspace{1mm} +\par\noindent +che ci mostra come i due tipi di lock siano assolutamente indipendenti; per +questo motivo occorre sempre tenere presente quale delle due semantiche +disponibili stanno usando i programmi con cui si interagisce, dato che +applicare dei lock usando l'altra non avrebbe nessun effetto. + + \subsection{La funzione \func{lockf}} \label{sec:file_lockf} diff --git a/macro.tex b/macro.tex index 33640c5..c40e18c 100644 --- a/macro.tex +++ b/macro.tex @@ -67,7 +67,6 @@ } \newenvironment{errlist}{\begin{basedescript}{\desclabelwidth{1.5cm}}} {\end{basedescript}} - % % Slighty different envirnoment to be used for multi-header, % multi-functions boxed description @@ -78,6 +77,7 @@ \begin{description*}{}{} \baselineskip=0pt \item \vspace{-4pt} } +% \newenvironment{functions} {% defining what is done by \begin \center