单个inotify读取使得无限循环

时间:2012-12-11 17:09:58

标签: inotify

截至标题。 程序将等待第一个事件,然后进入无限循环 - 为什么它不是一次只处理一个事件?

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

int main (int argc, char **argv)
{
    int id, wd;
    int a;
    struct inotify_event e;

    id = inotify_init ();
    wd = inotify_add_watch (id, "/home/andrea/Downloads", IN_CREATE);
    puts ("waiting...");
    while (read (id, &e, sizeof (struct inotify_event)))
      {
          printf ("created %s\n", e.name);
          puts ("waiting...");
      }
return 0;
}

1 个答案:

答案 0 :(得分:0)

首先,inotify报告的事件的大小不是inotify_event,因为还会报告其他名称。使用带有FIONREAD的ioctl来获取可供读取的字节数。

int avail;
ioctl(id, FIONREAD, &avail);

其次,您使用了阻塞I / O.如果您改为使用inotify_init1(O_NONBLOCK)初始化inotify,则read()将立即返回并在没有可用数据的情况下将errno设置为EAGAIN。当然,如果您首先使用FIONREAD检查是否有可用的数据,这是可选的。