温馨提示×

ubuntu readdir会报错吗

小樊
37
2026-10-27 02:57:15
栏目: 智能运维

在 Ubuntu(Linux) 上,readdir 本身是可能报错的,但是否报错取决于 使用方式、文件系统和运行环境。

下面分情况说清楚。


1. readdir 是什么

在 Ubuntu 中,readdir 通常指:

  • 系统调用:readdir(2)(较老,不推荐)
  • POSIX 函数:readdir(3)(最常用,来自 <dirent.h>)

示例代码:

#include <dirent.h>

DIR *dir = opendir("/some/path");
struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {
    // 处理 entry
}

2. readdir 会不会“自己”报错?

readdir 本身一般不会直接返回错误码,而是在以下情况出问题:

✅ 正常情况

  • 目录存在、可访问
  • 没有权限问题
  • 文件系统正常

→ readdir 返回 NULL 表示读完了


❌ 可能“报错 / 异常”的情况

(1)目录打开失败(不是 readdir 的问题)

DIR *dir = opendir("/no/such/dir");
if (!dir) {
    perror("opendir");
}

真正错误在 opendir


(2)读取过程中发生错误

errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
    perror("readdir");
}

常见错误:

  • EACCES:权限不足
  • ENOENT:目录被删除
  • EBADF:DIR 指针无效
  • ENOMEM:内存不足

⚠️ 注意:
readdir 返回 NULL 不代表一定出错,必须配合 errno 判断。


(3)网络/特殊文件系统

在 Ubuntu 上如果目录是:

  • NFS
  • FUSE
  • 挂载失败的设备

readdir 可能:

  • 卡住
  • 返回错误
  • 部分读取

(4)并发修改目录

如果在 readdir 过程中:

  • 目录被删除
  • 文件被大量增删

可能出现:

  • 读到不完整结果
  • EBADF

3. 推荐的安全写法(Ubuntu / Linux)

DIR *dir = opendir(path);
if (!dir) {
    perror("opendir");
    return;
}

errno = 0;
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    // 正常处理
}

if (errno != 0) {
    perror("readdir");
}

closedir(dir);

4. 总结一句话

Ubuntu 上 readdir 本身很少“无缘无故”报错,但目录异常、权限问题、文件系统问题都会导致它出错。

如果你愿意,可以告诉我:

  • 你用的是 C / C++ / Python / shell
  • 具体报错信息(errno 或 perror 输出)

我可以帮你精准定位问题。

0 踩