温馨提示×

linux readdir是否支持符号链接

小樊
42
2026-10-17 07:41:34
栏目: 智能运维

在 Linux 中,readdir 本身是否“支持”符号链接,取决于你从哪个角度理解“支持”:


1. readdir 对符号链接的“读取”行为

结论:支持,而且默认就会返回符号链接。

  • readdir()(以及 readdir64、getdents 等)只是 读取目录项(directory entry)
  • 它不关心文件类型,只返回:
    • 文件名
    • inode 号
    • 文件类型(在 d_type 中,若支持)
  • 符号链接在目录中就是一个普通目录项
  • 所以:
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        // 符号链接也会在这里出现
    }
    

如果你用 d_type 判断:

if (entry->d_type == DT_LNK) {
    // 这是一个符号链接
}

注意:d_type 在某些文件系统(如某些网络文件系统)上可能是 DT_UNKNOWN


2. readdir 是否“跟随”符号链接?

结论:不跟随。

  • readdir 不会自动解析符号链接指向的目标
  • 它只告诉你:“这个目录项是一个符号链接”
  • 是否解析,需要你自己调用:
    • stat() → 跟随符号链接
    • lstat() → 不跟随,获取符号链接本身信息
    • readlink() → 读取链接指向的路径

示例:

lstat(entry->d_name, &sb);
if (S_ISLNK(sb.st_mode)) {
    // 是符号链接本身
}

3. opendir("符号链接目录") 的情况

  • 如果你 opendir() 一个指向目录的符号链接:
    • ✅ 会自动跟随
    • 读取的是目标目录内容
  • 如果你 opendir() 一个指向文件的符号链接:
    • ❌ 失败(ENOTDIR)

4. 总结一句话

问题 答案
readdir 是否能看到符号链接? ✅ 能
readdir 是否区分符号链接? ✅ 通过 d_type 或 lstat
readdir 是否解析符号链接? ❌ 不解析
opendir 符号链接目录 ✅ 会自动跟随

如果你愿意,我也可以:

  • 给你一个 完整 C 示例
  • 对比 readdir vs scandir
  • 讲 递归遍历时符号链接的处理陷阱

你想看哪一块?

0 踩