5

以下のサンプル コードは、ファイルの変更を監視します。監視対象のファイルが foo.txt で、サンプル コードから得られたバイナリ名が inotify であるとします。サンプルコードに対して 2 つのテストを行いました。

test1:
1) ./inotify foo.txt
2) echo "hello" > foo.txt
その後、すべて正常に動作し、「file modified」が出力されました。

test2:
1) ./infity foo.txt
2) vim foo.txt
3) 編集して保存しますが、vim を終了しないでください
印刷された行は 不明です マスク 0x00008000、inotify ヘッダー ファイルをチェックアウトすると、このイベント マスクがIN_CLOSE_WRITEを意味することがわかりました.

私の観点からは、「編集して保存」するのは単にメニューを変更するだけです。しかし明らかに、inotify コードには異なる解釈があります。それは私にとって奇妙です、誰かが背後にあることを説明するのを助けることができますか?

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


int main(int argc, char **argv)
{
  int fdnotify = -1; 

  if (argc !=2) {
    fprintf(stderr, "usage: ./inotify dir_name\n");
    exit(1);
  }

  printf("argc is %d\n", argc);

  fdnotify = inotify_init();
  if (fdnotify < 0) {
    fprintf(stderr, "inotity_init failed: %s\n", strerror(errno));
  }

  int wd = inotify_add_watch(fdnotify, argv[1], IN_MODIFY);
  if (wd < 0) {
    fprintf(stderr, "inotify_add_watch failed: %s\n", strerror(errno));
  }

  while(1) {
    char buffer[4096];
    struct inotify_event *event = NULL;

    int len = read(fdnotify, buffer, sizeof(buffer));

    if (len < 0) {
      fprintf(stderr, "read error %s\n", strerror(errno));
    }   

    event = (struct inotify_event *) buffer;

    while(event != NULL) {
      if ((event->mask & IN_MODIFY)  ) { 
        printf("File modified %s\n", event->name);
      } else {
 printf("unknown Mask 0x%.8x\n", event->mask);
      }
      len -= sizeof(*event) + event->len;

      if (len > 0)
        event = ((void *) event) + sizeof(event) + event->len;
      else
        event = NULL;
    }
  }
}
4

2 に答える 2

7

Vim は、ファイルを保存するときに直接ファイルに保存しないプログラムです。通常は名前が付けられた一時ファイルが作成され、.filename.swpvimを閉じるときにのみ、このファイルの名前がに変更されfilenameます。inotify の FAQ から:

IN_MODIFY イベントは、ファイルの内容が変更されたときに (たとえば、write() システムコールを介して) 発生し、IN_CLOSE_WRITE は、変更されたファイルを閉じるときに発生します。これは、変更操作ごとに 1 つの IN_MODIFY イベントが発生することを意味します (開いているファイルの操作中に何度も発生する可能性があります) が、IN_CLOSE_WRITE は (ファイルを閉じるときに) 1 回だけ発生します。

したがって、実際に取得するイベントは理にかなっています。というファイルがあるとしますfilename。ファイルを開くと、filenameという名前の別のファイルが作成され.filename.swpます。このファイルに対して実行するすべての変更は、監視されている場合、多数のIN_MODIFYイベントを生成します。実際に保存すると、最終的にはvimがこのファイルの名前を変更して閉じ、IN_CLOSE_WRITEイベントが生成されます。

于 2012-11-09T17:30:26.877 に答える
2

マスク 0x00008000 は IN_IGNORED だと思っていました inotify.h によると:

#define IN_CLOSE_WRITE   0x00000008 /* Writtable file was closed.  */
#define IN_IGNORED   0x00008000 /* File was ignored.  */

イベント マスクが IN_IGNORED である可能性はありますか?

于 2012-11-16T03:22:04.710 に答える