inotify监控Linux文件系统的必备利器
的事件结构体
1.struct inotify_event 2.{ 3.int wd; /* Watch descriptor. */ 4.uint32_t mask; /* Watch mask. */ 5.uint32_t cookie; /* Cookie to synchronize two events. */ 6.uint32_t len; /* Length (including NULs) of name. */ 7.char name __flexarr; /* Name. */ 8.}; 注意,只有当监控对象是一个目录并且事件与目录内部相关项目有关,而与目录本身无关时,才提供 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 标志. inotify 简单应用 这里的简单应用遵循以上的通用逻辑. 我们使用一个信号处理程序来监控 ctrl-c(SIGINT)并且 重置一个标志(keep_running)使应用了解终止操作. 真实的 inotify 调用在 utility 例程当中完成.注意, 我们还创建了一个队列,这样能够将事件从 inotify 底层对象中清除,留着稍后处理.在真实的应用当中,您可能希望用其他(具有更高优先级)的线程来完成这一操作. 这里的列举的应用程序,只是为了对一般原理进行举例说明.我们采用了一个简单的事件链表, 队列中的每一条目都包含原始事件加上用于存储指向队列中下一事件指针的空间. 主程序 清单 2 中展示了信号处理程序和主程序.在本例当中,对所有在命令行中出现过的文件或目录进行监控, 并利用事件掩码 IN_ALL_EVENTS 来监控每一对象的所有事件. 在真实的应用程序中,您可能只 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |