Monitor the pathnames named as command-line arguments
We begin by creating an inotify instance:
int main(int argc, char *argv[]) { int inotify_fd, wd, j; if (argc < 2 || strcmp(argv[1], "--help") == 0) usageErr("%s path...\n", argv[0]); inotify_fd = inotify_init();
We then establish one watch for each pathname specified on command line:
for (j = 1; j < argc; j++) { wd = inotify_add_watch(inotify_fd, argv[j], IN_ALL_EVENTS); printf("Watching %s using watch descriptor %d\n", argv[j], wd); }
Now we can read events from the inotify file descriptor:
#define BUF_LEN 10000 char buf[BUF_LEN]; /* For input inotify_event structures */ ssize_t nread; char *p; for (;;) { /* Read some events from inotify fd */ nread = read(inotify_fd, buf, BUF_LEN); if (nread == 0) /* End-of-file */ break; if (nread == -1) { /* Error */ if (errno == EINTR) /* Interrupted by signal */ continue; /* Restart read() */ else errExit("read"); /* Other error */ } printf("Read %ld bytes from inotify fd\n", (long) nread); /* Each buffer may contain multiple events; process all of them */ for (p = buf; p < buf + nread; p += sizeof(struct inotify_event) + ((struct inotify_event *) p)->len) { display_inotify_event((struct inotify_event *) p); } }
Our display_inotify_event() is trivial:
static void display_inotify_event(struct inotify_event *i) { printf(" wd =%2d; ", i->wd); if (i->cookie > 0) printf("cookie =%4d; ", i->cookie); printf("mask = "); if (i->mask & IN_ACCESS) printf("IN_ACCESS "); if (i->mask & IN_ATTRIB) printf("IN_ATTRIB "); if (i->mask & IN_CLOSE_NOWRITE) printf("IN_CLOSE_NOWRITE "); if (i->mask & IN_CLOSE_WRITE) printf("IN_CLOSE_WRITE "); if (i->mask & IN_CREATE) printf("IN_CREATE "); if (i->mask & IN_DELETE) printf("IN_DELETE "); if (i->mask & IN_DELETE_SELF) printf("IN_DELETE_SELF "); if (i->mask & IN_IGNORED) printf("IN_IGNORED "); if (i->mask & IN_ISDIR) printf("IN_ISDIR "); if (i->mask & IN_MODIFY) printf("IN_MODIFY "); if (i->mask & IN_MOVE_SELF) printf("IN_MOVE_SELF "); if (i->mask & IN_MOVED_FROM) printf("IN_MOVED_FROM "); if (i->mask & IN_MOVED_TO) printf("IN_MOVED_TO "); if (i->mask & IN_OPEN) printf("IN_OPEN "); if (i->mask & IN_Q_OVERFLOW) printf("IN_Q_OVERFLOW "); if (i->mask & IN_UNMOUNT) printf("IN_UNMOUNT "); printf("\n"); if (i->len > 0) printf(" name = %s\n", i->name); } /* display_inotify_event */
(C) 2006, Michael Kerrisk