inotify真的适用于文件还是仅适用于目录?

时间:2014-02-08 12:42:28

标签: c linux inotify

我正在尝试使用inotify来监控文件/dev/hvc0的更改,使用以下内容:

#include <stdio.h>
#include <sys/inotify.h>
#include <stdlib.h>

#define EVENT_SIZE  (sizeof(struct inotify_event))
#define BUF_LEN     (1024 * (EVENT_SIZE + 16))
#define WATCH_FILE "/dev/hvc0" /* This file should be present
                                  before this program is run */

int main() {
    int notify_fd;
    int length;
    int i = 0;
    char buffer[BUF_LEN];
    notify_fd = inotify_init();
    if (notify_fd < 0) {
        perror("inotify_init");
    }
    int wd = inotify_add_watch(notify_fd, WATCH_FILE, IN_MODIFY | IN_ACCESS);
    int length_read = read(notify_fd, buffer, BUF_LEN);
    if (length_read) {
        perror("read");
    }
    while (i < length_read) {
        struct inotify_event *event =
            (struct inotify_event *) &buffer[i];
        if (event->len) {
            if (event->mask & IN_ACCESS) {
                printf("The file %s was accessed.\n", event->name);
            } else if (event->mask & IN_MODIFY) {
                printf("The file %s was modified.\n", event->name);
            }
        }
    }

    (void) inotify_rm_watch(notify_fd, wd);
    (void) close(notify_fd);
    return 0;
}

但是,如果访问/修改了文件,则不会打印。但是,每当我将要监视的路径更改为目录并更改文件时,它都会打印出正确的事件。

inotify是否也适用于监控文件更改?或者我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您缺少增加i。在循环结束之前添加:

i += EVENT_SIZE + event->len;

如果要监视更改,还需要将读取/打印操作包装在无限循环中。

答案 1 :(得分:0)

我不明白为什么event->len返回零可能是因为没有返回文件名。但仅出于测试目的,您只需对其进行评论。在第二点 你对i的处理被破坏了,你永远不会在循环中将它重置为0。这导致任何后来的inotify事件只有在比它们之前的最长事件更长时才被考虑,这可能不是你想要的。请在while循环中请放i += EVENT_SIZE + event->len;

int main() {
    int notify_fd;
    int length;
    int i = 0;
    char buffer[BUF_LEN];
    notify_fd = inotify_init();
    if (notify_fd < 0) {
        perror("inotify_init");
    }
    int wd = inotify_add_watch(notify_fd, WATCH_FILE, IN_MODIFY | IN_ACCESS);
    while(1)
    {
        length = read( notify_fd, buffer, BUF_LEN );

        if ( length < 0 ) {
          perror( "read" );
        }

        while ( i < length ) 
        {
            struct inotify_event *event =
            (struct inotify_event *) &buffer[i];
            // if (event->len) {
            if (event->mask & IN_ACCESS) {
                printf("The file %s was accessed.\n", event->name);
            } else if (event->mask & IN_MODIFY) {
                printf("The file %s was modified.\n", event->name);
            }
            // }
            i += EVENT_SIZE + event->len;
        }
    }

  ( void ) inotify_rm_watch( notify_fd, wd );
  ( void ) close( notify_fd);

  exit( 0 );
}

答案 2 :(得分:0)

根据此answer,看来Linux不会监视特定文件。如果要听特定文件,则应先听其父目录。