11

Cでinotifyの例を実行しようとしていますが、機能していません。ファイル(ファイルはtmp.cfg)への変更を監視したいのですが、機能しません。ディレクトリを監視する方法は理解しているが、単一ではないため、正しく実行されているかどうかはわかりません。ファイル例は次のとおりです。

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

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main( int argc, char **argv )
{
  int length, i = 0;
  int fd;
  int wd;
  char buffer[BUF_LEN];

  fd = inotify_init();

  if ( fd < 0 ) {
    perror( "inotify_init" );
  }

  wd = inotify_add_watch( fd, "/home/name/tmp.cfg",
                         IN_MODIFY | IN_CREATE | IN_DELETE );
  length = read( fd, buffer, BUF_LEN );

  if ( length < 0 ) {
    perror( "read" );
  }

  while ( i < length ) {
    struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
      if ( event->mask & IN_CREATE ) {
          printf( "The file %s was created.\n", event->name );
      }
      else if ( event->mask & IN_DELETE ) {
          printf( "The file %s was deleted.\n", event->name );
      }
      else if ( event->mask & IN_MODIFY ) {
          printf( "The file %s was modified.\n", event->name );
      }
    i += EVENT_SIZE + event->len;
  }

  ( void ) inotify_rm_watch( fd, wd );
  ( void ) close( fd );

  return 0;
}

一度実行したら、ファイルに何かを書き込んでから保存しても、何も起こりません。私はそれをデバッグしようとしました..問題はif(event-> mask&IN_MODIFY)であるようです、それはそれを変更として認識しないからです

4

4 に答える 4

7

You have 2 issues. First, as far as I can tell, inotify does not really work on files - it needs directory name to watch.

Second, you missed if (event->len) { inside while loop.

This code works for me for creating, deleting and modifying files in current directory:

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

#define EVENT_SIZE  (sizeof(struct inotify_event))
#define BUF_LEN     (1024 * (EVENT_SIZE + 16))

int main(int argc, char **argv) {
    int length, i = 0;
    int fd;
    int wd;
    char buffer[BUF_LEN];

    fd = inotify_init();

    if (fd < 0) {
        perror("inotify_init");
    }

    wd = inotify_add_watch(fd, ".",
        IN_MODIFY | IN_CREATE | IN_DELETE);
    length = read(fd, buffer, BUF_LEN);

    if (length < 0) {
        perror("read");
    }

    while (i < length) {
        struct inotify_event *event =
            (struct inotify_event *) &buffer[i];
        if (event->len) {
            if (event->mask & IN_CREATE) {
                printf("The file %s was created.\n", event->name);
            } else if (event->mask & IN_DELETE) {
                printf("The file %s was deleted.\n", event->name);
            } else if (event->mask & IN_MODIFY) {
                printf("The file %s was modified.\n", event->name);
            }
        }
        i += EVENT_SIZE + event->len;
    }

    (void) inotify_rm_watch(fd, wd);
    (void) close(fd);

    return 0;
}
于 2012-11-13T06:08:30.130 に答える
1

ファイルを監視しているときに、ファイルを編集して変更を加えるために編集者がファイルを操作している場合、監視を依頼した元のファイルが削除されるような操作を行っている可能性があります。したがって、1 つのファイルのみを監視すると、通知は停止します。

于 2014-02-11T03:57:00.567 に答える
1

ホームディレクトリであるユーザー名を使用していないと思います。inotify_add_watchおそらく失敗する戻り値をチェックしていません。

"/home/name/tmp.cfg"

編集:わかりました2番目の問題です。印刷しないでくださいname

名前フィールドは、監視対象ディレクトリ内のファイルに対してイベントが返された場合にのみ存在します。

Edit2:3番目の問題、ファイルに監視を追加するため、プログラムを実行する前にファイルが存在する必要があります。エラーを確認することをお勧めしますinotify_add_watch

于 2012-11-12T20:53:38.807 に答える