inotify
![本页使用了标题或全文手工转换](http://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
![]() | 此条目翻译自英语维基百科,需要相关领域的编者协助校对翻译。 |
![]() | 此条目需要精通或熟悉相关主题的编者参与及协助编辑。 |
inotify是Linux核心子系统之一,做为档案系统的附加功能,它可监控档案系统并将异动通知应用程式。本系统的出现取代了旧有Linux核心里,拥有类似功能之dnotify模组。
inotify的原始开发者为John McCutchan、罗伯特·拉姆与Amy Griffis。于Linux核心2.6.13发行时(2005年六月十八日),被正式纳入Linux核心[1]。尽管如此,它仍可透过修补程式的方式与2.6.12甚至更早期的Linux核心整合。
inotify的主要应用于桌面搜索软体,像:Beagle,得以针对有变动的档案重新索引,而不必没有效率地每隔几分钟就要扫描整个档案系统。相较于主动轮询档案系统,透过作业系统主动告知档案异动的方式,让Beagle等软体甚至可以在档案更动后一秒内更新索引。
此外,诸如:更新目录检视、重新载入设定档、追踪变更、备份、同步甚至上传等许多自动化作业流程,都可因而受惠。
优点
[编辑]相较于被inotify取代较旧的 dnotify模组,inotify有诸多益处。[2][3]在旧的模组中,程式必须为每一个被监控的目录建立file descriptor,这种作法很容易让行程拥有的file descriptor逼近系统允许的上限,进而形成瓶颈。dnotify产生的file decriptor也会导致系统资源忙碌,使可移除装置无法被移除,徒增使用上的困扰。
由于dnotify只能让程式设计师监控目录层级的变化,“精细度”亦是“dnotify”的劣势之一。为此,程式设计师必须付出额外的心力,自行撰写程式码以期追踪更细微的档案系统事件。
inotify相较之下使用较少的file descriptor,亦允许select()与poll()介面,优于dnotify使用的信号系统。这也使得inotify与既有以select()或poll()为基础之函式库(如:Glib)整合更加便利。
运作方式
[编辑]inotify拥有专为其设计的系统函式。十分容易上手。
#include <sys/inotify.h>
要使用inotify必须先引用上面的标头档。
int inotify_init(void)
建立一个inotify的实体并回传一个file descriptor,此档案描述子可供读取档案事件。随后,可透过read()接收事件,为了避免不断轮询档案,read()预设将采用同步I/O的模式,直到事件发生后才会返回。
int inotify_add_watch(int fd, const char* pathname, int mask)
透过路径名称(pathname)并选定遮罩(mask)以监控inode。inotify_add_watch()会回传一个监控器(watch descriptor),它代表pathname指向的inode(不同的pathname有可能指向相同的inode)。
int inotify_rm_watch(int fd, int wd)
取消对某个路径之监控。
如同之前所描述的,当档案系统异动时,核心将会依据程式设定的条件,触发相应的事件。事件的结构如下:
栏位名称 | 内容描述 |
---|---|
wd | 监控子 |
mask | 事件遮罩 |
cookie | 用来辨别IN_MOVED_FROM与IN_MOVED_TO事件 |
len | name栏位长度 |
name | 触发该事件的档案名称(以上层目录为基准) |
可供应用程式追踪的事件有:
- IN_ACCESS - 读取档案
- IN_MODIFY - 档案被修改
- IN_ATTRIB - 档案属性变更
- IN_OPEN - 档案被开启
- IN_CLOSE_WRITE - 被开启为“可写入”状态的档案遭关闭
- IN_CLOSE_NOWRITE - 被开启为“非写入”状态的档案遭关闭
- IN_MOVED_FROM and IN_MOVED_TO - 档案被搬动或更名
- IN_DELETE - 档案或目录被删除
- IN_CREATE - 监控中的目录下有新档案产生
- IN_DELETE_SELF - 监控中的档案遭删除
缺点
[编辑]inotify无法监控软链接型的子目录。
历史沿革
[编辑]相关条目
[编辑]参考资料
[编辑]- ^ Linux 2.6.13, kernelnewbies.org. [2012-03-06]. (原始内容存档于2020-10-19).
- ^ Why inotify?. [2012-03-06]. (原始内容存档于2010-01-16).
- ^ inotify README file. [2012-03-06]. (原始内容存档于2016-12-29).
外部链接
[编辑]- Kernel Korner (页面存档备份,存于互联网档案馆) - Intro to inotify by Robert Love (2005)
- LWN Article on Inotify (页面存档备份,存于互联网档案馆) Watching filesystem events with inotify (partly out of date)
- IBM Article (页面存档备份,存于互联网档案馆) Monitor Linux file system events with inotify.