温馨提示×

centos readdir怎样释放资源

小樊
41
2026-10-23 17:23:26
栏目: 智能运维

在 CentOS(以及一般的 Linux/glibc 环境)里,readdir 相关资源释放主要取决于你用的是 哪种目录遍历方式。下面分情况说明。


一、使用 opendir + readdir + closedir

这是最传统、最常见的方式。

示例代码

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

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

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

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

资源释放说明

  • opendir → 打开目录,返回 DIR *
  • readdir → 不需要手动释放,返回的是 DIR 内部缓冲区
  • closedir(dir) → ✅ 必须调用,释放文件描述符和内存

⚠️ 忘记 closedir 会导致文件描述符泄漏


二、使用 readdir_r(线程安全版本,已过时)

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

readdir_r(dir, &entry, &result);
closedir(dir);

释放方式

  • entry 是你自己分配的栈变量 → 不需要释放
  • 仍然只需 closedir(dir)

三、使用 scandir(一次性读取整个目录)

struct dirent **namelist;
int n = scandir("/path", &namelist, NULL, alphasort);

释放方式(⚠️容易漏)

for (int i = 0; i < n; i++) {
    free(namelist[i]);   // ✅ 每个 entry
}
free(namelist);          // ✅ 数组本身

四、使用 getdents(系统调用,低级)

  • getdents 返回的是你自己的 buffer
  • 手动 free(buffer)
  • 目录用 open 打开,用 close 关闭

五、常见错误总结

错误 后果
忘记 closedir 文件描述符泄漏
对 readdir 返回值 free 未定义行为
scandir 后没 free 内存泄漏
多线程中误用 readdir 数据竞争

六、CentOS 特有关系

  • CentOS 7/8 使用 glibc
  • readdir 内部线程安全(glibc ≥ 2.0)
  • 不需要额外加锁,但不能多个线程共用同一个 DIR *

如果你能贴出具体代码或说明是 C / C++ / shell / Python,我可以更精确地告诉你该怎么释放。

0 踩