Materiale della scorsa settimana rimasto da committare.
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 13 Jun 2007 10:26:45 +0000 (10:26 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 13 Jun 2007 10:26:45 +0000 (10:26 +0000)
fileadv.tex

index 58aced40516a754aac668f9960ab69c826ddec85..c3936d97da12142e0f7921257dded96b8d3a2dbb 100644 (file)
@@ -305,7 +305,7 @@ contestualmente all'esecuzione della funzione,\footnote{in Linux per
   kernel 2.6.16, non era presente la relativa system call, e la funzione era
   implementata nelle \acr{glibc} attraverso \func{select} (vedi \texttt{man
     select\_tut}) per cui la possibilità di \itindex{race~condition}
   kernel 2.6.16, non era presente la relativa system call, e la funzione era
   implementata nelle \acr{glibc} attraverso \func{select} (vedi \texttt{man
     select\_tut}) per cui la possibilità di \itindex{race~condition}
-  \textit{race condition} permaneva; in tale situzione si può ricorrere ad una
+  \textit{race condition} permaneva; in tale situazione si può ricorrere ad una
   soluzione alternativa, chiamata \itindex{self-pipe trick} \textit{self-pipe
     trick}, che consiste nell'aprire una pipe (vedi sez.~\ref{sec:ipc_pipes})
   ed usare \func{select} sul capo in lettura della stessa; si può indicare
   soluzione alternativa, chiamata \itindex{self-pipe trick} \textit{self-pipe
     trick}, che consiste nell'aprire una pipe (vedi sez.~\ref{sec:ipc_pipes})
   ed usare \func{select} sul capo in lettura della stessa; si può indicare
@@ -797,7 +797,6 @@ tramite il contenuto della struttura \struct{siginfo\_t}.
   \label{tab:file_notify}
 \end{table}
 
   \label{tab:file_notify}
 \end{table}
 
-
 Ci si può registrare per le notifiche dei cambiamenti al contenuto di una
 certa directory eseguendo la funzione \func{fcntl} su un file descriptor
 associato alla stessa con il comando \const{F\_NOTIFY}. In questo caso
 Ci si può registrare per le notifiche dei cambiamenti al contenuto di una
 certa directory eseguendo la funzione \func{fcntl} su un file descriptor
 associato alla stessa con il comando \const{F\_NOTIFY}. In questo caso
@@ -819,20 +818,32 @@ specificare un valore nullo.
 
 \index{file!inotify|(}
 
 
 \index{file!inotify|(}
 
-Il maggiore problema di \textit{dnotify} è quello della scalabilità, e della
-complessità di gestione dovuta all'uso dei segnali. Per questo motivo a
-partire dal kernel 2.6.13 è stata introdotta una nuova interfaccia per
-l'osservazione delle modifiche a file o directory, chiamata
-\textit{inotify}.\footnote{le corrispondenti funzioni di interfaccia sono
-  state introdotte nelle glibc 2.4.}
+Il maggiore problema di \textit{dnotify} è quello della scalabilità: si deve
+usare un file descriptor per ciascuna directory che si vuole tenere sotto
+controllo, il che porta facilmente ad un eccesso di file aperti. Inoltre
+quando la directory è su un dispositivo rimuovibile, mantenere un file
+descriptor aperto comporta l'impossibilità di smontare il dispositivo e
+rimuoverlo, complicando la gestione.
+
+Un secondo problema è che l'interfaccia consente solo di tenere sotto
+controllo il contenuto di una directory; la modifica di un file viene
+segnalata, ma poi devo verificare quale è.  Infine l'uso dei segnali come
+interfaccia di notifica comporta tutti i problemi di gestione visti in
+sez.~\ref{sec:sig_management} e sez.~\ref{sec:sig_control}, e per questo in
+generale quella di \textit{dnotify} viene considerata una interfaccia di
+usabilità problematica.
 
 \index{file!dnotify|)}
 
 
 \index{file!dnotify|)}
 
-L'interfaccia di \textit{inotify} è una caratteristica specifica di Linux
-(pertanto non deve essere usata se si devono scrivere programmi portabili), ed
-è basata sull'uso di una coda di notifica degli eventi associata ad un file
-descriptor. La coda viene creata attraverso la funzione \funcd{inotify\_init},
-il cui prototipo è:
+Per questa serie di motivi, a partire dal kernel 2.6.13, è stata introdotta
+una nuova interfaccia per l'osservazione delle modifiche a file o directory,
+chiamata \textit{inotify}.\footnote{le corrispondenti funzioni di interfaccia
+  sono state introdotte nelle glibc 2.4.} Questa è una interfaccia specifica
+di Linux (pertanto non deve essere usata se si devono scrivere programmi
+portabili), ed è basata sull'uso di una coda di notifica degli eventi
+associata ad un singolo file descriptor, risolvendo così il principale
+problema di \itindex{dnotify} \textit{dnotify}. La coda viene creata
+attraverso la funzione \funcd{inotify\_init}, il cui prototipo è:
 \begin{prototype}{sys/inotify.h}
   {int inotify\_init(void)}
   
 \begin{prototype}{sys/inotify.h}
   {int inotify\_init(void)}
   
@@ -856,31 +867,35 @@ associato alla coda, attraverso il quale verranno effettuate le operazioni di
 notifica. Si tratta di un file descriptor speciale, che non è associato a
 nessun file, ma che viene utilizzato per notificare gli eventi che si sono
 posti in osservazione all'applicazione che usa l'interfaccia di
 notifica. Si tratta di un file descriptor speciale, che non è associato a
 nessun file, ma che viene utilizzato per notificare gli eventi che si sono
 posti in osservazione all'applicazione che usa l'interfaccia di
-\textit{inotify}. 
-
-Trattandosi di un file descriptor a tutti gli effetti, esso potrà essere
-utilizzato con le funzioni \func{select} e \func{poll}. Dato che gli eventi
-vengono notificati come dati disponibili in lettura sul file descriptor
-stesso, dette funzioni ritorneranno tutte le volte che si avrà un evento di
-notifica. Si potrà cioè gestirlo secondo le modalità illustrate in
-sez.~\ref{sec:file_multiplexing}. Inoltre, come per i file descriptor
-associati ai socket (vedi sez.~\ref{sec:sock_ioctl_IP}) si potrà ottenere il
-numero di byte disponibili in lettura eseguendo su di esso l'operazione
-\const{FIONREAD} con \func{ioctl}.
-
-L'interfaccia di \textit{inotify} consente di mettere sotto osservazione sia
-singoli file, che intere directory; in quest'ultimo caso l'interfaccia
-restituirà informazioni sia riguardo alla directory che ai file che essa
-contiene.  Una volta creata la coda di notifica si devono definire gli eventi
-da tenere sotto osservazione; questo viene fatto tramite una \textsl{lista di
-  osservazione} (o \textit{watch list}) associata alla coda. Per gestire la
-lista di osservazione l'interfaccia fornisce due funzioni, la prima di queste
-è \funcd{inotify\_add\_watch}, il cui prototipo è:
+\textit{inotify}. Dato che questo file descriptor non è associato a nessun
+file o directory, questo consente di evitare l'inconveniente di non poter
+smontare un filesystem i cui file sono tenuti sotto osservazione.\footnote{ed
+  una delle caratteristiche dell'interfaccia di \textit{inotify} è proprio
+  quella di notificare il fatto che il filesystem su cui si trova il file o la
+  directory osservata è stato smontato.} 
+
+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 siccome gli eventi vengono notificati come dati disponibili in lettura sul
+file descriptor, dette funzioni ritorneranno tutte le volte che si avrà un
+evento di notifica. Così, invece di dover utilizzare i segnali, si potrà
+gestire l'osservazione delle modifiche con l'\textit{I/O multiplexing},
+utilizzando secondo le modalità illustrate in
+sez.~\ref{sec:file_multiplexing}.
+
+Infine l'interfaccia di \textit{inotify} consente di mettere sotto
+osservazione sia singoli file, che intere directory; in quest'ultimo caso
+l'interfaccia restituirà informazioni sia riguardo alla directory che ai file
+che essa contiene.  Una volta creata la coda di notifica si devono definire
+gli eventi da tenere sotto osservazione; questo viene fatto tramite una
+\textsl{lista di osservazione} (o \textit{watch list}) associata alla coda.
+Per gestire la lista di osservazione l'interfaccia fornisce due funzioni, la
+prima di queste è \funcd{inotify\_add\_watch}, il cui prototipo è:
 \begin{prototype}{sys/inotify.h}
   {int inotify\_add\_watch(int fd, const char *pathname, uint32\_t mask)}
 
   Aggiunge un evento di osservazione alla lista di osservazione di \param{fd}.
 \begin{prototype}{sys/inotify.h}
   {int inotify\_add\_watch(int fd, const char *pathname, uint32\_t mask)}
 
   Aggiunge un evento di osservazione alla lista di osservazione di \param{fd}.
-  
+
   \bodydesc{La funzione restituisce un valore positivo in caso di successo, o
     $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
   \bodydesc{La funzione restituisce un valore positivo in caso di successo, o
     $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
   \begin{errlist}
@@ -896,13 +911,13 @@ lista di osservazione l'interfaccia fornisce due funzioni, la prima di queste
 La funzione consente di creare un \textsl{evento di osservazione} (un
 cosiddetto ``\textit{watch}'') nella lista di una coda di notifica, indicata
 specificando il file descriptor ad essa associato nell'argomento \param{fd}.
 La funzione consente di creare un \textsl{evento di osservazione} (un
 cosiddetto ``\textit{watch}'') nella lista di una coda di notifica, indicata
 specificando il file descriptor ad essa associato nell'argomento \param{fd}.
-Il file o la directory da porre sotto osservazione viene invece indicati per
-nome, passato nell'argomento \param{pathname}. Infine il terzo argomento,
-indica quali eventi devono essere tenuti sotto osservazione; questo deve
-essere specificato come maschera binaria combinando i valori delle costanti
-riportate in tab.~\ref{tab:inotify_event_watch}; in essa si sono marcati con
-un ``$\bullet$'' gli eventi che, quando specificati per una directory, vengono
-osservati anche su tutti i file che essa contiene.
+Il file o la directory da porre sotto osservazione viene invece indicato per
+nome, che viene passato nell'argomento \param{pathname}. Infine il terzo
+argomento, \param{mask}, indica che tipo di eventi devono essere tenuti sotto
+osservazione. Questo deve essere specificato come maschera binaria combinando
+i valori delle costanti riportate in tab.~\ref{tab:inotify_event_watch}. In
+essa si sono marcati con un ``$\bullet$'' gli eventi che, quando specificati
+per una directory, vengono osservati anche su tutti i file che essa contiene.
 
 \begin{table}[htb]
   \centering
 
 \begin{table}[htb]
   \centering
@@ -972,7 +987,6 @@ identificare l'evento a cui si fa riferimento nella lista dei risultati
 restituiti da \textit{inotify}
 
 
 restituiti da \textit{inotify}
 
 
-
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -984,6 +998,16 @@ restituiti da \textit{inotify}
 \end{figure}
 
 
 \end{figure}
 
 
+Inoltre l'interfaccia di \textit{inotify} permette di conoscere, come avviene
+per i file descriptor associati ai socket (si veda al proposito quanto
+trattato in sez.~\ref{sec:sock_ioctl_IP}) il numero di byte disponibili in
+lettura sul nostro file descriptor, utilizzando su di esso l'operazione
+\const{FIONREAD} con \func{ioctl}.\footnote{questa è una delle operazioni
+  speciali (che abbiamo visto in sez.~\ref{sec:file_ioctl}) che nel caso è
+  disponibile solo per i socket e per i file descriptor creati con
+  \func{inotify\_init}.} Questo consente anche di ottenere rapidamente il
+numero di file che sono cambiati.
+
 
 
 % TODO inserire anche inotify, vedi http://www.linuxjournal.com/article/8478
 
 
 % TODO inserire anche inotify, vedi http://www.linuxjournal.com/article/8478
@@ -2972,7 +2996,10 @@ possibilit
 % LocalWords:  flock shared exclusive operation dup inode linked NFS cmd ENOLCK
 % LocalWords:  EDEADLK whence SEEK CUR type pid GETLK SETLK SETLKW all'inode HP
 % LocalWords:  switch bsd lockf mandatory SVr sgid group root mount mand TRUNC
 % LocalWords:  flock shared exclusive operation dup inode linked NFS cmd ENOLCK
 % LocalWords:  EDEADLK whence SEEK CUR type pid GETLK SETLK SETLKW all'inode HP
 % LocalWords:  switch bsd lockf mandatory SVr sgid group root mount mand TRUNC
-% LocalWords:  SVID UX Documentation sendfile dnotify inotify NdA
+% LocalWords:  SVID UX Documentation sendfile dnotify inotify NdA ppoll fds add
+% LocalWords:  init EMFILE FIONREAD ioctl watch char pathname uint mask ENOSPC
+% LocalWords:  dell'inode CLOSE NOWRITE MOVE MOVED FROM TO rm wd event page
+% LocalWords:  attribute Universe
 
 
 %%% Local Variables: 
 
 
 %%% Local Variables: