如何在C中使用inotify?

我搜索了与inotify相关的问题,这个问题有点不同……

我使用以下代码来监视一个文件(而不是目录)的更改。 在测试中,当我保存目标文件时,read()会返回,这意味着它可以工作。 但是event-> mask是32768,它不是IN_MODIFY,名称是空的。 另一个问题:它无法持续监控。 当我第二次更改文件时,它没有响应。 感谢您的帮助!

#include  #include  #include  #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) { int i = 0; while (i 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; } 

0x8000对应于IN_IGNORED 。 它在掩码中的存在表明因为文件已被删除而已删除了inotify手表。 您的编辑器可能删除了旧文件并将新文件放在其位置。 第二次更改文件没有效果,因为手表已被删除。

由于您没有在观看目录,因此未返回该名称。

inotify手册页 。

name字段仅在为监视目录内的文件返回事件时才出现; 它标识相对于监视目录的文件路径名。

IN_IGNORED – 显式删除了监视(inotify_rm_watch(2))或自动删除(文件已删除,或文件系统已卸载)。

event-> mask 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 }