Leggevo il libro The linux programming interface e finalmente mi sono interessato di come Inotify funzioni su Linux

Semplicemente Inotify e’ un sistema di notifiche per cambiamenti su filesystem per file e directory, come accesso, modifica e esecuzione. E’ stato sviluppato per sostituire dnotify, il vecchio sistema di notifiche su cambiamenti del filesystem. Inotify si basa sui file descriptor, vengono aperti quando si vuole interrogare il sistema di cambiamenti di un singolo file e vengono letti con la system call read()

Il flusso delle system call e’ il seguente:

  • Il nostro programma usa inotify_init() per creare una istanza di inotify
  • Quindi usiamo la chiamata inotify_add_watch() per aggiungere un elemento alla watchlist (la lista degli elementi che osserviamo) e dichiariamo gli eventi sui quali vogliamo ascoltare
  • Effettuiamo una read() sul file descriptor che abbiamo ottenuto nel passo precente. La chiamata read() non torna solo un dato, ma diversi eventi.
  • Quando la nostra applicazione termina, chiudiamo i file descriptor associati con inotify

Di seguito, ecco la struttura di un evento inotify e la spiegazione che ho seguito dal libro.

struct inotify_event {
int wd; /* Watch descriptor on which event occurred */
  uint32_t mask; /* Bits describing event that occurred */
uint32_t cookie; /* Cookie for related events (for rename()) */
uint32_t len; /* Size of 'name' field */
char name[]; /* Optional null-terminated filename */
};


Questa struttura contiene tutti i dati rilevanti che ci aiutano a comprendere da dove questo evento venga. wd e’ il file descriptor sul quale siamo in osservazione, mask e’ una integer mask che ci aiuta a capire quale evento e’ avvenuto facendo una & bitwise con la costante dell’evento, cookie e’ un campo che viene usato per gli eventi che succedono con la syscall rename(), len indica la lunghezza del campo name, name e’ il campo che indica il nome del file sul quale l’evento e’ avvenuto.

Di seguito, allego un semplice programma che ho scritto che riceve una notifica ogni volta che un utente invoca un comando ls sulla directory corrente o sulla directory padre.