X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=fileadv.tex;h=9d2626adfa8e663fb3b08b185ef3954eeab92622;hp=a4ca6e28ae80d4cd30656cb521cd36fa588be2c8;hb=8e2e77dff8f3cffb28ddf982280dff6fc015eb19;hpb=3cf93b3dfc49fbf8b16f908bee85fa2ecaea4e3f diff --git a/fileadv.tex b/fileadv.tex index a4ca6e2..9d2626a 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -296,8 +296,8 @@ descriptor, il \textit{file lock} non viene rilasciato. La seconda interfaccia per l'\textit{advisory locking} disponibile in Linux è quella standardizzata da POSIX, basata sulla funzione \func{fcntl}. Abbiamo già trattato questa funzione nelle sue molteplici possibilità di utilizzo in -sez.~\ref{sec:file_fcntl}. Quando la si impiega per il \textit{file locking} -essa viene usata solo secondo il seguente prototipo: +sez.~\ref{sec:file_fcntl_ioctl}. Quando la si impiega per il \textit{file + locking} essa viene usata solo secondo il seguente prototipo: \begin{prototype}{fcntl.h}{int fcntl(int fd, int cmd, struct flock *lock)} Applica o rimuove un \textit{file lock} sul file \param{fd}. @@ -390,8 +390,9 @@ viene usato solo in caso di lettura, quando si chiama \func{fcntl} con Oltre a quanto richiesto tramite i campi di \struct{flock}, l'operazione effettivamente svolta dalla funzione è stabilita dal valore dall'argomento -\param{cmd} che, come già riportato in sez.~\ref{sec:file_fcntl}, specifica -l'azione da compiere; i valori relativi al \textit{file locking} sono tre: +\param{cmd} che, come già riportato in sez.~\ref{sec:file_fcntl_ioctl}, +specifica l'azione da compiere; i valori relativi al \textit{file locking} +sono tre: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{F\_GETLK}] verifica se il \textit{file lock} specificato dalla struttura puntata da \param{lock} può essere acquisito: in caso negativo @@ -2458,7 +2459,7 @@ ottenute leggendo in maniera ordinaria il file descriptor con una \func{read}, \section{L'accesso \textsl{asincrono} ai file} -\label{sec:file_asyncronous_access} +\label{sec:file_asyncronous_operation} Benché l'\textit{I/O multiplexing} sia stata la prima, e sia tutt'ora una fra le più diffuse modalità di gestire l'I/O in situazioni complesse in cui si @@ -2474,7 +2475,7 @@ operazioni di I/O volute. \subsection{Il \textit{Signal driven I/O}} -\label{sec:file_asyncronous_operation} +\label{sec:file_signal_driven_io} \itindbeg{signal~driven~I/O} @@ -2482,12 +2483,12 @@ Abbiamo accennato in sez.~\ref{sec:file_open_close} che è definito un flag \const{O\_ASYNC}, che consentirebbe di aprire un file in modalità asincrona, anche se in realtà è opportuno attivare in un secondo tempo questa modalità impostando questo flag attraverso l'uso di \func{fcntl} con il comando -\const{F\_SETFL} (vedi sez.~\ref{sec:file_fcntl}).\footnote{l'uso del flag di - \const{O\_ASYNC} e dei comandi \const{F\_SETOWN} e \const{F\_GETOWN} per - \func{fcntl} è specifico di Linux e BSD.} In realtà parlare di apertura in -modalità asincrona non significa che le operazioni di lettura o scrittura del -file vengono eseguite in modo asincrono (tratteremo questo, che è ciò che più -propriamente viene chiamato \textsl{I/O asincrono}, in +\const{F\_SETFL} (vedi sez.~\ref{sec:file_fcntl_ioctl}).\footnote{l'uso del + flag di \const{O\_ASYNC} e dei comandi \const{F\_SETOWN} e \const{F\_GETOWN} + per \func{fcntl} è specifico di Linux e BSD.} In realtà parlare di apertura +in modalità asincrona non significa che le operazioni di lettura o scrittura +del file vengono eseguite in modo asincrono (tratteremo questo, che è ciò che +più propriamente viene chiamato \textsl{I/O asincrono}, in sez.~\ref{sec:file_asyncronous_io}), quanto dell'attivazione un meccanismo di notifica asincrona delle variazione dello stato del file descriptor aperto in questo modo. @@ -2498,7 +2499,7 @@ Quello che succede è che per tutti i file posti in questa modalità\footnote{si kernel 2.6, anche per fifo e pipe.} il sistema genera un apposito segnale, \signal{SIGIO}, tutte le volte che diventa possibile leggere o scrivere dal file descriptor che si è posto in questa modalità. Inoltre è possibile, come -illustrato in sez.~\ref{sec:file_fcntl}, selezionare con il comando +illustrato in sez.~\ref{sec:file_fcntl_ioctl}, selezionare con il comando \const{F\_SETOWN} di \func{fcntl} quale processo o quale gruppo di processi dovrà ricevere il segnale. In questo modo diventa possibile effettuare le operazioni di I/O in risposta alla ricezione del segnale, e non ci sarà più la @@ -2612,7 +2613,7 @@ standardizzate, che sono disponibili soltanto su Linux (anche se altri kernel supportano meccanismi simili). Alcune di esse sono realizzate, e solo a partire dalla versione 2.4 del kernel, attraverso l'uso di alcuni \textsl{comandi} aggiuntivi per la funzione \func{fcntl} (vedi -sez.~\ref{sec:file_fcntl}), che divengono disponibili soltanto se si è +sez.~\ref{sec:file_fcntl_ioctl}), che divengono disponibili soltanto se si è definita la macro \macro{\_GNU\_SOURCE} prima di includere \headfile{fcntl.h}. \itindbeg{file~lease} @@ -2641,13 +2642,14 @@ un altro processo esegue l'apertura del file in scrittura o usa il file viene aperto in lettura; in quest'ultimo caso però il \textit{lease} può essere ottenuto solo se nessun altro processo ha aperto lo stesso file. -Come accennato in sez.~\ref{sec:file_fcntl} il comando di \func{fcntl} che -consente di acquisire un \textit{file lease} è \const{F\_SETLEASE}, che viene -utilizzato anche per rilasciarlo. In tal caso il file descriptor \param{fd} -passato a \func{fcntl} servirà come riferimento per il file su cui si vuole -operare, mentre per indicare il tipo di operazione (acquisizione o rilascio) -occorrerà specificare come valore dell'argomento \param{arg} di \func{fcntl} -uno dei tre valori di tab.~\ref{tab:file_lease_fctnl}. +Come accennato in sez.~\ref{sec:file_fcntl_ioctl} il comando di \func{fcntl} +che consente di acquisire un \textit{file lease} è \const{F\_SETLEASE}, che +viene utilizzato anche per rilasciarlo. In tal caso il file +descriptor \param{fd} passato a \func{fcntl} servirà come riferimento per il +file su cui si vuole operare, mentre per indicare il tipo di operazione +(acquisizione o rilascio) occorrerà specificare come valore +dell'argomento \param{arg} di \func{fcntl} uno dei tre valori di +tab.~\ref{tab:file_lease_fctnl}. \begin{table}[htb] \centering @@ -2873,16 +2875,15 @@ Inoltre trattandosi di un file descriptor a tutti gli effetti, esso potrà essere utilizzato come argomento per le funzioni \func{select} e \func{poll} e con l'interfaccia di \textit{epoll};\footnote{ed a partire dal kernel 2.6.25 è stato introdotto anche il supporto per il \itindex{signal~driven~I/O} - \texttt{signal-driven I/O} trattato in - sez.~\ref{sec:file_asyncronous_operation}.} siccome gli eventi vengono -notificati come dati disponibili in lettura, dette funzioni ritorneranno tutte -le volte che si avrà un evento di notifica. Così, invece di dover utilizzare i -segnali,\footnote{considerati una pessima scelta dal punto di vista - dell'interfaccia utente.} si potrà gestire l'osservazione degli eventi con -una qualunque delle modalità di \textit{I/O multiplexing} illustrate in -sez.~\ref{sec:file_multiplexing}. Qualora si voglia cessare l'osservazione, -sarà sufficiente chiudere il file descriptor e tutte le risorse allocate -saranno automaticamente rilasciate. + \texttt{signal-driven I/O} trattato in sez.~\ref{sec:signal_driven_io}.} +siccome gli eventi vengono notificati come dati disponibili in lettura, dette +funzioni ritorneranno tutte le volte che si avrà un evento di notifica. Così, +invece di dover utilizzare i segnali,\footnote{considerati una pessima scelta + dal punto di vista dell'interfaccia utente.} si potrà gestire l'osservazione +degli eventi con una qualunque delle modalità di \textit{I/O multiplexing} +illustrate in sez.~\ref{sec:file_multiplexing}. Qualora si voglia cessare +l'osservazione, sarà sufficiente chiudere il file descriptor e tutte le +risorse allocate saranno automaticamente rilasciate. Infine l'interfaccia di \textit{inotify} consente di mettere sotto osservazione, oltre che una directory, anche singoli file. Una volta creata @@ -3105,11 +3106,11 @@ permette di ottenere con \func{ioctl}, come per i file descriptor associati ai socket (si veda sez.~\ref{sec:sock_ioctl_IP}) il numero di byte disponibili in lettura sul file descriptor, utilizzando su di esso l'operazione \const{FIONREAD}.\footnote{questa è una delle operazioni speciali per i file - (vedi sez.~\ref{sec:file_ioctl}), che è disponibile solo per i socket e per - i file descriptor creati con \func{inotify\_init}.} Si può così utilizzare -questa operazione, oltre che per predisporre una operazione di lettura con un -buffer di dimensioni adeguate, anche per ottenere rapidamente il numero di -file che sono cambiati. + (vedi sez.~\ref{sec:file_fcntl_ioctl}), che è disponibile solo per i socket + e per i file descriptor creati con \func{inotify\_init}.} Si può così +utilizzare questa operazione, oltre che per predisporre una operazione di +lettura con un buffer di dimensioni adeguate, anche per ottenere rapidamente +il numero di file che sono cambiati. Una volta effettuata la lettura con \func{read} a ciascun evento sarà associata una struttura \struct{inotify\_event} contenente i rispettivi dati. @@ -4497,7 +4498,7 @@ indicato dal valore dalla costante \const{IOV\_MAX}, definita come le altre costanti analoghe (vedi sez.~\ref{sec:sys_limits}) in \headfile{limits.h}; lo stesso valore deve essere ottenibile in esecuzione tramite la funzione \func{sysconf} richiedendo l'argomento \const{\_SC\_IOV\_MAX} (vedi -sez.~\ref{sec:sys_sysconf}). +sez.~\ref{sec:sys_limits}). Nel caso di Linux il limite di sistema è di 1024, però se si usano le \acr{glibc} queste forniscono un \textit{wrapper} per le system call che si