我希望我的程序能够有效地检测文件是否被添加到两次调用之间的目录中。该分析可能会阻止用户输入(这适用于 Fish shell),因此我希望它能够尽快运行,即使目录很大。
我仅限于标准 Unix,因此无法访问 inotify。
我想到的一种方法是将监视目录的文件列表存储在哈希集中,并在分析时读取整个目录并检查是否有任何条目不在哈希集中。另一种方法是仅 lstat 每个文件并比较创建时间。
无论如何,对于我的用例,我需要做两件事:
- 对每个条目调用 readdir。
- 对每个条目调用 lstat。(如果我使用第二种解决方案)
我的问题是:有没有一种有效的方法来批处理 readdir 和 lstat?
我思考readdir 不是系统调用,而是 SYS_getdents 系统调用的包装器,因此大概它会进行一些缓冲,但缓冲量是多少?效率如何?
而且 lstat 包装了一个系统调用 AFAIK。当您想要同时检查大量文件并且不想为每个文件支付上下文切换调用时,是否有更有效的版本?
答案1
是的,还有另一种方法—— getdents()
。它的工作方式几乎相同,readdir()
但它一次处理多个条目。因此,您可以为结构数组分配内存linux_dirent
并getdents()
尝试填充它。
这不是 POSIX 函数,因此如果您无法使用inotify
(您确定吗???),那么您也可能无法访问getdents()
。
但最终,这与类似结构数组getdents()
的手动循环没有什么不同。它不是包装器,因此与手动循环相比,它可能更有效(并且更不容易出现错误),但效率不会令人兴奋。readdir()
dirent
getdents()
readdir()
如果您的目标只是了解新文件何时出现在目录中或从目录中删除 - 您可以了解lstat()
目录本身。mtime
目录的目录在文件创建/删除时被修改。请注意,文件修改属于文件本身,不反映在目录的时间中。