1

タイトルの通り。プログラムは最初のイベントを待ってから、無限ループに入ります。一度に 1 つのイベントだけを処理しないのはなぜでしょうか?

#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;
}
4

1 に答える 1

0

まず、inotify によって報告されるイベントのサイズは inotify_event ではありません。これは、追加の名前も報告されるためです。FIONREAD で ioctl を使用して、読み取り可能なバイト数を取得します。

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

次に、ブロッキング I/O を使用しました。代わりに inotify_init1(O_NONBLOCK) を使用して inotify を初期化すると、read() はすぐに戻り、データが利用できない場合は errno を EAGAIN に設定します。もちろん、最初に FIONREAD を使用して利用可能なデータがあるかどうかを確認した場合、これはオプションです。

于 2015-12-09T17:29:53.423 に答える