Materiale su inotify di ieri sera
authorSimone Piccardi <piccardi@gnulinux.it>
Thu, 3 May 2007 17:17:20 +0000 (17:17 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Thu, 3 May 2007 17:17:20 +0000 (17:17 +0000)
fileadv.tex

index 9f0a22558eb536c668485ed82808c91b020a6e5c..4737913a90046c33e7d9df43791a2242ebbaa9e9 100644 (file)
@@ -555,13 +555,15 @@ file descriptor sono pi
 segnale. Inoltre dato che i segnali normali non si accodano (si ricordi quanto
 illustrato in sez.~\ref{sec:sig_notification}), in presenza di più file
 descriptor attivi contemporaneamente, più segnali emessi nello stesso momento
-verrebbero notificati una volta sola. Linux però supporta le estensioni
-POSIX.1b dei segnali real-time, che vengono accodati e che permettono di
-riconoscere il file descriptor che li ha emessi. In questo caso infatti si può
-fare ricorso alle informazioni aggiuntive restituite attraverso la struttura
-\struct{siginfo\_t}, utilizzando la forma estesa \var{sa\_sigaction} del
-gestore installata con il flag \const{SA\_SIGINFO} (si riveda quanto
-illustrato in sez.~\ref{sec:sig_sigaction}).
+verrebbero notificati una volta sola.
+
+Linux però supporta le estensioni POSIX.1b dei segnali real-time, che vengono
+accodati e che permettono di riconoscere il file descriptor che li ha emessi.
+In questo caso infatti si può fare ricorso alle informazioni aggiuntive
+restituite attraverso la struttura \struct{siginfo\_t}, utilizzando la forma
+estesa \var{sa\_sigaction} del gestore installata con il flag
+\const{SA\_SIGINFO} (si riveda quanto illustrato in
+sez.~\ref{sec:sig_sigaction}).
 
 Per far questo però occorre utilizzare le funzionalità dei segnali real-time
 (vedi sez.~\ref{sec:sig_real_time}) impostando esplicitamente con il comando
@@ -581,11 +583,13 @@ risposta a seconda del segnale usato, dato che i segnali real-time supportano
 anche questa funzionalità. In questo modo si può identificare immediatamente
 un file su cui l'accesso è diventato possibile evitando completamente l'uso di
 funzioni come \func{poll} e \func{select}, almeno fintanto che non si satura
-la coda.  Se infatti si eccedono le dimensioni di quest'ultima, il kernel, non
-potendo più assicurare il comportamento corretto per un segnale real-time,
-invierà al suo posto un solo \const{SIGIO}, su cui si saranno accumulati tutti
-i segnali in eccesso, e si dovrà allora determinare con un ciclo quali sono i
-file diventati attivi.
+la coda.  
+
+Se infatti si  eccedono le dimensioni di quest'ultima,  il kernel, non potendo
+più assicurare il comportamento corretto  per un segnale real-time, invierà al
+suo posto un solo \const{SIGIO}, su  cui si saranno accumulati tutti i segnali
+in  eccesso, e si  dovrà allora  determinare con  un ciclo  quali sono  i file
+diventati attivi.
 
 % TODO fare esempio che usa O_ASYNC
 
@@ -869,11 +873,11 @@ 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
-è \funcd{inotify\_add\_watch}, il cui prototipo è:
+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 una voce alla lista di osservazione di \param{fd}.
+  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:
@@ -887,6 +891,72 @@ gestire la lista di osservazione l'interfaccia fornisce due funzioni, la prima
   ed inoltre \errval{EFAULT}, \errval{ENOMEM} e \errval{EBADF}.}
 \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}.
+
+
+\begin{table}[htb]
+  \centering
+  \footnotesize
+  \begin{tabular}[c]{|l|p{8cm}|}
+    \hline
+    \textbf{Valore}  & \textbf{Significato} \\
+    \hline
+    \hline
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \const{}& .\\ 
+    \hline    
+  \end{tabular}
+  \caption{Le costanti che identificano i valori per la maschera binaria
+    dell'argomento \param{mask} di \func{inotify\_add\_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 è:
+\begin{prototype}{sys/inotify.h}
+  {int inotify\_rm\_watch(int fd, uint32\_t wd)}
+
+  Rimuove un evento di osservazione.
+  
+  \bodydesc{La funzione restituisce 0 in caso di successo, o $-1$ in caso di
+    errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EBADF}] non si è specificato in \param{fd} un file descriptor
+    valido.
+  \item[\errcode{EINVAL}] il valore di \param{wd} non è corretto, o \param{fd}
+    non è associato ad una coda di notifica.
+  \end{errlist}
+}
+\end{prototype}
+
+