From 4c8d31d106d4ae2b75557dfbd6ab3e96b926074c Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 13 Jun 2007 10:26:45 +0000 Subject: [PATCH] Materiale della scorsa settimana rimasto da committare. --- fileadv.tex | 113 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 43 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 58aced4..c3936d9 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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} - \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 @@ -797,7 +797,6 @@ tramite il contenuto della struttura \struct{siginfo\_t}. \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 @@ -819,20 +818,32 @@ specificare un valore nullo. \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|)} -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)} @@ -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 -\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}. - + \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}. -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 @@ -972,7 +987,6 @@ identificare l'evento a cui si fa riferimento nella lista dei risultati restituiti da \textit{inotify} - \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -984,6 +998,16 @@ restituiti da \textit{inotify} \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 @@ -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: 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: -- 2.30.2