简介

实现当有文件被修改的时候,通知程序,或者说唤醒程序。参考How do I make my program watch for file modification in C++? 以及 Monitor file system activity with inotify 以及 使用 inotify 监控文件系统的活动

API

  • inotify_init是用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符。
  • inotify_init1inotify_init 相似,并带有附加标志。如果这些附加标志没有指定,将采用与 inotify_init 相同的值。
  • inotify_add_watch增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中,是否只有路径代表一个目录才进行监控,是否要追踪符号链接,是否进行一次性监控,当首次事件出现后就停止监控。
  • inotify_rm_watch从监控列表中移出监控项目。
  • read读取包含一个或者多个事件信息的缓存。
  • close关闭文件描述符,并且移除所有在该描述符上的所有监控。当关于某实例的所有文件描述符都关闭时,资源和下层对象都将释放,以供内核再次使用。
  1. /* Create and initialize inotify instance. */
  2. extern int inotify_init (void) __THROW;
  3. /* Create and initialize inotify instance. */
  4. extern int inotify_init1 (int __flags) __THROW;
  5. /* Add watch of object NAME to inotify instance FD. Notify about
  6. events specified by MASK. */
  7. extern int inotify_add_watch (int __fd, const char *__name, uint32_t __mask)
  8. __THROW;
  9. /* Remove the watch specified by WD from the inotify instance FD. */
  10. extern int inotify_rm_watch (int __fd, int __wd) __THROW;

结构体

  1. /* Structure describing an inotify event. */
  2. struct inotify_event
  3. {
  4. int wd; /* Watch descriptor. */
  5. uint32_t mask; /* Watch mask. */
  6. uint32_t cookie; /* Cookie to synchronize two events. */
  7. uint32_t len; /* Length (including NULs) of name. */
  8. char name __flexarr; /* Name. */
  9. };

检测文件

list1.c
只能检测单个文件,

检测目录

list2.c

参考资料