From: Simone Piccardi Date: Thu, 3 May 2007 17:17:20 +0000 (+0000) Subject: Materiale su inotify di ieri sera X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=145f647c93210529f60ab440e491d5cd3242d8a6;p=gapil.git Materiale su inotify di ieri sera --- diff --git a/fileadv.tex b/fileadv.tex index 9f0a225..4737913 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -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} + +