用C inotify的文件(inotify file in C)

2019-07-03 18:34发布

我试图运行C..but它不工作的inotify的一个例子。 我想监视修改一个文件(该文件tmp.cfg),但它并不work..I不知道我是否运行正常,因为我懂得如何监控目录,但不是一个单一的文件Here's的例子:

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

一旦我运行它,如果我写的东西文件,然后保存它,什么都不会发生。 我已经tryed调试it..the问题似乎是,如果(事件 - >面膜&IN_MODIFY),因为它不承认它作为一个修改

Answer 1:

你有2个问题。 首先,据我所知,inotify的并没有真正上的文件 - 它需要的目录名来观看。

其次,你错过了if (event->len) { while循环中。

此代码对我的作品用于创建,删除和修改在当前目录下的文件:

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


Answer 2:

我想你不使用你的用户名 ,这是你的主目录,而你不检查的收益inotify_add_watch这可能失败:

"/home/name/tmp.cfg"

编辑:好的第二个问题,你不应该打印name ,因为

名称字段只出现在返回的监控目录中的文件的事件;

EDIT2:第三个问题,因为你在文件中添加了监视的文件必须在运行程序之前,我建议你检查从错误inotify_add_watch



Answer 3:

在看一个文件,如果文件是由你可以做编辑,并创建一个变化的编辑操作,它很可能会做一些操作导致你要求观看被删除原始文件。 因此,通知将停止,如果你只是看一个文件。



Answer 4:

因为,当我们使用编辑器修改文件时,编辑器中打开该文件的副本,它不会对单个文件的工作,当我们从保存的文本编辑器编辑的版本,现有的文件被删除,新文件相同的名称与修改创建。

当旧的文件被删除,在该文件中创建的手表变得无效,将被自动删除。

您可以看到新文件替换旧文件,如果你监控的父目录。

有两种方法来解决这个问题,监控的父目录,并修改时做是为了特别是你想要观看打印邮件。

上每当修饰,文件否则创建一个新的手表。 当旧的文件被删除,则触发事件IN_DELETE_SELF。

事件 - >名称将非空,只有当你看一个目录,因为它会包含在其上发生的所在目录的事件文件的名称。



文章来源: inotify file in C
标签: c inotify