Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。
在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化。
近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。
如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:
grep -r INOTIFY_USER /boot/
在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化。
近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。
如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:
grep -r INOTIFY_USER /boot/
如果输出"CONFIG_INOTIFY_USER=y",便可以使用inotify机制。
下面代码展示了利用inotify对/etc/目录下文件读写进行监控:
#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>
#define NAME_MAX 100
#define BUF_LEN (10 * sizeof(struct inotify_event) + NAME_MAX +1)
int get_inotify()
{
int fd;
fd = inotify_init();
if (fd == -1)
{
perror("inotify_init");
return -1;
// exit (EXIT_FAILURE);
}
int wd;
wd = inotify_add_watch(fd, "/etc/, IN_ACCESS | IN_MODIFY);
if (wd == -1)
{
perror ("inotify_add_watch");
return -1;
// exit (EXIT_FAILURE);
}
char buf[BUF_LEN] __attribute__((aligned(4)));
while(1)
{
ssize_t len, i = 0;
/* read BUF_LEN bytes’ worth of events */
len = read (fd, buf, BUF_LEN);
/* loop over every read event until none remain */
while (i < len)
{
struct inotify_event *event = (struct inotify_event *) &buf[i];
printf("wd=%d mask=%d cookie=%d len=%d dir=%s\n",
event->wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR) ? "yes" : "no");
/* if there is a name, print it */
if (event->len)
{
printf ("name=%s\n", event->name);
}
/* update the index to the start of the next event */
i += sizeof(struct inotify_event) + event->len;
}
}
return 0;
}
int main(int argc, char const *argv[])
{
/* code */
get_inotify();
return 0;
}