温馨提示×

debian copendir和readdir关系

小樊
42
2026-09-22 05:44:23
栏目: 智能运维

在 Debian(以及所有类 Unix 系统,遵循 POSIX 标准)中,opendirreaddir配合使用的目录操作函数,通常一起用于遍历目录内容。

下面从关系、使用流程、示例代码、注意事项几个方面说明。


一、基本关系

函数 作用
opendir 打开一个目录,返回一个 DIR* 目录流指针
readdir opendir 打开的目录流中,逐个读取目录项(文件/子目录)

关系总结:

opendir 是“开门”,readdir 是“进门后一个个看里面有什么”


二、使用流程(标准套路)

DIR *dir = opendir(path);   // 1. 打开目录
if (!dir) {
    perror("opendir");
    return -1;
}

struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {  // 2. 循环读取
    printf("%s\n", entry->d_name);
}

closedir(dir);  // 3. 关闭目录

三、函数原型(Debian / glibc)

1. opendir

#include <dirent.h>

DIR *opendir(const char *name);
  • 成功:返回 DIR*
  • 失败:返回 NULL,并设置 errno

2. readdir

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • 成功:返回 struct dirent*
  • 结束:返回 NULL
  • 错误:返回 NULL,并设置 errno

四、struct dirent 常见字段

struct dirent {
    ino_t          d_ino;     // inode 号
    off_t          d_off;
    unsigned short d_reclen;
    unsigned char  d_type;    // 文件类型(DT_REG, DT_DIR...)
    char           d_name[];  // 文件名
};

⚠️ 注意:

  • ... 也会被 readdir 读到
  • d_type 在某些文件系统上可能为 DT_UNKNOWN

五、关键注意点(Debian 特有/常见坑)

1. 线程安全

  • readdir 不是线程安全
  • 多线程请用:readdir_r(已废弃)或 readdir + 加锁

2. 不要对 DIR* 做复制

DIR *a = opendir(".");
DIR *b = a;  // ❌ 错误用法

3. 遍历子目录要递归

readdir 只列出当前目录一层


六、与 scandir / getdents 的关系(扩展)

函数 说明
opendir + readdir 最基础、最常用
scandir 一次性读取并排序
getdents 系统调用层,更底层

七、一句话总结

在 Debian 中,opendir 打开目录流,readdir 从流中读取目录项,二者必须配对使用,最后用 closedir 关闭。

如果你需要:

  • 完整 C 示例
  • 递归遍历目录
  • 过滤文件类型
  • stat 配合使用

可以继续问我。

0