1

いくつかのサブディレクトリを含むディレクトリを監視する必要があります。各サブディレクトリには、ファイルの追加、変更、および削除を監視する必要があるファイルがあります。

いくつかのサンプルコードを見つけて、それを機能させるために少し変更する必要がありましたが、必要なことを正確に実行することはできません. ファイルの名前変更、またはディレクトリ内の削除 (サブディレクトリではない) を見つけることができますが、ファイルの変更には応答しません。

Google 検索を使用して見つける方法は、各ファイルを個別に監視することです。ただし、監視するファイルが数十万あり、それぞれにファイル記述子を保持することはおそらく賢明ではありません。

FreeBSD で必要なことを行う方法はありますか? または、別の解決策を見つける必要がありますか?

#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h> 
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h> 

int main(void) {
   int f, kq, nev;
   struct kevent change;
   struct kevent event;

   kq = kqueue();
   if (kq == -1)
       perror("kqueue");

   f = open("/tmp/foo", O_RDONLY);
   if (f == -1)
       perror("open");

   EV_SET(&change, f, EVFILT_VNODE,
          EV_ADD | EV_ENABLE | EV_ONESHOT,
          NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB,
          0, 0);

   for (;;) {
       nev = kevent(kq, &change, 1, &event, 1, NULL);
       if (nev == -1)
           perror("kevent");
       else if (nev > 0) {
           if (event.fflags & NOTE_DELETE) {
               printf("File deleted\n");
               break;
           }
           if (event.fflags & NOTE_EXTEND ||
               event.fflags & NOTE_WRITE)
               printf("File modified\n");
           if (event.fflags & NOTE_ATTRIB)
               printf("File attributes modified\n");
       }
   }

   close(kq);
   close(f);
   return EXIT_SUCCESS;
}
4

1 に答える 1

2

ご想像のとおり、モードkqueueであっても問題のファイル/ディレクトリへのハンドルを保持する必要があるため、スケーラブルではありません。O_RDONLYLinux では、inotifyこの目的のために ( http://linux.die.net/man/7/inotify ) を使用しますが、このカーネル機能の FreeBSD ポートはないと思います!

時間とリソースがあれば、auditBSD のコード ( http://www.freebsd.org/cgi/man.cgi?query=audit&sektion=4 ) を見て、バージョンをコーディングしてみてください。 BSD の inotify の! O_O

于 2013-12-24T16:09:36.093 に答える