当前位置:嗨网首页>书籍在线阅读

26-监视

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.7.2 监视

进程完成inotify初始化之后,会设置监视(watches)。监视是由监视描述符(watch descriptor)表示,由一个标准UNIX路径以及一组相关联的监视掩码(watch mask)组成。监视掩码会通知内核,该进程关心哪些事件(比如读取、写入操作或二者兼有)。

inotify可以监视文件和目录。当监视目录时,inotify会报告目录本身和该目录下的所有文件事件(但不包括监视目录的子目录下的文件——监视不是递归的)。

添加一个新的监视

系统调用inotify_add_watch()会在文件或目录path上添加一个监视,监视事件是由mask确定,监视实例由fd指定:

390.png 成功时,inotify_add_watch()调用会返回新建的监视描述符。失败时,返回-1,并相应设置errno值为下列值之一:

EACCES不允许读取path指定的文件。添加监视的进程必须能读取该文件。

EBADF文件描述符fd是无效的inotify实例。

EFAULT无效的path指针。

EINVAL监视掩码mask包含无效的事件。

ENOMEM剩余内存不足,无法完成请求。

ENOSPC inotify监视总数达到用户上限。

监视掩码

监视掩码由一个或多个inotify事件的二进制或运算生成,其定义在<inotify.h>:

IN_ACCESS 从文件中读取。

IN_MODIFY 写入文件中。

IN_ATTRIB 文件的元数据(例如所有者、权限或扩展属性)发生变化。

IN_CLOSE_WRITE 文件已关闭,且已经以写入模式打开。

IN_CLOSE_NOWRITE 文件已关闭,且未曾以写入模式打开。

IN_OPEN 文件已打开。

IN_MOVED_FROM 文件已从监视目录中删除。

IN_MOVED_TO 文件已添加到监视目录。

IN_CREATE 文件已在监视目录创建。

IN_DELETE 文件已从监视目录删除。

IN_DELETE_SELF 监视对象本身已删除。

IN_MOVE_SELF 监视对象本身已删除。

还定义了以下事件,把两个或多个事件组合成单个值:

IN_ALL_EVENTS 所有合法的事件。

IN_CLOSE所有涉及关闭的事件(当前,即设置了IN_CLOSEWRITE和IN CLOSE_NOWRITE的事件)。

IN_MOVE 所有涉及删除的事件(当前,即设置了IN_MOVEDFROM和IN MOVED_TO的事件)。

现在,我们来看看如何在一个已存在的inotify实例中添加一个新的监视:

391.png 该例子会对目录/etc下的所有读写操作添加一个新的监视。如果/etc下所有文件被读取或写入,inotify会向其文件描述符fd发送事件,这个事件提供监视描述符 wd。我们一起来看一下inotify是如何表示这些事件的。