暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux文件事件监控之Fanotify [一]

术道经纬 2020-10-14
743

从监听到监控

Linux的文件事件监听的原理并不复杂,简单说就是当一个应用层的进程操作一个目录或文件时,会触发system call,此时内核的notification子系统可以守在那里,把该进程对文件的操作上报给应用层的监听进程(称为listerner)。

在这个领域,自2001年的2.4版本就引入的dnofify可以说是先驱,然而,它的缺陷实在太多了。正如其名字传达的,只能监控directory,并且它采用的向listener通知的机制是古老的signal,可以携带的信息很有限。


所以,dnofify基本已经成了「先烈」,一个更优秀的名为"inofify"的监听机制于2005年在2.6.13内核中亮相,它除了可以监控目录,还可以监听普通文件产生的事件。此外,inotify摈弃了signal机制,改为通过event queue的形式向listener上传事件的相关信息。


看起来,inotify已经算是比较完备了,但是它在应用上还是存在诸多限制。其中一个最明显的问题是它只能"notify",作为listener,只是知道有这个文件事件发生了,最多记录一下,但并不能改变什么(比如被杀毒软件判定为病毒文件,就需要阻止这个操作)。

到了内核2.6.36,fanotify的出现解决了这个痛点,允许listener介入并改变文件事件的行为,才算实现了从监听到监控的跨越,同时也扩展了其应用的范围。

两个API

fanotify的调用接口是比较简洁的,主要有2个API,但其可携带的参数还是为它的使用增加了很多的灵活性。作为listerner,首先需要通过fanotify_init()函数来设定监控的模式:

#include <fcntl.h>

#include <sys/fanotify.h>


int fanotify_init(unsigned int flags, unsigned int event_f_flags);