我想编写一个简单的 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
答案 0 :(得分:1)
首先,您不会在循环内重置 i
,因此第一次增加到 EVENT_SIZE
时,不会查看长度为 EVENT_SIZE
的后续读取。< /p>
此外,您正在检查文件名的长度 event->len
是否非零,但至少手册页说:
name 字段仅在为监视目录中的文件返回事件时出现;它标识了监视目录中的文件名。
所以当您只观看单个文件时它不会被填满。
如果您修复它以重置i
;并查看整个目录,或者不查看 event->name
,然后它就可以工作了。