我搜索了与inotify相关的问题,这个问题有些不同......
我使用以下代码来监视一个文件(而不是目录)的更改。在测试中,当我保存目标文件时,read()会返回,这意味着它可以工作。但是event->掩码是32768,它不是IN_MODIFY,名称是空的。另一个问题:它无法持续监控。当我第二次更改文件时,它没有响应。谢谢你的帮助!
#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>
#define EVENT_SIZE (sizeof (struct inotify_event))
#define BUF_LEN (16 * (EVENT_SIZE + 16))
int main()
{
int fd;
fd = inotify_init();
if (fd < 0)
perror("inotify_init()");
int wd;
wd = inotify_add_watch(fd, "target.txt", IN_MODIFY);
if (wd < 0)
perror("inotify_add_watch");
char buf[BUF_LEN];
int len;
start:
len = read(fd, buf, BUF_LEN);
if (len > 0)
{
int i = 0;
while (i < len)
{
struct inotify_event *event;
event = (struct inotify_event *) &buf[i];
printf("wd=%d mask=%x cookie=%u len=%u\n",
event->wd, event->mask,
event->cookie, event->len);
if (event->mask & IN_MODIFY)
printf("file modified %s", event->name);
if (event->len)
printf("name=%s\n", event->name);
i += EVENT_SIZE + event->len;
}
}
goto start;
return 0;
}
答案 0 :(得分:5)
0x8000
对应IN_IGNORED
。它在掩码中的存在表示inotify
监视已被删除,因为该文件已被删除。您的编辑器可能删除了旧文件并将新文件放在其位置。第二次更改文件无效,因为手表已被移除。
由于您没有观看目录,因此未返回该名称。
name
字段仅在监视目录内的文件返回事件时出现;它标识相对于监视目录的文件路径名。...
IN_IGNORED - 已明确删除监视(inotify_rm_watch(2))或自动删除(文件已删除,或文件系统已卸载)。
答案 1 :(得分:3)
event-&gt;掩码32768相当于0x8000,即IN_IGNORED 有关更多信息:“/ usr /include/linux/inotify.h”
if (event->mask & IN_IGNORED) {
/*Remove watch*/ inotify_rm_watch(fileDescriptor,watchDescriptor)
/*Add watch again*/ inotify_add_watch
}