温馨提示×

linux readdir如何处理链接

小樊
42
2026-10-26 04:38:52
栏目: 智能运维

在 Linux 下使用 readdir() 读取目录时,符号链接(软链接)的处理方式取决于链接本身位于哪里,而不是它指向什么。

下面分情况说明。


一、readdir() 读取目录时遇到符号链接

1️⃣ 符号链接作为目录中的一项

如果目录里有:

file.txt
link_to_file -> file.txt
subdir/
link_to_dir -> subdir/

readdir() 会照常返回这些链接项,并且:

  • struct dirent 中的 d_type 通常为:
    • DT_LNK(符号链接)
  • 不会自动跟随链接

示例:

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

✅ 此时 readdir() 不会进入链接指向的目录


二、目录本身是符号链接的情况

2️⃣ 用 opendir() 打开一个符号链接目录

DIR *dir = opendir("link_to_dir");
  • opendir() 会跟随符号链接
  • readdir() 读取的是目标目录内容

等价于:

cd link_to_dir
ls

⚠️ 如果链接失效(悬空链接),opendir() 返回 NULL


三、如何判断是否要“跟随链接”

✅ 不跟随(只看目录项)

  • 使用 readdir()
  • 使用 lstat() 判断
struct stat st;
lstat(entry->d_name, &st);
if (S_ISLNK(st.st_mode)) {
    // 是符号链接
}

✅ 跟随链接

  • 使用 stat()
  • 或使用 opendir() / open()(自动跟随)

四、递归遍历目录时的常见做法

推荐逻辑(安全遍历):

if (entry->d_type == DT_DIR) {
    // 普通目录
} else if (entry->d_type == DT_LNK) {
    // 可选:是否跟随
}

⚠️ 注意:

  • d_type 在某些文件系统上可能是 DT_UNKNOWN
  • 更可靠方式用 lstat()

五、硬链接 vs 符号链接

类型 readdir 表现
硬链接 与普通文件无异
符号链接 DT_LNK

readdir() 无法区分硬链接


六、总结一句话

readdir() 会把符号链接当作普通目录项返回,不会自动进入链接指向的目标;是否跟随由你调用 stat / opendir 决定。

如果你有:

  • 递归遍历代码
  • 防循环链接需求
  • 或使用 readdir_r / getdents

可以继续问,我可以给完整示例。

0 踩