温馨提示×

centos readdir是否阻塞

小樊
45
2026-10-06 02:30:27
栏目: 智能运维

在 CentOS(以及一般的 Linux 系统)上,readdir 本身是阻塞的。

1. readdir 是什么

  • readdir 是 POSIX 标准函数(<dirent.h>)
  • 用于读取目录流(DIR *)中的下一个目录项
  • 在 glibc 和 Linux 内核中实现

2. 是否阻塞?

✅ 会阻塞

  • readdir 是一个 同步(阻塞)系统调用封装
  • 它内部会调用内核的 getdents / getdents64
  • 如果:
    • 目录在慢速文件系统(NFS、FUSE、网络存储)
    • 磁盘 I/O 繁忙
    • 目录非常大
  • 调用线程会被 阻塞,直到内核返回数据

3. 和 readdir_r 的关系

  • readdir_r 也是 阻塞的
  • 只是线程安全版本,不解决阻塞问题

4. 非阻塞替代方案

如果你需要“非阻塞读取目录”,常见做法:

✅ 方案 1:多线程

// 单独线程调用 readdir
// 主线程不阻塞

✅ 方案 2:异步 I/O(有限)

  • Linux 没有真正的异步 readdir
  • io_uring 目前也不支持目录遍历

✅ 方案 3:先用 open + getdents(仍阻塞)

本质一样

5. 总结

项目 说明
是否阻塞 ✅ 是
是否线程安全 ❌ readdir 否,readdir_r 是
能否异步 ❌ 不支持
CentOS 行为 与标准 Linux 一致

如果你有具体场景(比如高并发服务、NFS、超大目录),我可以给你更合适的方案。

0 踩