温馨提示×

linux readdir能读符号链接吗

小樊
45
2026-09-20 22:48:29
栏目: 智能运维

简短回答:readdir 本身不会“读取符号链接的内容”,但它能列出目录中的符号链接项**。**

下面分几种情况说清楚:


1. readdir 能“看到”符号链接吗?

能。

readdir() 用来读取一个目录里的条目(dirent),符号链接作为目录中的一个文件项,会被正常返回。

示例:

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

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

如果 /some/dir 里有:

file.txt
link -> file.txt

那么 readdir 会返回:

file.txt
link

✅ 符号链接本身会被列出


2. readdir 会跟随符号链接吗?

不会。

readdir() 只返回目录项信息,不会:

  • 解析符号链接指向哪里
  • 打开链接目标
  • 读取目标文件内容

它返回的 struct dirent 中:

  • d_name:符号链接名字
  • d_type:可能是 DT_LNK

示例:

if (entry->d_type == DT_LNK) {
    printf("这是一个符号链接\n");
}

3. 如果目录本身是符号链接呢?

⚠️ 情况不同:

  • opendir("symlink_dir")
    → 会跟随符号链接,打开的是目标目录
  • readdir() 读的是目标目录的内容

如果你不想跟随符号链接,需要用:

  • open() + fdopendir() + O_NOFOLLOW

4. 想“读符号链接指向哪里”怎么办?

readdir 做不到,需要用:

char buf[1024];
readlink("/path/to/link", buf, sizeof(buf));

总结

问题 答案
readdir 能列出符号链接吗 ✅ 能
readdir 会解析符号链接吗 ❌ 不会
readdir 能读链接目标吗 ❌ 不能
读链接目标用啥 readlink()

如果你是在写 递归遍历目录 / 防符号链接循环 的代码,我也可以给你示例。

0 踩