【问题标题】:Inotify event in CC中的通知事件
【发布时间】:2015-12-22 14:45:22
【问题描述】:

程序:

#include <stdio.h>
#include <sys/inotify.h>

int main()
{
    int fd = inotify_init();
    int wd1 = inotify_add_watch(fd, "/home/guest/a", IN_MODIFY);
    struct inotify_event *event = (struct inotify_event*) malloc(sizeof(struct inotify_event));
    read(fd, event, 1000);
    if (event->mask & IN_MODIFY) {
        printf("File '%s' is modified\n", event->name);
    }
}

输出:

$ ./a.out 
File '' is modified
$

如果文件 a 被修改,我希望上面的程序会通知文件名。但它通知没有文件名。所以, 如果使用 inotify 修改了文件,如何获取文件名。

【问题讨论】:

标签: c inotify


【解决方案1】:

文档说:

名称字段仅在为文件返回事件时出现 在被监视的目录中;它标识相对文件路径名 到被监视的目录。此路径名以 null 结尾,并且可能 包括更多空字节('\0')以将后续读取对齐到 合适的地址边界。

所以您的问题是您希望 inotify 将名称“回显”给您,但这不是它的工作原理。

【讨论】:

  • 有什么办法可以做到吗?
  • 是的,您可以保留自己的监视描述符到文件名的映射。此处已对此进行了一些讨论:stackoverflow.com/a/9313324/4323
  • 这是获取文件名的唯一方法。但是这种情况在某些情况下也会失败,例如如果将多个文件添加到 fd 并传递给 notify_add_watch 函数。
  • @mrg:不。每次添加手表时,都会获得一个新的手表描述符。因此存在从监视描述符到监视的映射,并且一个文件上的一个监视具有文件名。
  • @iharob:在 OP 的情况下没有“监视目录”:代码监视 /home/guest/a 并且 OP 说 a 是一个文件。没有目录被监视。因此没有报告名称。因为它们是从监视描述符中推断出来的。
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多