← 前一天目录后一天 →

每日科普 · 2026-11-01 周日

考研 408 × 求职面试

知识点 · Linux · 高频

软链接与硬链接的区别

1. 硬链接:多个文件名指向同一个 inode,本质是同一文件的多个目录项;删除任一名字只是减少链接数,nlink 为 0 且无进程打开才真正删除数据。硬链接通常不能跨文件系统,也不能给普通目录创建。 2. 软链接:自己是一个独立文件,inode 不同,内容保存目标路径,类似快捷方式;可跨文件系统,可链接目录;目标删除后链接仍存在但失效,称为悬空链接。 3. 命令与查看:ln 源 目标 创建硬链接,ln -s 源 目标 创建软链接;ls -li 可看 inode,stat 可看链接数与文件类型。 4. 核心区别:硬链接共享 inode 和数据,软链接依赖路径解析;硬链接删除源名字不影响另一名字访问,软链接删除目标后无法访问。

每日一题 · Linux

软链接与硬链接的区别

下列关于 Linux 软链接与硬链接的说法,正确的是:A. 硬链接可跨文件系统创建;B. 软链接与目标文件共享同一 inode;C. 删除文件的最后一个硬链接后,数据即不可再通过该硬链接访问;D. 软链接目标被删除后,软链接会自动变成硬链接。

解析

答案:C。硬链接是同一 inode 的多个目录项,nlink 减到 0 才释放数据;A 错,硬链接通常不能跨文件系统;B 错,软链接有独立 inode,内容是目标路径;D 错,目标删除后软链接悬空,不会变硬链接。

面试小贴士 · Linux

软链接与硬链接的区别

面试常问区别、能否跨文件系统、删除源文件后的表现。答:硬链接共享 inode 和数据,软链接是存路径的独立文件;再点出跨文件系统、目录链接、悬空链接。易错:把软链接说成共享 inode,忽略 nlink。

代码实现 · C

代码示例

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

int main(void) {
    const char *target = "target.txt";
    const char *hard = "hard.txt";
    const char *soft = "soft.txt";
    FILE *fp = fopen(target, "w");
    if (!fp) return 1;
    fputs("hello", fp);
    fclose(fp);

    unlink(hard);
    unlink(soft); // 清理旧链接
    if (link(target, hard) != 0) perror("link");
    if (symlink(target, soft) != 0) perror("symlink");

    struct stat st;
    stat(target, &st);
    printf("target inode=%lu nlink=%lu\n", (unsigned long)st.st_ino, (unsigned long)st.st_nlink);
    stat(hard, &st);
    printf("hard   inode=%lu nlink=%lu\n", (unsigned long)st.st_ino, (unsigned long)st.st_nlink);
    lstat(soft, &st); // lstat 查看软链接自身
    printf("soft   inode=%lu nlink=%lu\n", (unsigned long)st.st_ino, (unsigned long)st.st_nlink);
    return 0;
}
← 前一天目录后一天 →