温馨提示×

ubuntu readdir为何返回空值

小樊
47
2026-10-03 16:12:55
栏目: 智能运维

在 Ubuntu(Linux)下,readdir 返回“空值”或“看起来没东西”,通常不是函数本身出错,而是使用方式或环境理解有误。下面按常见原因逐一说明。


一、readdir 返回的是 NULL 的正常情况

1. 目录读取结束(最常见)

readdir 读到目录末尾就会返回 NULL,这是正常行为,不是错误。

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

while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}
// 最后 readdir 返回 NULL,表示结束

✅ 解读:

  • 返回 NULL ≠ 目录为空
  • 返回 NULL 可能是:
    • 目录读完了(正常)
    • opendir 失败(但这时 dir == NULL)

二、目录本身为空

如果目录中没有任何文件(包括隐藏文件):

ls -a /empty_dir

输出只有:

.  ..

那么 readdir 会:

  • 先返回 .
  • 再返回 ..
  • 然后返回 NULL

如果你只看到“空”,可能是因为:

  • 你过滤掉了 . 和 ..
  • 误以为 NULL 表示“没文件”

三、opendir 失败但你没检查

常见错误代码:

DIR *dir = opendir("/path");
readdir(dir); // dir 可能是 NULL

如果:

  • 路径不存在
  • 权限不足

opendir 返回 NULL,这时 readdir 行为是未定义或立即返回 NULL

✅ 正确写法:

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

四、路径问题(相对路径 / chdir)

1. 你以为在 A 目录,其实在 B 目录

opendir("test");

实际取决于当前工作目录

检查:

system("pwd");

2. 程序被 systemd / 服务启动

工作目录可能是 / 或 /tmp


五、权限问题(Ubuntu 常见)

Ubuntu 下:

  • /root
  • 某些 /var/lib
  • 挂载目录

普通用户无法读取:

ls -ld /some/dir

如果权限是:

drwx------ root root

你的程序读到的就是“空”或失败


六、你读的是文件而不是目录

opendir("/etc/passwd"); // 错

结果:

  • opendir 返回 NULL
  • 或 readdir 异常

✅ 只能是目录


七、多线程 / 并发问题

readdir 不是线程安全函数

多线程中应使用:

readdir_r

(或 C 库较新版本中的 readdir + 锁)


八、挂载点“假空”

例如:

  • NFS 没挂载成功
  • fusermount 失败
  • Docker volume 没映射

表现:

  • opendir 成功
  • readdir 很快返回 NULL

检查:

mount | grep your_path
df -h

九、示例代码(推荐写法)

#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir(".");
    if (!dir) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

十、如何判断“真的是空”还是“出错了”

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

但注意:

  • 正常结束不会设置 errno
  • 只有出错才会

如果你愿意,可以把:

  • 你的代码片段
  • 目录路径
  • Ubuntu 版本

发出来,我可以精确告诉你为什么返回空。

0 踩