简短结论:正常情况下 readdir 不会“漏读”文件,但在某些特殊场景下,确实可能出现“看起来像漏读”的现象。
下面分情况说明。
在 目录内容在遍历期间不发生变化 的情况下:
opendir + readdir + closedir例如:
DIR *dir = opendir(path);
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
这是标准用法,不会漏文件。
如果在 readdir 遍历目录时:
可能出现:
原因:
readdir 依赖 目录偏移量(inode 内部 cursor)✅ 这是设计行为,不是 bug
readdir_r 但 buffer 不正确(历史问题)老代码常见错误:
struct dirent ent;
readdir_r(dir, &ent, &result); // 错误
正确应是:
struct dirent *ent = malloc(sizeof(struct dirent) + NAME_MAX + 1);
否则可能导致:
⚠️ 现代 glibc 已 废弃 readdir_r,建议只用 readdir
readdir 本身不会漏EINTR)常见误区:
“我刚创建的文件没列出来” 实际是:
- 创建发生在
opendir之后- 或落盘延迟(如 overlayfs / nfs)
在以下文件系统上:
readdir 一致性 弱于本地 ext4/xfs
可能出现:
readdir 会返回:
....file)如果你“觉得漏了”,可能是:
. / ..✅ 推荐做法:
ls / stat 一次快照inotify 监听变化
readdir本身不会漏读文件,但在目录并发修改、网络文件系统或错误使用 API 的情况下,会出现“漏读”的表象。
如果你愿意,可以告诉我:
我可以给你更具体的建议或示例代码。