简述

Linux inotify是一种监控文件系统中文件和目录变化的机制,能够实时地监视文件和目录的变化并通知相应的进程。

Linux系统中,文件系统的访问和管理是通过系统调用进行的。inotify机制是基于这些系统调用实现的,主要是通过inotify_init创建一个inotify实例,并使用inotify_add_watch注册需要监控的文件或目录。一旦文件或目录发生变化,例如文件被创建、修改、删除、重命名等操作,inotify机制就会通知相应的进程。

通过inotify机制,可以轻松地监控文件系统中的变化,例如:

当一个文件被创建时,通知相应的进程进行处理。
当一个目录被修改时,通知相应的进程重新加载目录中的文件。
当一个文件被删除时,通知相应的进程进行清理操作等。
inotify机制在许多常见的应用程序中都得到了广泛的应用,例如监控日志文件、文件同步等。它的优点在于可以实时地获取文件系统的变化,而不需要使用轮询等方式浪费系统资源。

方法详解

  1. int inotify_init(void):创建一个inotify实例并返回其文件描述符。该函数不需要参数,返回一个非负整数,如果失败则返回-1。
  2. int inotify_add_watch(int fd, const char *pathname, uint32_t mask):将pathname指定的文件或目录加入到inotify实例中进行监控。参数fdinotify实例的文件描述符,pathname是要监控的文件或目录的路径,mask是要监听的事件类型,包括以下几种事件:
  • IN_ACCESS:文件或目录被访问
  • IN_ATTRIB:文件或目录属性发生变化
  • IN_CLOSE_WRITE:文件或目录被写入并关闭
  • IN_CLOSE_NOWRITE:文件或目录被关闭,但未被写入
  • IN_CREATE:在监控目录下创建文件或目录
  • IN_DELETE:在监控目录下删除文件或目录
  • IN_DELETE_SELF:删除监控目录
  • IN_MODIFY:文件或目录被修改
  • IN_MOVE_SELF:监控目录被移动
  • IN_MOVED_FROM:文件或目录从监控目录中移动出去
  • IN_MOVED_TO:文件或目录移动到监控目录中
  • IN_OPEN:文件或目录被打开

可以使用位或运算符将多个事件类型合并起来。该函数返回一个非负整数表示此文件或目录的监控描述符,如果失败则返回-1。

  1. int inotify_rm_watch(int fd, int wd):停止对指定监控描述符的监控。参数fdinotify实例的文件描述符,wd是要停止监控的文件或目录的监控描述符。该函数不返回值。
  2. ssize_t read(int fd, void *buf, size_t count):读取inotify实例中的事件。参数fdinotify实例的文件描述符,buf是存放事件的缓冲区,count是缓冲区的大小。该函数返回读取到的字节数,如果返回0表示监控实例中没有新的事件产生,如果返回-1表示读取失败。

在读取到事件后,可以通过以下结构体来解析事件:

cCopy codestruct inotify_event {int      wd;       // 监控描述符uint32_t mask;     // 事件类型uint32_t cookie;   // 对于MOVED_FROM和MOVED_TO事件,用cookie来关联事件uint32_t len;      // 文件名的长度char     name[];   // 文件名
};

其中,wd是事件所对应的监控描述符,mask是事件类型,cookie是用于关联MOVED_FROM和MOVED_TO事件的cookielen是文件名的长度,name是文件名。

实例

当你想知道一个目录下是否有文件被创建、删除、修改或移动时,可以使用inotify机制来实现。以下是一个简单的例子:

假设我们有一个目录/tmp,希望在该目录下监控所有文件的变化。可以使用inotify机制来监控这个目录,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>#define EVENT_SIZE (sizeof(struct inotify_event))
#define BUF_LEN (1024 * (EVENT_SIZE + 16))int main(int argc, char **argv) {int fd, wd, length, i = 0;char buffer[BUF_LEN];// 创建inotify实例fd = inotify_init();if (fd < 0) {perror("inotify_init");exit(EXIT_FAILURE);}// 添加监控路径wd = inotify_add_watch(fd, "/tmp", IN_CREATE | IN_DELETE | IN_MODIFY);if (wd < 0) {perror("inotify_add_watch");exit(EXIT_FAILURE);}// 循环读取inotify事件while (1) {length = read(fd, buffer, BUF_LEN);if (length < 0) {perror("read");exit(EXIT_FAILURE);}// 处理inotify事件i = 0;while (i < length) {struct inotify_event *event = (struct inotify_event *) &buffer[i];if (event->len) {if (event->mask & IN_CREATE) {if (event->mask & IN_ISDIR)printf("目录 %s 被创建了\n", event->name);elseprintf("文件 %s 被创建了\n", event->name);}else if (event->mask & IN_DELETE) {if (event->mask & IN_ISDIR)printf("目录 %s 被删除了\n", event->name);elseprintf("文件 %s 被删除了\n", event->name);}else if (event->mask & IN_MODIFY) {if (event->mask & IN_ISDIR)printf("目录 %s 被修改了\n", event->name);elseprintf("文件 %s 被修改了\n", event->name);}}i += EVENT_SIZE + event->len;}}// 关闭inotify实例inotify_rm_watch(fd, wd);close(fd);return 0;
}

上述代码中,我们使用inotify_init()函数创建了一个inotify实例,并使用inotify_add_watch()函数将/tmp目录添加到监控列表中,监听文件的创建、删除和修改事件。然后进入一个无限循环,使用read()函数读取inotify实例中的事件,处理文件变化事件,并输出相应的提示信息。

例如,当在/tmp目录下新建了一个文件test.txt,程序会输出:

文件 test.txt 被创建了

类似地,当有文件被删除、修改或移动时,程序也会收到相应的事件通知。这样就可以实时监控文件系统的变化,进行相应的操作。

Linux inotify相关推荐

  1. Linux inotify功能及实现原理【转】

    转自:http://blog.csdn.net/myarrow/article/details/7096460 1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制. 众所 ...

  2. linux --- inotify 文件系统变化通知机制

    Linux --- inotify 文件系统变化通知机制 在linux下开发过程中,用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供 ...

  3. Linux inotify功能及原理(inotify_init、inotify_add_watch、inotify_rm_watch、read)

    1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制. 开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备 ...

  4. 如何修复GitKraken Inotify Limit Error\idea erro - 升级Ubuntu / Linux inotify限制

    GitKraken是一个非常优秀的Git客户端.如果您是软件开发人员,那么您绝对应该试试GitKraken.今天我去了我的一个存储库做了一些提交,但是GitKraken告诉我它已经得到了Inotify ...

  5. Linux inotify + Epoll实现机制

    首先学习Inotify机制,就是Linux系统下对文件目录的监听,如果目录下有文件创建删除都可以被监听到,那这个有什么作用呢? 在Android Input系统中可以实现对设备热插拔的监听.我们先看一 ...

  6. Linux Inotify详解

    本文转自 https://blog.csdn.net/longwang155069/article/details/54016789 描述 Inotify API用于检测文件系统变化的机制.Inoti ...

  7. linux inotify 监控文件系统事件

    1. Inotify 机制概述 1.1. Inotify 介绍 在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等.如果需要作到实时同步或者监控,就需要使用内 ...

  8. linux中的inotify

    文件系统事件监控对于从文件管理器到安全工具的各种程序都是必要的,但是 dnotify(早期内核中的标准)存在一些局限性,这使我们期待出现一种更加完善的机制.抱着这种期待,我们发现了 inotify,一 ...

  9. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...

最新文章

  1. 国家队基金押注,国内商用车ADAS龙头进军乘用市场
  2. tsf php,TSF:腾讯推出的 PHP 协程方案
  3. java runtime.exec 阻塞_关于Runtime.getRuntime().exec()产生阻塞的2个陷阱
  4. 《XML程序设计》要点
  5. ECharts - 背景透明
  6. JS关键字和保留字汇总
  7. 集合源码(一)之hashMap、ArrayList
  8. 每日算法系列【LeetCode 309】最佳买卖股票时机含冷冻期
  9. 金电容(法拉电容)与可充放电池的相关知识
  10. 如何用B表的数据,更新A表的值
  11. c语言小游戏如何编写,如何用c语言编写小游戏.docx
  12. mysql查询员工表中所有员工入职20个月之后的日期_新员工入职指南
  13. 【读书摘记】《黄金时代》 -王小波
  14. 关于Flutter应用程序的AndroidX兼容性
  15. Kademlia详解
  16. VS2015基础开发流程
  17. 链家网页爬虫_爬虫小技巧——以最简单的方式爬取链家房源信息
  18. APP实用总结—Android图书馆
  19. 细胞器基因组|比较基因组分析助力深度挖掘细胞器进化关系
  20. Linux安装aria2,并使用AriaNg图形管理

热门文章

  1. mysql ceil_MySQL笔记之数学函数详解_MySQL - ceil
  2. 【数据库视频】报表服务
  3. 保险公司风控是什么意思?风控时代买保险要注意哪些问题?
  4. 三角形的决策表优化问题
  5. 各种说明方法的答题格式_说明方法的作用答题格式
  6. Spring源码整体分析
  7. 解决tomcat运行报错java.lang.UnsatisfiedLinkError: apache-tomcat-7.0.37\bin\tcnative-1.dll:Can load AMD 64
  8. mpvue的使用(一)必要的开发环境
  9. Python基础经典问题-求sin正弦值
  10. 技术人员如何判断靠谱的创业合伙人?