Linux开发--inotify事件机制

来源:互联网 发布:快餐店数据流程图 编辑:程序博客网 时间:2024/05/17 08:21
    Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。
    在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;}


0 0
原创粉丝点击