`inotify` 仅通知文件中的第一个更改

时间:2021-07-15 10:17:12

标签: linux file inotify

我想编写一个简单的 C 程序来检测常规文件中的更改。我决定使用inotify。问题是我的程序只检测到文件中的第一个更改。 这是我的代码:

#include <sys/types.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE  (sizeof(struct inotify_event))
#define BUF_LEN     (1024*(EVENT_SIZE + 16))


int main()
{
    int length, i = 0;
    int fd;
    int wd;
    char buffer[BUF_LEN];

    fd = inotify_init();

    if (fd < 0) {
        perror("inotify_init");
    }

    wd = inotify_add_watch(fd, "/path/to/my/file.txt", IN_MODIFY);

    while(1)
    {
        length = read(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_MODIFY) {
                        printf("The file %s was modified.\n", event->name);
                }
            }
            i += EVENT_SIZE + event->len;
        }
    }
    inotify_rm_watch(fd, wd);
    close(fd);

    return 0;
}

read() 返回 0,所以我的程序永远不会从 while(i<length){} 退出。当我注释掉这个循环时,似乎 read() 只在文件中的第一次更改时返回任何值,然后它会永远等待。

您知道为什么我无法检测到文件中的更改吗?在此先感谢您的帮助。

编辑 我检查了 inotify 的 cli 版本,它也没有按预期工作。我打电话给inotifywait -m file.txt,它说我的文件已被删除,但我所做的唯一更改是向其中添加一些字母并保存。这是命令的完整输出:

Setting up watches.
Watches established.
file.txt OPEN 
file.txt CLOSE_WRITE,CLOSE 
file.txt ATTRIB 
file.txt DELETE_SELF 

1 个答案:

答案 0 :(得分:1)

首先,您不会在循环内重置 i,因此第一次增加到 EVENT_SIZE 时,不会查看长度为 EVENT_SIZE 的后续读取。< /p>

此外,您正在检查文件名的长度 event->len 是否非零,但至少手册页说:

<块引用>

name 字段仅在为监视目录中的文件返回事件时出现;它标识了监视目录中的文件名。

所以当您只观看单个文件时它不会被填满。

如果您修复它以重置i;并查看整个目录,或者不查看 event->name,然后它就可以工作了。