X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=3d1c9f85c65c7571f55ff6e9e6587a33622872f8;hp=084f783b64f561fb0f5928646d3fd508a60f5be8;hb=d7d656d5cd4969c58126d2c35950a607c282e330;hpb=7b2cb0e324ea5531d490add25c6ffb2097f67099 diff --git a/fileadv.tex b/fileadv.tex index 084f783..3d1c9f8 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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}