温馨提示×

ubuntu readdir怎么释放资源

小樊
33
2026-09-21 20:48:06
栏目: 智能运维

在 Ubuntu(Linux)下使用 readdir 读取目录时,所谓的“释放资源”主要涉及 打开的目录流(DIR* 和 遍历过程中的资源清理。下面按常见情况说明。


1. 基本用法与资源释放

readdir 依赖 opendir 返回的 DIR* 目录流,必须用 closedir 释放

示例代码

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

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

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

    closedir(dir);  // 释放目录资源
    return 0;
}

关键点

  • opendirreaddirclosedir
  • readdir 返回的 struct dirent * 不需要手动 free

2. readdir 返回的 struct dirent 需要释放吗?

不需要。

  • readdir 返回的指针指向 目录流内部缓冲区
  • 下一次调用 readdir 会覆盖它
  • 不能 free(entry)

❌ 错误示例:

free(entry);  // 错误!

3. 使用 readdir_r(线程安全版本)

如果你用的是 readdir_r

struct dirent entry;
struct dirent *result;

while (readdir_r(dir, &entry, &result) == 0 && result != NULL) {
    printf("%s\n", entry.d_name);
}

✅ 特点:

  • 你自己提供 struct dirent
  • 不需要释放任何指针
  • 只需 closedir(dir)

4. 常见资源泄漏场景

❌ 忘记 closedir

DIR *dir = opendir(".");
readdir(dir);
// 忘记 closedir(dir);

结果:文件描述符泄漏

✅ 正确做法(异常路径也要关)

DIR *dir = opendir(path);
if (!dir) return;

if (some_error) {
    closedir(dir);
    return;
}

5. C++ / RAII 方式(推荐)

如果你用 C++,可以用 std::unique_ptr 或封装类:

#include <dirent.h>
#include <memory>

struct DirCloser {
    void operator()(DIR* d) const { if (d) closedir(d); }
};

using DirPtr = std::unique_ptr<DIR, DirCloser>;

总结

资源 是否需释放 方法
DIR* ✅ 必须 closedir(dir)
struct dirent* ❌ 不需要 下次 readdir 覆盖
文件描述符 ✅ 间接 由 closedir 处理

如果你是在 Android / glibc / musl多线程环境 下用 readdir,可以告诉我,我可以给更具体的建议。

0