Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monitoring file using inotify

I am using inotify to monitor a local file, for example "/root/temp" using

inotify_add_watch(fd, "/root/temp", mask).

When this file is deleted, the program will be blocked by read(fd, buf, bufSize) function. Even if I create a new "/root/temp" file, the program is still block by read function. I am wondering if inotify can detect that the monitored file is created and the read function can get something from fd so that read will not be blocked forever. Here is my code:

uint32_t mask = IN_ALL_EVENTS;
int fd = inotify_init();
int wd = inotify_add_watch(fd, "/root/temp", mask);
char *buf = new char[1000];
int nbytes = read(fd, buf, 500);

I monitored all events.

like image 363
user572138 Avatar asked Jan 12 '11 03:01

user572138


1 Answers

The problem is that read is a blocking operation by default.

If you don't want it to block, use select or poll before read. For example:

struct pollfd pfd = { fd, POLLIN, 0 };
int ret = poll(&pfd, 1, 50);  // timeout of 50ms
if (ret < 0) {
    fprintf(stderr, "poll failed: %s\n", strerror(errno));
} else if (ret == 0) {
    // Timeout with no events, move on.
} else {
    // Process the new event.
    struct inotify_event event;
    int nbytes = read(fd, &event, sizeof(event));
    // Do what you need...
}

Note: untested code.

like image 85
jweyrich Avatar answered Sep 21 '22 22:09

jweyrich