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
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
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:
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}
+
+