Inizio materiale su inotify, e correzioni varie
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 9 Apr 2007 13:35:04 +0000 (13:35 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 9 Apr 2007 13:35:04 +0000 (13:35 +0000)
fileadv.tex
fileunix.tex
sources/TCP_countd.c

index ea2eb4b78288e0f6cf21442885dcd864f8499050..9f0a22558eb536c668485ed82808c91b020a6e5c 100644 (file)
@@ -543,7 +543,7 @@ accesso ai file; per questo motivo Stevens chiama questa modalit
 
 In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select}
 che, quando vengono usate con un numero molto grande di file descriptor, non
 
 In questo modo si può evitare l'uso delle funzioni \func{poll} o \func{select}
 che, quando vengono usate con un numero molto grande di file descriptor, non
-hanno buone prestazioni. % aggiungere cenno a epoll quando l'avrò scritta
+hanno buone prestazioni. % TODO aggiungere cenno a epoll quando l'avrò scritta
  In tal caso infatti la maggior parte del loro tempo
 di esecuzione è impegnato ad eseguire una scansione su tutti i file descriptor
 tenuti sotto controllo per determinare quali di essi (in genere una piccola
  In tal caso infatti la maggior parte del loro tempo
 di esecuzione è impegnato ad eseguire una scansione su tutti i file descriptor
 tenuti sotto controllo per determinare quali di essi (in genere una piccola
@@ -626,11 +626,11 @@ soluzione disponibile con l'interfaccia tradizionale, che 
 
 Queste nuove funzionalità sono delle estensioni specifiche, non
 standardizzate, che sono disponibili soltanto su Linux (anche se altri kernel
 
 Queste nuove funzionalità sono delle estensioni specifiche, non
 standardizzate, che sono disponibili soltanto su Linux (anche se altri kernel
-supportano meccanismi simili). Esse sono realizzate, e solo a partire dalla
-versione 2.4 del kernel, attraverso l'uso di alcuni \textsl{comandi}
-aggiuntivi per la funzione \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}), che
-divengono disponibili soltanto se si è definita la macro \macro{\_GNU\_SOURCE}
-prima di includere \file{fcntl.h}.
+supportano meccanismi simili). Alcune di esse sono realizzate, e solo a
+partire dalla versione 2.4 del kernel, attraverso l'uso di alcuni
+\textsl{comandi} aggiuntivi per la funzione \func{fcntl} (vedi
+sez.~\ref{sec:file_fcntl}), che divengono disponibili soltanto se si è
+definita la macro \macro{\_GNU\_SOURCE} prima di includere \file{fcntl.h}.
 
 \index{file!lease|(} 
 
 
 \index{file!lease|(} 
 
@@ -699,7 +699,8 @@ su un file, e che un \textit{lease} pu
 può ottenere un \textit{lease} soltanto per un file appartenente ad un
 \acr{uid} corrispondente a quello del processo. Soltanto un processo con
 privilegi di amministratore (cioè con la \itindex{capabilities} capability
 può ottenere un \textit{lease} soltanto per un file appartenente ad un
 \acr{uid} corrispondente a quello del processo. Soltanto un processo con
 privilegi di amministratore (cioè con la \itindex{capabilities} capability
-\const{CAP\_LEASE}) può acquisire \textit{lease} su qualunque file.
+\const{CAP\_LEASE}, vedi sez.~\ref{sec:proc_capabilities}) può acquisire
+\textit{lease} su qualunque file.
 
 Se su un file è presente un \textit{lease} quando il \textit{lease breaker}
 esegue una \func{truncate} o una \func{open} che confligge con
 
 Se su un file è presente un \textit{lease} quando il \textit{lease breaker}
 esegue una \func{truncate} o una \func{open} che confligge con
@@ -743,28 +744,20 @@ kernel 
 
 Benché possa risultare utile per sincronizzare l'accesso ad uno stesso file da
 parte di più processi, l'uso dei \textit{file lease} non consente comunque di
 
 Benché possa risultare utile per sincronizzare l'accesso ad uno stesso file da
 parte di più processi, l'uso dei \textit{file lease} non consente comunque di
-risolvere il problema di rilevare automaticamente quando un file viene
-modificato, che è quanto necessario ad esempio ai programma di gestione dei
-file dei vari desktop grafici.  
+risolvere il problema di rilevare automaticamente quando un file o una
+directory vengono modificati, che è quanto necessario ad esempio ai programma
+di gestione dei file dei vari desktop grafici.
 
 Per risolvere questo problema è stata allora creata un'altra interfaccia,
 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
 
 Per risolvere questo problema è stata allora creata un'altra interfaccia,
 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 questo può essere modificato e si può ottenere nel
-gestore il file descriptor che è stato modificato dal contenuto della
-struttura \struct{siginfo\_t}.
+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}.
 
 \index{file!lease|)}
 
 
 \index{file!lease|)}
 
-Ci si può registrare per le notifiche dei cambiamenti al contenuto di una
-certa directory eseguendo \func{fcntl} su un file descriptor \param{fd}
-associato alla stessa con il comando \const{F\_NOTIFY}. In questo caso
-l'argomento \param{arg} serve ad indicare per quali classi eventi si vuole
-ricevere la notifica, e prende come valore una maschera binaria composta
-dall'OR aritmetico di una o più delle costanti riportate in
-tab.~\ref{tab:file_notify}.
-
 \begin{table}[htb]
   \centering
   \footnotesize
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -800,23 +793,110 @@ tab.~\ref{tab:file_notify}.
   \label{tab:file_notify}
 \end{table}
 
   \label{tab:file_notify}
 \end{table}
 
-A meno di non impostare in maniera esplicita una notifica permanente usando
-\const{DN\_MULTISHOT}, la notifica è singola: viene cioè inviata una sola
-volta quando si verifica uno qualunque fra gli eventi per i quali la si è
-richiesta. Questo significa che un programma deve registrarsi un'altra volta se
-desidera essere notificato di ulteriori cambiamenti. Se si eseguono diverse
+
+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
+l'argomento \param{arg} di \func{fcntl} serve ad indicare per quali classi
+eventi si vuole ricevere la notifica, e prende come valore una maschera
+binaria composta dall'OR aritmetico di una o più delle costanti riportate in
+tab.~\ref{tab:file_notify}.
+
+A meno di non impostare in maniera esplicita una notifica permanente usando il
+valore \const{DN\_MULTISHOT}, la notifica è singola: viene cioè inviata una
+sola volta quando si verifica uno qualunque fra gli eventi per i quali la si è
+richiesta. Questo significa che un programma deve registrarsi un'altra volta
+se desidera essere notificato di ulteriori cambiamenti. Se si eseguono diverse
 chiamate con \const{F\_NOTIFY} e con valori diversi per \param{arg} questi
 ultimi si \textsl{accumulano}; cioè eventuali nuovi classi di eventi
 specificate in chiamate successive vengono aggiunte a quelle già impostate
 nelle precedenti.  Se si vuole rimuovere la notifica si deve invece
 specificare un valore nullo.
 chiamate con \const{F\_NOTIFY} e con valori diversi per \param{arg} questi
 ultimi si \textsl{accumulano}; cioè eventuali nuovi classi di eventi
 specificate in chiamate successive vengono aggiunte a quelle già impostate
 nelle precedenti.  Se si vuole rimuovere la notifica si deve invece
 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.}
+
 \index{file!dnotify|)}
 
 \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 è:
+\begin{prototype}{sys/inotify.h}
+  {int inotify\_init(void)}
+  
+  Inizializza una istanza di \textit{inotify}.
+  
+  \bodydesc{La funzione restituisce un file descriptor in caso di successo, o
+    $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EMFILE}] si è raggiunto il numero massimo di istanze di
+    \textit{inotify} consentite all'utente.
+  \item[\errcode{ENFILE}] si è raggiunto il massimo di file descriptor aperti
+    nel sistema.
+  \item[\errcode{ENOMEM}] non c'è sufficiente memoria nel kernel per creare
+    l'istanza.
+  \end{errlist}
+}
+\end{prototype}
+
+La funzione non prende alcun argomento, e restituisce un file descriptor
+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 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}.
+
+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
+è \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}.
+  
+  \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}
+  \item[\errcode{EACCESS}] non si ha accesso in lettura al file indicato.
+  \item[\errcode{EINVAL}] \param{mask} non contiene eventi legali o \param{fd}
+    non è un filesystem di \textit{inotify}.
+  \item[\errcode{ENOSPC}] si è raggiunto il numero massimo di voci di
+    osservazione o il kernel non ha potuto allocare una risorsa necessaria.
+  \end{errlist}
+  ed inoltre \errval{EFAULT}, \errval{ENOMEM} e \errval{EBADF}.}
+\end{prototype}
+
+
 
 
 
 
-\index{file!inotify|)}
 % TODO inserire anche inotify, vedi http://www.linuxjournal.com/article/8478
 % TODO inserire anche inotify, vedi http://www.linuxjournal.com/article/8478
-\index{file!inotify|(}
+% TODO e man inotify
+
+\index{file!inotify|)}
+
+
+
 
 
 
 
 
 
index a42d381313473a49c9a9e6945cb11985f90791e9..09bcbd29ed8324f1a4d45a34aa80c4640c54defc 100644 (file)
@@ -1300,16 +1300,25 @@ seguito\footnote{per l'uso di \func{ioctl} con i socket si veda
   sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
 esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
 quasi tutte le implementazioni di Unix), qui riportiamo solo i valori di
   sez.~\ref{sec:sock_ctrl_func}.} quelle relative ad alcuni casi specifici (ad
 esempio la gestione dei terminali è effettuata attraverso \func{ioctl} in
 quasi tutte le implementazioni di Unix), qui riportiamo solo i valori di
-alcuni comandi che sono definiti per ogni file:
+alcuni comandi che sono definiti per ogni file ordinario:
 \begin{basedescript}{\desclabelwidth{2.0cm}}
 \begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{FIOCLEX}] Imposta il flag di \itindex{close-on-exec}
-  \textit{close-on-exec}.
-\item[\const{FIONCLEX}] Cancella il flag di \itindex{close-on-exec}
-  \textit{close-on-exec}.
-\item[\const{FIOASYNC}] Abilita l'I/O asincrono.
-\item[\const{FIONBIO}] Abilita l'I/O in modalità non bloccante.
+\item[\const{FIOCLEX}] imposta il flag di \itindex{close-on-exec}
+  \textit{close-on-exec} sul file.
+\item[\const{FIONCLEX}] cancella il flag di \itindex{close-on-exec}
+  \textit{close-on-exec} sul file.
+\item[\const{FIOASYNC}] abilita la modalità di I/O asincrono sul file (vedi
+  sez.~\ref{sec:file_asyncronous_operation}).
+\item[\const{FIONBIO}] abilita sul file l'I/O in modalità non bloccante.
+\item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali
+  \const{SIGURG} e \const{SIGIO} generati sul file.
+\item[\const{FIOGETOWN}] legge il processo che riceverà i segnali
+  \const{SIGURG} e \const{SIGIO} generati sul file.
+\item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
+  file descriptor.
+%\item[\const{FIOQSIZE}] .
 \end{basedescript}
 \end{basedescript}
-relativi ad operazioni comunque eseguibili anche attraverso \func{fcntl}.
+di cui però i primi sei sono relativi ad operazioni che si possono eseguire
+anche tramite \func{fcntl}.
 
 % TODO estendere la lista delle ioctl sui file
 
 
 % TODO estendere la lista delle ioctl sui file
 
index cf761e77401e00ece7a7ed5996019c829d2b624b..1cdfbf10c83080230b0675ad47238b952b98283c 100644 (file)
@@ -201,7 +201,7 @@ int main(int argc, char *argv[])
  * routine to print usage info and exit
  */
 void usage(void) {
  * routine to print usage info and exit
  */
 void usage(void) {
-    printf("Elementary echo server\n");
+    printf("A counter server\n");
     printf("Usage:\n");
     printf("  echod [-h] \n");
     printf("  -h          print this help\n");
     printf("Usage:\n");
     printf("  echod [-h] \n");
     printf("  -h          print this help\n");