使用inotify监视Linux文件变化

简介: 作者:gfree.wind@gmail.com博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net  微博:weibo.com/glinuxer QQ技术群:4367710   本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。
作者:gfree.wind@gmail.com
博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net
 
微博:weibo.com/glinuxer
QQ技术群:4367710
 
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。

============================================================================================================================================================

Linux系统中提供了一套intotify的机制来监视文件系统的事件,比如创建文件,打开,关闭等等。利用这一机制,我们可以很容易写出监控目录变化的工具。更何况更有了一个inotify_tools的开源工程呢。inotify_tools对inotify的API做了进一步的封装,更加方便使用。

下面的例子来源于inotify_tools的示例代码,但是做了一些改进。inotify_tools监视一个目录时,可以得到该目录变化的信息。但是在该目录下,创建一个子目录后,子目录中的变化,inotify_tools不能获取。所以我添加了动态监控目录的代码。

  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. #include <inotifytools/inotifytools.h>
  4. #include <inotifytools/inotify.h>

  5. enum {
  6.     ACTION_NULL_WD,
  7.     ACTION_ADD_WD,
  8.     ACTION_DEL_WD,
  9. };

  10. int main(int argc, const char **argv)
  11. {
  12.     int err = 0;

  13.     if (!inotifytools_initialize()) {
  14.         printf("inotifytools_initialize failedn");
  15.         goto error;
  16.     }

  17.     inotifytools_initialize_stats();

  18.     const char *monitor_path = ".";
  19.     if (argc > 1) {
  20.         monitor_path = argv[1];
  21.     }
  22.     printf("Monitor dir(%s)n", monitor_path);

  23.     if (!inotifytools_watch_recursively(monitor_path, IN_ALL_EVENTS)) {
  24.         printf("inotifytools_watch_recursively failedn");
  25.         goto error;
  26.     }

  27.     inotifytools_set_printf_timefmt("%F %T");

  28.     struct inotify_event * event = inotifytools_next_event(-1);
  29.     char path[256];
  30.     while (event) {
  31.         inotifytools_printf( event, "%T %w%f %en" );

  32.         if (IN_ISDIR&event->mask) {
  33.             int action = ACTION_NULL_WD;

  34.             if ((IN_DELETE|IN_DELETE_SELF|IN_MOVED_FROM)&event->mask) {
  35.                 action = ACTION_DEL_WD;
  36.                 snprintf(path, sizeof(path), "%s%s",
  37.                         inotifytools_filename_from_wd(event->wd),
  38.                         event->name);
  39.                 printf("Remove path(%s) from wdn", path);
  40.             } else if (((IN_CREATE|IN_MOVED_TO)&event->mask) && (IN_ISDIR&event->mask)) {
  41.                 action = ACTION_ADD_WD;
  42.                 snprintf(path, sizeof(path), "%s%s",
  43.                         inotifytools_filename_from_wd(event->wd),
  44.                         event->name);
  45.                 printf("Add path(%s) into wdn", path);
  46.             }

  47.             if (ACTION_ADD_WD == action) {
  48.                 if (!inotifytools_watch_recursively(path, IN_ALL_EVENTS)) {
  49.                     printf("inotifytools_watch_recursively failedn");
  50.                     goto error;
  51.                 }
  52.             } else if (ACTION_DEL_WD == action) {
  53.                 if (!inotifytools_remove_watch_by_wd(event->wd)) {
  54.                     printf("inotifytools_remove_watch_by_wd failed. event->wd(%d)n", event->wd);
  55.                     goto error;
  56.                 }
  57.             }
  58.         }
  59.         event = inotifytools_next_event(-1);
  60.     }

  61.     printf("Exitn");

  62.     return 0;

  63. error:
  64.     err = inotifytools_error();
  65.     printf("Error(%d)n", err);
  66.     return -1;
  67. }

代码很简单。就是在获得事件以后,检查是否为目录。如果是目录,则需要进行动态监控的检查。如果是创建动作,那么就添加新的监控。如果是删除动作,就去掉已有的监控wd。
目录
打赏
0
0
0
0
77
分享
相关文章
|
1天前
|
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
20 5
Linux 常用文件查看命令
|
7天前
|
Linux od命令
本文详细介绍了Linux中的 `od`命令,包括其基本语法、常用选项和示例。通过这些内容,你可以灵活地使用 `od`命令查看文件内容,提高分析和调试效率。确保理解每一个选项和示例的实现细节,应用到实际工作中时能有效地处理各种文件查看需求。
43 19
|
17天前
|
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
30 2
|
18天前
|
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
107 25
|
1月前
|
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
77 24
Linux系统之whereis命令的基本使用
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
56 11
|
3月前
|
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
209 8
|
3月前
|
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
312 20
|
3月前
|
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
135 14
Linux 10 个“who”命令示例
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等