From 5d09b56fe89f540ac47d6690b66ac85facf6d757 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 4 May 2007 06:31:10 +0000 Subject: [PATCH] Modifiche di ieri sera. --- fileadv.tex | 110 +++++++++++++++++++++++++--------------- listati/inotify_event.h | 8 +++ sources/TCP_countd.c | 7 +-- 3 files changed, 80 insertions(+), 45 deletions(-) create mode 100644 listati/inotify_event.h diff --git a/fileadv.tex b/fileadv.tex index 4737913..58aced4 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -756,7 +756,7 @@ Per risolvere questo problema chiamata \textit{dnotify}, che consente di richiedere una notifica quando una directory, o di uno qualunque dei file in essa contenuti, viene modificato. Come per i \textit{file lease} la notifica avviene di default attraverso il -segnale \const{SIGIO}, ma se ne può utilizzare un altro. inoltre si potrà +segnale \const{SIGIO}, ma se ne può utilizzare un altro. Inoltre si potrà ottenere nel gestore del segnale il file descriptor che è stato modificato tramite il contenuto della struttura \struct{siginfo\_t}. @@ -858,7 +858,7 @@ 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 file descriptor a tutti gli effetti, esso potrà essere +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 @@ -868,12 +868,14 @@ associati ai socket (vedi sez.~\ref{sec:sock_ioctl_IP}) si potr numero di byte disponibili in lettura eseguendo su di esso l'operazione \const{FIONREAD} con \func{ioctl}. -Una volta creata la coda di notifica, ed ottenuto il relativo file descriptor, -l'interfaccia prevede che si definiscano gli eventi da tenere sotto -osservazione associando ad esso una \textsl{lista di osservazione} (o -\textit{watch list}) che indica quali file e directory tenere d'occhio. Per -gestire la lista di osservazione l'interfaccia fornisce due funzioni, la prima -di queste è \funcd{inotify\_add\_watch}, il cui prototipo è: +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)} @@ -892,38 +894,48 @@ di queste \end{prototype} La funzione consente di creare un \textsl{evento di osservazione} (un -cosiddetto ``\textit{watch}'') nella lista di osservazione di una coda di -notifica. Quest'ultima viene identificata specificando il file descriptor ad -essa associato nell'argomento \param{fd}. Il file da porre sotto osservazione -viene invece identificato tramite il suo pathname passato nell'argomento -\param{pathname}, infine il terzo argomento, \param{mask}, è una maschera -binaria che consente di specificare quali tipologie di eventi accaduti sul -file devono essere osservati, e deve essere specificato con una OR aritmetico -delle costanti riportate in tab.~\ref{tab:inotify_event_watch}. - +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. \begin{table}[htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{8cm}|} + \begin{tabular}[c]{|l|c|p{10cm}|} \hline - \textbf{Valore} & \textbf{Significato} \\ + \textbf{Valore} & & \textbf{Significato} \\ \hline \hline - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ - \const{}& .\\ + \const{IN\_ACCESS} &$\bullet$& c'è stato accesso al file in + lettura.\\ + \const{IN\_ATTRIB} &$\bullet$& ci sono stati cambiamenti sui dati + dell'inode.\\ + \const{IN\_CLOSE\_WRITE} &$\bullet$& è stato chiuso un file aperto in + scrittura.\\ + \const{IN\_CLOSE\_NOWRITE}&$\bullet$& è stato chiuso un file aperto in + sola lettura.\\ + \const{IN\_CREATE} &$\bullet$& è stato creato un file o una + directory in una directory sotto + osservazione.\\ + \const{IN\_DELETE} &$\bullet$& è stato cancellato un file o una + directory in una directory sotto + osservazione.\\ + \const{IN\_DELETE\_SELF} & & è stato cancellato il file (o la + directory) sotto osservazione.\\ + \const{IN\_MODIFY} &$\bullet$& è stato modificato il file.\\ + \const{IN\_MOVE\_SELF} & & è stato rinominato il file (o la + directory) sotto osservazione.\\ + \const{IN\_MOVED\_FROM} &$\bullet$& un file è stato spostato fuori dalla + directory sotto osservazione.\\ + \const{IN\_MOVED\_TO} &$\bullet$& un file è stato spostato nella + directory sotto osservazione.\\ + \const{IN\_OPEN} &$\bullet$& un file è stato aperto.\\ \hline \end{tabular} \caption{Le costanti che identificano i valori per la maschera binaria @@ -931,15 +943,14 @@ delle costanti riportate in tab.~\ref{tab:inotify_event_watch}. \label{tab:inotify_event_watch} \end{table} - -Dato che può esistere un solo \textit{watch} per file, qualora venga -specificato il pathname di un file che era già stato posto in osservazione, la -funzione sovrascriverà le impostazioni precedenti. In caso di successo la -funzione ritorna un intero positivo, detto \textit{watch descriptor} che -identifica univocamente l'evento di osservazione. Questo valore è importante -perché è soltanto con esso che si può rimuovere un evento di osservazione, -usando la seconda funzione dell'interfaccia di gestione, -\funcd{inotify\_rm\_watch}, il cui prototito è: +Se non esiste nessun \textit{watch} per il file (o la directory) specificata +questo verrà creato per gli eventi specificati dall'argomento \param{mask}, +altrimenti la funzione sovrascriverà le impostazioni precedenti. In caso di +successo la funzione ritorna un intero positivo, detto \textit{watch + descriptor} che identifica univocamente l'evento di osservazione. Questo +valore è importante perché è soltanto con esso che si può rimuovere un evento +di osservazione, usando la seconda funzione dell'interfaccia di gestione, +\funcd{inotify\_rm\_watch}, il cui prototipo è: \begin{prototype}{sys/inotify.h} {int inotify\_rm\_watch(int fd, uint32\_t wd)} @@ -956,6 +967,21 @@ usando la seconda funzione dell'interfaccia di gestione, } \end{prototype} +Oltre che per la rimozione, il \textit{watch descriptor} viene usato anche per +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} + \includestruct{listati/inotify_event.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{inotify\_event}.} + \label{fig:inotify_event} +\end{figure} diff --git a/listati/inotify_event.h b/listati/inotify_event.h new file mode 100644 index 0000000..c10185a --- /dev/null +++ b/listati/inotify_event.h @@ -0,0 +1,8 @@ +struct inotify_event { + int wd; /* Watch descriptor */ + uint32_t mask; /* Mask of events */ + uint32_t cookie; /* Unique cookie associating related + events (for rename(2)) */ + uint32_t len; /* Size of 'name' field */ + char name[]; /* Optional null-terminated name */ +}; diff --git a/sources/TCP_countd.c b/sources/TCP_countd.c index 1cdfbf1..43082c0 100644 --- a/sources/TCP_countd.c +++ b/sources/TCP_countd.c @@ -19,12 +19,13 @@ /**************************************************************** * * Program countd: Elementary TCP server for teaching purpose, count - * number of request to the server itself + * number of request to the server itself, use POSIX semaphores and + * shared memory * * Author: Simone Piccardi * Feb. 2007 * - * Usage: countdd -h give all info + * Usage: countd -h give all info * ****************************************************************/ /* @@ -203,7 +204,7 @@ int main(int argc, char *argv[]) void usage(void) { printf("A counter server\n"); printf("Usage:\n"); - printf(" echod [-h] \n"); + printf(" countd [-h] \n"); printf(" -h print this help\n"); printf(" -d write debug info\n"); printf(" -k enable SO_KEEPALIVE\n"); -- 2.30.2