Inotify

来自百合仙子's Wiki
跳转到导航 跳转到搜索

inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等,还可以跟踪活动的源头和目标等细节。

事件

IN_ACCESS,即文件被访问
IN_MODIFY,文件被 write
IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可写文件被 close
IN_CLOSE_NOWRITE,不可写文件被 close
IN_OPEN,文件被 open
IN_MOVED_FROM,文件被移走,如 mv
IN_MOVED_TO,文件被移来,如 mv、cp
IN_CREATE,创建新文件
IN_DELETE,文件被删除,如 rm
IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
IN_UNMOUNT,宿主文件系统被 umount
IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)

:上面所说的文件也包括目录。

代码示例

这是一个监视特定文件夹(不含子文件夹)下文件的创建和删除的 C 程序:

#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/lilydjwg",
      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){
	if(event->mask & IN_ISDIR){
	  printf("The directory %s was created.\n", event->name);
	}else{
	  printf("The file %s was created.\n", event->name);
	}
      }else if(event->mask & IN_DELETE){
	if(event->mask & IN_ISDIR){
	  printf("The directory %s was deleted.\n", event->name);
	}else{
	  printf("The file %s was deleted.\n", event->name);
	}
      }else if(event->mask & IN_MODIFY){
	if(event->mask & IN_ISDIR){
	  printf("The directory %s was modified.\n", event->name);
	}else{
	  printf("The file %s was modified.\n", event->name);
	}
      }
    }
    i += EVENT_SIZE + event->len;
  }

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

  exit(0);
}

参见

外部链接