我想在 Linux 上使用 inotify
机制。我希望我的应用程序知道文件 aaa
更改。你能给我一个样本如何做到这一点吗?
原文由 dubila 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想在 Linux 上使用 inotify
机制。我希望我的应用程序知道文件 aaa
更改。你能给我一个样本如何做到这一点吗?
原文由 dubila 发布,翻译遵循 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 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答798 阅读✓ 已解决
2 回答3.2k 阅读
inotify
C APIinotify
提供三个系统调用来构建各种文件系统监视器: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 消耗的内存被释放之前关闭。)此示例在目录 /home/rlove/Desktop 上添加了一个监视,用于任何修改、文件创建或文件删除。