【问题标题】:I have questions about inotify_add_watch that read events我对读取事件的 inotify_add_watch 有疑问
【发布时间】:2019-08-10 17:43:49
【问题描述】:

我不明白 inotify 事件的进度。 我知道 inotify_init 是创建新的 inotify 实例。它返回文件描述符。 此时。文件描述符是关于什么的?

在我的代码中,函数 inotify_add_watch 如下所示

wd = inotify_add_watch ( inotifyFd, argv[j], IN_ALL_EVENTS),

被循环调用。

如果我在命令中再输入 2 个文件,则此循环将重复 2 次以上。然后变量 wd 将被覆盖。并且 intofiyFd 总是有相同的数字。因为这些不是数组。 那么,它如何区分另外 2 个文件呢?

我已经了解了

int main (int argc, char *argv[])
{

  int inotifyFd, wd, j;
  char buf[BUF_LEN];
  ssize_t numRead;
  char *p;
  struct inotify_event *event;

  inotifyFd = inotify_init();

  for(j = 1; j < argc; j++)
  {
      wd = inotify_add_watch(inotifyFd, argv[j], IN_ALL_EVENTS);
      printf("Watching %s using wd %d\n", argv[j],  wd);
  }

  for(;;)
  {
      numRead = read(inotifyFd, buf, BUF_LEN);
      if(numRead == 0)
          fatal("read() from inotify fd returned 0!");

      printf("Read %ld bytes from inotify fd\n", (long) numRead);

      for( p = buf; p < buf+numRead; )
      {
          event = (struct  inotify_event *) p;
          displayInotifyEvent(event);

          p+= sizeof(struct inotify_event) + event->len;
      }
  }

  return 0;
}

.

./demoinotify dir1 dir2 &
[1] 5386
Watching dir1 using wd1
watching dir2 using wd2

【问题讨论】:

  • 最后一个文件描述符被删除并返回一个新的。我不明白。 Inotify 将它需要的所有信息存储在内核中。

标签: c linux api inotify


【解决方案1】:

inotify_init() 是创建新的 inotify 实例。它返回文件描述符。此时。文件描述符是关于什么的?

它返回一个特殊的文件描述符,它不引用文件系统中的任何真实文件。就像pipe()epoll_create() 等一样。您可以使用该文件从中读取inotify 事件。它也是可轮询的。

wd = inotify_add_watch ( inotifyFd, argv[j], IN_ALL_EVENTS), 在循环中被调用。 如果我在命令中再输入 2 个文件,则此循环将重复 2 次以上。然后变量 wd 将被覆盖。

然后不要覆盖它。将其返回值保存到数组中。

int *wd = calloc(argc, sizeof *wd);
...
wd[j] = inotify_add_watch(inotifyFd, argv[j], ...);

注意inotify_add_watch 的返回值不是文件描述符,而是watch 描述符[1]。

它如何区分另外 2 个文件?

将您从 inotify 文件描述符中读取的 inotify_event 中的 wd 字段与您在上面保存的 inotify_add_watch 的返回值进行比较。

[1] 如果您查看/proc/PID/fdinfo/FD,其中FD 是您的inotifyFd,您将看到与其关联的所有监视描述符。该格式记录在 proc(5) 手册页中。

【讨论】:

  • 或者只是为wd[argc]使用VLA。
猜你喜欢
  • 2019-03-07
  • 2011-09-26
  • 2020-12-30
  • 2017-02-22
  • 2019-05-06
  • 1970-01-01
  • 2021-12-18
  • 2018-04-14
  • 2023-03-22
相关资源
最近更新 更多