我正在开发一个软件,该软件将利用 inotify 来跟踪大量文件(数万到数十万个文件)的更改。我想出了这些想法:
- 每个文件一个手表
- 每个父目录一个监视
- 避免 inotify 并定期扫描文件系统以获取更改(不推荐)
我将拥有一个包含我正在观看的所有文件和一些基本统计信息(如运行时间和大小)的数据库,但是,我必须统计该目录中的每个文件,直到找到发生更改的文件。
大量(100,000+)的 inotify 监视和大量 stat 调用哪个更快?
我认为减少 stat 调用的次数会更好,但我对 inotify 还不够了解。
笔记:
这将在工作站而不是服务器上运行。它的主要目的是同步客户端和远程服务器之间的更改(可能是整个文件系统)。
答案1
当您read()
使用 inotify fd 时,name
返回的结构体的字段会告诉您相对于正在监视的目录修改了哪个文件,因此您不必在事件发生后统计目录中的每个文件。
看http://linux.die.net/man/7/inotify
具体来说:
struct inotify_event { int wd; /* Watch descriptor */ uint32_t mask; /* Mask of events */ uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */ uint32_t len; /* Size of 'name' field */ char name[]; /* Optional null-terminated name */ };
仅当为监视目录中的文件返回事件时,名称字段才会出现;它标识相对于监视目录的文件路径名。该路径名以 null 结尾,并且可以包括更多的 null 字节,以将后续读取对齐到合适的地址边界。