电子产业一站式赋能平台

PCB联盟网

搜索
查看: 119|回复: 0
收起左侧

嵌入式Linux:符号链接(软链接)和硬链接

[复制链接]

679

主题

679

帖子

2524

积分

三级会员

Rank: 3Rank: 3

积分
2524
发表于 2024-7-18 12:31:00 | 显示全部楼层 |阅读模式

f331e35em3264020429.gif

f331e35em3264020429.gif

点击上方蓝色字体,关注我们
在 Linux 系统中,符号链接(软链接)和硬链接是两种创建文件链接的方法。理解它们的区别和使用场景对于文件系统的管理非常重要。

符号链接与硬链接的区别如下:

p5e4mnvj0bc64020529.png

p5e4mnvj0bc64020529.png


使用场景:
  • 符号链接:用于创建快捷方式或跨文件系统链接。例如,在 /usr/bin 目录下创建一个指向某个脚本的符号链接,使其可以全局访问。
  • 硬链接:用于在同一文件系统内创建多个引用同一文件的名称,适用于需要多个路径引用同一文件的场景,如备份文件时使用硬链接节省空间。

    1
    符号链接(软链接)
    符号链接(Symbolic Link),也称软链接(Soft Link),是一个特殊类型的文件,它包含了另一个文件的路径。打开符号链接时,系统会重定向到它指向的文件。

    特点:
  • 符号链接是一个独立的文件,包含指向目标文件的路径。
  • 可以跨文件系统创建符号链接。
  • 符号链接可以指向一个不存在的文件(即空链接)。
  • 删除符号链接不会影响目标文件,但如果目标文件被删除,符号链接将变成无效链接。

    使用 ln -s 命令创建符号链接。

  • 软链接:ln -s 源文件 链接文件
    创建一个指向 /home/user/file.txt 的符号链接 link_to_file:

  • ln -s /home/user/file.txt link_to_file
    验证符号链接:

  • ls -l link_to_file
    通过以下示例,进一步了解符号链接的使用:
  • # 创建一个目标文件echo "Hello, World!" > /home/user/file.txt
    # 创建一个符号链接ln -s /home/user/file.txt /home/user/link_to_file
    # 查看符号链接内容cat /home/user/link_to_file# 输出:Hello, World!
    # 删除目标文件rm /home/user/file.txt
    # 尝试查看符号链接内容cat /home/user/link_to_file# 输出:cat: /home/user/link_to_file: No such file or directory
    2
    硬链接
    硬链接(Hard Link)是指向同一个物理文件的数据块的多个文件名。所有硬链接共享同一个 inode 号。

    特点:
  • 硬链接是指向同一个文件的数据块,因此文件内容不会重复存储。
  • 硬链接只能在同一个文件系统中创建。
  • 删除硬链接不会删除文件,只有所有硬链接都被删除后,文件才会被删除。
  • 更新任何一个硬链接的内容,所有链接的内容都会更新。

    使用 ln 命令创建硬链接。

  • 硬链接:ln 源文件 链接文件
    创建一个指向 /home/user/file.txt 的硬链接 hardlink_to_file:

  • ln /home/user/file.txt hardlink_to_file
    验证硬链接:

  • ls -l /home/user/file.txt hardlink_to_file# 输出示例:# -rw-r--r-- 2 user user 0 Jul 8 12:00 /home/user/file.txt# -rw-r--r-- 2 user user 0 Jul 8 12:00 hardlink_to_file
    # 查看 inode 号ls -i /home/user/file.txt hardlink_to_file# 输出示例:# 123456 /home/user/file.txt# 123456 hardlink_to_file
    通过以下示例,进一步了解硬链接的使用:
  • # 创建一个目标文件echo "Hello, World!" > /home/user/file.txt
    # 创建一个硬链接ln /home/user/file.txt /home/user/hardlink_to_file
    # 查看硬链接内容cat /home/user/hardlink_to_file# 输出:Hello, World!
    # 删除目标文件rm /home/user/file.txt
    # 查看硬链接内容cat /home/user/hardlink_to_file# 输出:Hello, World!

    3
    link()函数
    link() 函数用于创建硬链接。硬链接是指向同一个文件的数据块的多个文件名。
    函数原型如下:
  • #include
    int link(const char *oldpath, const char *newpath);
    参数:
  • oldpath:现有文件的路径。
  • newpath:将要创建的新硬链接的路径。

    返回值:
  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 来指示错误类型。

    示例如下:

  • #include #include
    int main() {    const char *oldpath = "/home/user/file.txt";    const char *newpath = "/home/user/hardlink_to_file";
        if (link(oldpath, newpath) == 0) {        printf("Hard link created successfully.
    ");    } else {        perror("link");    }
        return 0;}
    4
    symlink()函数
    symlink() 函数用于创建符号链接。符号链接是一个特殊类型的文件,它包含指向另一个文件的路径。

    函数原型如下:

  • #include
    int symlink(const char *target, const char *linkpath);
    参数:
  • target:符号链接指向的目标文件路径。
  • linkpath:将要创建的新符号链接的路径。

    返回值:
  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 来指示错误类型。

    示例如下:

  • #include #include
    int main() {    const char *target = "/home/user/file.txt";    const char *linkpath = "/home/user/symlink_to_file";
        if (symlink(target, linkpath) == 0) {        printf("Symbolic link created successfully.
    ");    } else {        perror("symlink");    }
        return 0;}
    5
    readlink()函数
    readlink() 函数用于读取符号链接文件的目标路径。

    函数原型如下:

  • #include
    ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize);
    参数:
  • path:指向符号链接的路径。
  • buf:用于存储符号链接目标路径的缓冲区。
  • bufsize:缓冲区的大小。

    返回值:
  • 成功时返回读取的字节数(目标路径的长度)。
  • 失败时返回 -1,并设置 errno 来指示错误类型。

    示例如下:

  • #include #include #include
    #define BUF_SIZE 1024
    int main() {    const char *linkpath = "/home/user/symlink_to_file";    char buf[BUF_SIZE];    ssize_t len;
        len = readlink(linkpath, buf, BUF_SIZE - 1);    if (len == -1) {        perror("readlink");        exit(EXIT_FAILURE);    }
        buf[len] = '\0';  // Null-terminate the string    printf("Symbolic link %s points to %s
    ", linkpath, buf);
        return 0;}
    注意事项:
  • readlink() 函数不会在缓冲区末尾添加空字符 (\0),因此需要手动添加以形成一个有效的 C 字符串。
  • 缓冲区大小 (bufsize) 应足够大以容纳符号链接的目标路径。
    如果缓冲区太小,目标路径将被截断。
  • readlink() 只能用于读取符号链接的内容,不能用于读取普通文件。


    gmoel4n3ust64020629.gif

    gmoel4n3ust64020629.gif

    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表