I wrote this little example program just to start using inotify. The program adds a watch on a file, looking for the event of closing the file after having opened it for writing. When the even fires, I remove the watch, write something different on the file which the event was fired for and then I add again the watch on the same event on that file. All this in a cycle. The problem is that when I do any kind of writes on the file, even simple ones like this "echo 0 > file_watched", the watching program receives an unending series of events. What am I doing wrong?
Code:#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <errno.h> #include <unistd.h> #include <sys/inotify.h> #define FILE_CONTENTS "\ irrelevant contents\n" #define EVENT_SIZE (sizeof(struct inotify_event)) int main(int argc, char **argv) { if (argc < 2) { printf("not enough arguments.\n"); exit(1); } char event[EVENT_SIZE]; int wd; char *path_name = argv[1]; int ifd = inotify_init(); if (ifd == -1) { printf("inotify_init() problem.\n"); exit(1); } while (true) { wd = inotify_add_watch(ifd, path_name, IN_CLOSE_WRITE); if (wd == -1) { printf("inotify_add_watch() problem.\n"); exit(1); } if (read(ifd, event, EVENT_SIZE) != EVENT_SIZE) { printf("read() problem.\n"); exit(1); } if(inotify_rm_watch(ifd, wd) == -1) { perror("inotify_rm_watch()"); exit(1); } printf("%s modified. now working on it\n", path_name); fflush(stdout); FILE *file = fopen(path_name, "w"); fprintf(file, "%s", FILE_CONTENTS); fflush(file); fclose(file); printf("%s restored\n", path_name); fflush(stdout); } return (EXIT_SUCCESS); }


