众所周知,inotify 是一个内核用于通知用户空间程序文件系统变化的机制,可以用于监控文件系统,比如、创建、删除、读、写操作等,当发生对应事件时,则会触发 inotify。
1、主要API
#include<sys/inotify.h>
1)int inotify_init(void); //创建一个 inotify 实例并返回一个引用 inotify 实例的文件描述符
2)int inotify_add_watch(int fd,const char *pathname,uint32_t mask); //向fd 所指的 inotify监控列表添加新的监控项 。
3)int inotify_rm_watch(int fd, int wd);//移除监测列表中wd所指向的监控的对象,wd为inotify_add_watch()返回值。
关于API的使用介绍已经很多了,不再赘述。
2、存储 inotify 事件 结构体 struct inotify_event,struct inotify_event *event
-
当event->len == 0 时,event->name __flexarr为空
,监测项为文件。使用inotify_add_watch
添加需要监测的文件时,若文件不存在,则添加失败,监测事件不会生效。 -
当使用vi/vim编辑文件时,触发事件掩码为
IN_MOVE_SELF、IN_ATTRIB、IN_DELETE_SELF、IN_IGNORED,
当使用桌面方式gedit编辑文件时,触发事件掩码为IN_MOVE_SELF、IN_ATTRIB、IN_DELETE_SELF、IN_IGNORED
,原因是有些系统或编辑器,在打开一个文件时,会先创建一个副本,或者临时文件,编辑或者修改的文件实际是临时文件,在保存时,会用临时文件替换源文件,所以可能会触发诸多事件,临时文件可能会长久存在。
3)特别注意,因修改文件后保存时源文件被删除或者替换,会自动调用inotify_rm_watch()
从监测列表中移除被修改的文件监控描述符wd
,触发事件IN_IGNORED
,如需持续监测,在接收到IN_IGNORED
事件掩码后,需要重新调用inotify_add_watch()
将需要监测的文件重新添加到监测列表。测试系统为凝思6.08
4)当event->len > 0时,该监控项为目录或目录下的文件,event->name __flexarr为监测项的子项名
,当监控目录时,与该目录自身以及该目录下面的文件都会被监控。