如何监控Linux文件系统事件:inotify使用指南(1)(2)
通告
当您的应用程序读取到一个通告时,事件的顺序也被读取到您提供的缓存中。事件在一个变长结构中被返回,如清单 1 所示。如果数据占满了您的缓存,您可能需要对最后一个条目进行局部事件信息或者局部名处理。
清单 1. 用于 inotify 的事件结构体
struct inotify_event { int wd; /* Watch descriptor. */ uint32_t mask; /* Watch mask. */ uint32_t cookie; /* Cookie to synchronize two events. */ uint32_t len; /* Length (including NULs) of name. */ char name __flexarr; /* Name. */ };
请注意,只有当监控对象是一个目录并且事件与目录内部相关项目有关,而与目录本身无关时,才提供 name 字段。如果 IN_MOVED_FROM 事件与相应的 IN_MOVED_TO 事件都与被监控的项目有关,cookie 就可用于将两者关联起来。事件类型在掩码字段中返回,并伴随着能够被内核设置的标志。例如,如果事件与目录有关,则标志 IN_ISDIR 将由内核设置。
可监控的事件
有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。
- IN_ACCESS
- 被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
- IN_MODIFY
- 被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
- IN_ATTRIB
- 被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
- IN_CLOSE_WRITE
- 一个打开的,等待写入的文件或目录被关闭。
- IN_CLOSE_NOWRITE
- 一个以只读方式打开的文件或目录被关闭。
- IN_CLOSE
- 一个掩码,可以很便捷地对前面提到的两个关闭事件IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
- IN_OPEN
- 文件或目录被打开。
- IN_MOVED_FROM
- 被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
- IN_MOVED_TO
- 文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
- IN_MOVE
- 可以很便捷地对前面提到的两个移动事件IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
- IN_CREATE
- 在被监控目录中创建了子目录或文件。
- IN_DELETE
- 被监控目录中有子目录或文件被删除。
- IN_DELETE_SELF
- 被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
- IN_MOVE_SELF
- 监控项目本身被移动。
除了事件标志以外,还可以在 inotify 头文件/usr/include/sys/inotify.h)中找到其他几个标志。例如,如果只想监控第一个事件,可以在增加监控时设置 IN_ONESHOT 标志。
评论暂时关闭