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

dub*_*ila 28 linux inotify

我想inotify在Linux上使用该机制.我希望我的应用程序知道文件何时aaa被更改.你能告诉我一些如何做到的样品吗?

jos*_*chi 30

inotifyC API

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

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

read()close()还需要系统调用.给定描述符inotify_init(),调用read()等待警报.假设一个典型的文件描述符,应用程序阻止接收事件,这些事件表示为流中的数据.文件描述符上的公共close()产生了inotify_init()删除并释放所有活动监视以及与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");
Run Code Online (Sandbox Code Playgroud)

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

  • 我不是故意在这里粗鲁,但这个答案不符合stackoverflow指南.该网站应该包含问题的答案.它不是LMGTFY.我在这里找到链接到不再存在的页面的答案是很常见的.在stackoverflow答案中应该做的是将链接页面的相关部分放入答案中并引用参考文献以免剽窃. (36认同)
  • inotify本身是一个Linux内核API,而不是可以在shell脚本中使用的用户空间程序.如果要在脚本中使用inotify API,请查看inotify-tools(https://github.com/rvoicilas/inotify-tools/wiki/). (3认同)
  • 请再次阅读我的评论.`inotifywait`是上述inotify-tools的一部分.另外,最初的问题是关于Qt应用程序而不是shell脚本. (2认同)

Fab*_*ian 12

下面是一个如何使用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 */
Run Code Online (Sandbox Code Playgroud)


act*_*cay 6

如果您只需要一个命令行应用程序,那么有一个名为的命令行应用程序inotifywait可以使用inotify

从1号航站楼出发

# touch cheese
# while inotifywait -e modify cheese; do 
>   echo someone touched my cheese
> done
Run Code Online (Sandbox Code Playgroud)

从2号航站楼

echo lol >> cheese
Run Code Online (Sandbox Code Playgroud)

这是在1号航站楼上看到的

Setting up watches.
Watches established.
cheese MODIFY 
someone touched my cheese
Setting up watches.
Watches established.
Run Code Online (Sandbox Code Playgroud)

更新:谨慎使用并查看评论。

  • 为什么要使用错误且不推荐使用的工具?如果您在生产中使用过它,您会感到我的痛苦伴侣!无论如何,请看[here](/sf/ask/3305750591/#49349226)和[此处](/sf/ask/3337141321/#49345762),原因有两个。 (2认同)