Inotify
跳转到导航
跳转到搜索
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);
}
参见
- inotifywait 命令