Inotifyを使用して、あるフォルダの一挙手一投足を監視します.

2188 ワード

参照先:
http://fred-zone.blogspot.com/2008/11/inotify.html
 
Linuxの下である材料クリップの変化を監視するには、土法製鋼のタイミングでスキャンしたり、修正時間をチェックしたり、ファイルを一つ一つ開いたりする方法がたくさんありますが、これらの過程には、大量で余分なIOアクセスが伴うことが多いです.これに対してinotifyを使用すると便利で効率的に見えます.halが現れてから、inotifyを使ってファイルや資料クリップの一挙手一投足のeventをブロックすることができ、GLibを統合すれば、わずか数行で実作することができます.
#include <glib.h>
#include <sys/inotify.h>
#include <sys/types.h>
#include <errno.h>

void inotify_events_io_func(GIOChannel *channel, GIOCondition condition, gpointer data)
{
  char buf[1024];
  struct inotify_event *event;
  gint index = 0;
  gint len = 0;
  gint fd = g_io_channel_unix_get_fd(channel);

  while(((len = read(fd, &buf, sizeof(buf))) < 0) && (errno == EINTR));

  while(index<len) {
      event = (struct inotify_event*)(buf+index);

      /* read events */
      switch(event->mask)
      {
          case IN_MODIFY:
              printf("MODIFY
"); break; case IN_CREATE printf("CREATE
"); break; case IN_DELETE: printf("DELETE
"); break; } index += sizeof(struct inotify_event) + event->len; } } int main(int argc, char* argv[] ) { GMainLoop *loop; GIOChannel *channel; gint ino_fd = 0; gint ino_wd = 0; /* inotify */ ino_fd = inotify_init(); ino_wd = inotify_add_watch(ino_fd, "/usr/share/applications", IN_MODIFY | IN_CREATE | IN_DELETE); channel = g_io_channel_unix_new(ino_fd); g_io_add_watch(channel, G_IO_IN, (GIOFunc)inotify_events_io_func, (gpointer)NULL); loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); }

この例では、/usr/share/applicationsフォルダ内のファイル更新eventを傍受し、印刷します.このフォルダはFreeDesktop.org Specでデスクトップアプリケーションの情報を記録するために使用されるため、ソフトウェアをインストールまたは削除すると、ファイルの新規または削除されたeventが受信されます.