Iniziata memoria condivisa
[gapil.git] / fileadv.tex
index 084f783b64f561fb0f5928646d3fd508a60f5be8..3d1c9f85c65c7571f55ff6e9e6587a33622872f8 100644 (file)
@@ -33,7 +33,8 @@ affrontare nelle operazioni di I/O, che 
 devono eseguire operazioni che possono bloccarsi su più file descriptor:
 mentre si è bloccati su uno di essi su di un'altro potrebbero essere presenti
 dei dati; così che nel migliore dei casi si avrebbe una lettura ritardata
-inutilmente, e nel peggiore si potrebbe addirittura arrivare ad un deadlock.
+inutilmente, e nel peggiore si potrebbe addirittura arrivare ad un
+\textit{deadlock}.
 
 Abbiamo già accennato in \secref{sec:file_open} che è possibile prevenire
 questo tipo di comportamento aprendo un file in modalità
@@ -976,7 +977,8 @@ come maschera binaria ottenuta dall'OR di uno o pi
                              riportati sul file. Ne viene fatta una copia
                              privata cui solo il processo chiamante ha
                              accesso.  Le modifiche sono mantenute attraverso
-                             il meccanismo del \textit{copy on write} e
+                             il meccanismo del 
+                             \textit{copy on write}\index{copy on write} e
                              salvate su swap in caso di necessità. Non è
                              specificato se i cambiamenti sul file originale
                              vengano riportati sulla regione
@@ -988,7 +990,8 @@ come maschera binaria ottenuta dall'OR di uno o pi
     \macro{MAP\_EXECUTABLE}& Ignorato. \\
     \macro{MAP\_NORESERVE} & Si usa con \macro{MAP\_PRIVATE}. Non riserva
                              delle pagine di swap ad uso del meccanismo di
-                             \textit{copy on write} per mantenere le
+                             \textit{copy on write}\index{copy on write}
+                             per mantenere le
                              modifiche fatte alla regione mappata, in
                              questo caso dopo una scrittura, se non c'è più
                              memoria disponibile, si ha l'emissione di
@@ -1234,8 +1237,8 @@ sovrapposizioni, e garantire la atomicit
 
 La prima modalità di file locking che è stata implementata nei sistemi
 unix-like è quella che viene usualmente chiamata \textit{advisory
-  locking},\footnote{Stevens in APUE fa riferimento a questo argomento come al
-  \textit{record locking}, dizione utilizzata anche dal manuale delle
+  locking},\footnote{Stevens in \cite{APUE} fa riferimento a questo argomento
+  come al \textit{record locking}, dizione utilizzata anche dal manuale delle
   \acr{glibc}; nelle pagine di manuale si parla di \textit{discretionary file
     lock} per \func{fcntl} e di \textit{advisory locking} per \func{flock},
   mentre questo nome viene usato anche da Stevens per riferirsi al
@@ -1272,7 +1275,7 @@ sono implementati in maniera completamente indipendente nelle due interfacce,
 che pertanto possono coesistere senza interferenze.
 
 Entrambe le interfacce prevedono la stessa procedura di funzionamento: si
-inizia sempre con il richiere l'opportuno \textit{file lock} (un
+inizia sempre con il richiedere l'opportuno \textit{file lock} (un
 \textit{exclusive lock} per una scrittura, uno \textit{shared lock} per una
 lettura) prima di eseguire l'accesso ad un file.  Se il lock viene acquisito
 il processo prosegue l'esecuzione, altrimenti (a meno di non aver richiesto un
@@ -1329,14 +1332,14 @@ costanti riportate in \tabref{tab:file_flock_operation}.
 I primi due valori, \macro{LOCK\_SH} e \macro{LOCK\_EX} permettono di
 richiedere un \textit{file lock}, ed ovviamente devono essere usati in maniera
 alternativa. Se si specifica anche \macro{LOCK\_NB} la funzione non si
-bloccherà qualora il lock non possa essere aqcuisito, ma ritornerà subito con
+bloccherà qualora il lock non possa essere acquisito, ma ritornerà subito con
 un errore di \macro{EWOULDBLOCK}. Per rilasciare un lock si dovrà invece usare
 \macro{LOCK\_NB}.
 
 La semantica del file locking di BSD è diversa da quella del file locking
 POSIX, in particolare per quanto riguarda il comportamento dei lock nei
 confronti delle due funzioni \func{dup} e \func{fork}.  Per capire queste
-differenze occore prima descrivere con maggiore dettaglio come viene
+differenze occorre prima descrivere con maggiore dettaglio come viene
 realizzato il file locking nel kernel.
 
 In \figref{fig:file_flock_struct} si è riportato uno schema essenziale
@@ -1473,7 +1476,7 @@ struct flock {
 
 L'operazione effettivamente svolta dalla funzione è stabilita dal valore
 dall'argomento \param{cmd} che, come già riportato in \secref{sec:file_fcntl},
-specifica l'azione da compiere; i valori relativi al file loking sono tre:
+specifica l'azione da compiere; i valori relativi al file locking sono tre:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \item[\macro{F\_GETLK}] verifica se il file lock specificato dalla struttura
   puntata da \param{lock} non è bloccato da qualche altro lock: in caso
@@ -1574,15 +1577,15 @@ allo stesso file (che sia stato ottenuto con una \func{dup} o con una
 che quello che conta è solo il \acr{pid} del processo. Da questo deriva una
 ulteriore sottile differenza di comportamento: dato che alla chiusura di un
 file i lock ad esso associati vengono rimossi, nella semantica POSIX basterà
-chiudere un file descriptor per cancellare tutti i lock realtivi al file cui
+chiudere un file descriptor per cancellare tutti i lock relativi al file cui
 esso faceva riferimento, anche se questi fossero stati creati usando altri
 file descriptor che restano aperti.
 
-Come abbiamo visto come l'interfaccia POSIX per il file locking sia molto più
+Abbiamo visto come l'interfaccia POSIX per il file locking sia molto più
 potente e flessibile di quella di BSD, ma è anche molto più complicata da
-usare, specie in tutti quei casi in cui non si vogliono bloccare sezioni
-separate di file. Per questo, seguendo System V, è disponibile una interfaccia
-semplificata grazie alla funzione \func{lockf}, il cui prototipo è:
+usare. Per questo motivo è disponibile anche una interfaccia semplificata
+(ripresa da System V) che utilizza la funzione \func{lockf}, il cui prototipo
+è:
 \begin{prototype}{sys/file.h}{int lockf(int fd, int cmd, off\_t len)}
   
   Applica, controlla o rimuove un \textit{file lock} sul file \param{fd}.
@@ -1604,6 +1607,34 @@ semplificata grazie alla funzione \func{lockf}, il cui prototipo 
 
 Il comportamento della funzione dipende dal valore dell'argomento \param{cmd}
 che specifica quale azione eseguire; i valori possibili sono riportati in 
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|l|}
+    \hline
+    \textbf{Valore} & \textbf{Significato} \\
+    \hline
+    \hline
+    \macro{F\_LOCK} & Richiede un \textit{exclusive lock}. Se non può essere
+                      ottenuto a causa di un lock preesistente la funzione
+                      blocca il processo chiamante fino al rilascio di
+                      quest'ultimo. \\
+    \macro{F\_TLOCK}& Stesso comportamento di \macro{F\_LOCK} ma la funzione
+                      ritorna sempre subito, segnalando un errore quando il
+                      lock non può essere acquisito. \\
+    \macro{F\_ULOCK}& Sblocca il file.\\
+    \macro{F\_TEST} & Controlla il lock, la funzione restituisce 0 se il file
+                      non ha lock, o i lock appartengono al processo corrente,
+                      e -1, con un errore di \macro{EACCES}, se altri processi
+                      detengono un lock sul file.\\ 
+    \hline    
+  \end{tabular}
+  \caption{Valori possibili per il campo \var{cmd} di \func{lockf}.}
+  \label{tab:file_lockf_type}
+\end{table}
+
+
+
 
 \subsection{Il \textit{mandatory locking}}
 \label{sec:file_mand_locking}