Linux开发--inotify事件机制

    xiaoxiao2021-03-25  124

        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; }

    转载请注明原文地址: https://ju.6miu.com/read-8964.html

    最新回复(0)