使用inotify的正确方法是什么?

新手上路,请多包涵

我想在 Linux 上使用 inotify 机制。我希望我的应用程序知道文件 aaa 更改。你能给我一个样本如何做到这一点吗?

原文由 dubila 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 979
2 个回答

inotify C API

inotify 提供三个系统调用来构建各种文件系统监视器:

  • inotify_init() 在内核中创建 inotify 子系统的实例,成功时返回文件描述符,失败时返回 -1 。与其他系统调用一样,如果 inotify_init() 失败,请检查 errno 进行诊断。
  • inotify_add_watch() ,顾名思义,加了一个 手表。每个 watch 必须提供一个路径名和相关事件列表,其中每个事件由一个常量指定,例如 IN_MODIFY 。要监视多个事件,只需在每个事件之间使用逻辑或——C 中的管道 (|) 运算符。如果 inotify_add_watch() 成功,则调用返回已注册手表的唯一标识符;否则,它返回 -1 。使用标识符来更改或删除关联的手表。
  • inotify_rm_watch() 删除手表。

还需要 read()close() 系统调用。给定由 inotify_init() 产生的描述符,调用 read() 等待警报。假设一个典型的文件描述符,应用程序阻塞等待事件的接收,这些事件在流中表示为数据。从 inotify_init() 产生的文件描述符上的通用 close() 删除并释放所有活动的手表以及与 inotify 实例关联的所有内存。 (典型的引用计数警告也适用于此。与实例关联的所有文件描述符必须在手表和 inotify 消耗的内存被释放之前关闭。)

 #include "inotify.h"
#include "inotify-syscalls.h"
int wd;
wd = inotify_add_watch (fd,
            "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd < 0)
      perror ("inotify_add_watch");

此示例在目录 /home/rlove/Desktop 上添加了一个监视,用于任何修改、文件创建或文件删除。

原文由 joschi 发布,翻译遵循 CC BY-SA 4.0 许可协议

下面是如何使用 inotify 观看“aaa”的片段。请注意,我没有对此进行测试,我什至没有编译它!您将需要为其添加错误检查。

除了使用阻塞读取之外,您还可以在 inotfd 上使用 poll/select。

 const char *filename = "aaa";
int inotfd = inotify_init();

int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);

size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);

/* wait for an event to occur */
read(inotfd, event, bufsiz);

/* process event struct here */

原文由 Fabian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题