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

news2024/12/23 9:18:33

目录

1、符号链接(软链接)

2、硬链接

3、link()函数

4、symlink()函数

5、readlink()函数


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

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

使用场景

  • 符号链接:用于创建快捷方式或跨文件系统链接。例如,在 /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
# 输出示例:lrwxrwxrwx 1 user user 16 Jul 8 12:00 link_to_file -> /home/user/file.txt

 通过以下示例,进一步了解符号链接的使用:

# 创建一个目标文件
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 <unistd.h>

int link(const char *oldpath, const char *newpath);

参数

  • oldpath:现有文件的路径。
  • newpath:将要创建的新硬链接的路径。

返回值

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

示例如下:

#include <stdio.h>
#include <unistd.h>

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.\n");
    } else {
        perror("link");
    }

    return 0;
}

4、symlink()函数

symlink() 函数用于创建符号链接。符号链接是一个特殊类型的文件,它包含指向另一个文件的路径。

函数原型如下:

#include <unistd.h>

int symlink(const char *target, const char *linkpath);

参数

  • target:符号链接指向的目标文件路径。
  • linkpath:将要创建的新符号链接的路径。

返回值

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

示例如下:

#include <stdio.h>
#include <unistd.h>

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.\n");
    } else {
        perror("symlink");
    }

    return 0;
}

5、readlink()函数

readlink() 函数用于读取符号链接文件的目标路径。

函数原型如下:

#include <unistd.h>

ssize_t readlink(const char *restrict path, char *restrict buf, size_t bufsize);

参数

  • path:指向符号链接的路径。
  • buf:用于存储符号链接目标路径的缓冲区。
  • bufsize:缓冲区的大小。

返回值

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

示例如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#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\n", linkpath, buf);

    return 0;
}

注意事项:

  • readlink() 函数不会在缓冲区末尾添加空字符 (\0),因此需要手动添加以形成一个有效的 C 字符串。
  • 缓冲区大小 (bufsize) 应足够大以容纳符号链接的目标路径。如果缓冲区太小,目标路径将被截断。
  • readlink() 只能用于读取符号链接的内容,不能用于读取普通文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

这个问题实际上网上都有解法&#xff0c;但是可能没有那么的清楚&#xff0c;大家在各种问&#xff0c;我既然搞定了&#xff0c;就分享给大家吧网上解法&#xff1a; 开发调试需要另外创建开发证书和描述文件&#xff0c;描述文件同时绑定开发设备解读&#xff1a; 实际上这句…

举例详细学习和分析后端业务逻辑代码开发思路

在此之前&#xff0c;先来补充一下上一篇文章的一点内容&#xff1a;上一篇文章点击此处详看 对于画线的这句话&#xff0c;来详细解释一下吧&#xff01; 这里面说&#xff0c;对于service服务层&#xff0c;如果我们所需要实现的业务比较简单的话可以直接在...service接口里面…

Spring事件监听的核心机制及其原理

Spring事件监听 Spring的事件监听机制主要由三大核心部分组成即事件&#xff0c;监听器和播放器三部分组成。 事件的发布是通过spring当中的pulishEvent方法实现。事件监听实现是通过监听器监听了对应事件的监听器来实现的。 事件监听的作用&#xff1a;为系统业务之间进行一…

一种可以灵活、高速测试半导体测试中使用的老化板的系统

本文介绍了一种可以灵活、高速测试半导体测试中使用的老化板的系统。 定义&#xff1a;Burn-in Board Testing System是一种通过模拟极端使用条件&#xff08;如高温、高压、高湿等&#xff09;来加速半导体器件老化&#xff0c;并检测其潜在失效的测试系统。目的&#xff1a; …

如何使用 Puppeteer 绕过 Akamai

摘要&#xff1a; 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时&#xff0c;如何运用Puppeteer这一强大的Node.js库&#xff0c;通过模拟真实用户行为、动态请求处理等策略&#xff0c;高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…

红酒标签设计:艺术与品味的结合

在红酒的世界里&#xff0c;每一瓶酒都如同一位优雅的舞者&#xff0c;在酒柜的舞台上静静诉说着自己的故事。而红酒的标签&#xff0c;则是这位舞者身上较华丽的舞裙&#xff0c;它不仅是红酒的身份证明&#xff0c;更是艺术与品味的很好结合。今天&#xff0c;我们就来聊聊红…

计网 - 传统的类网络划分 vs 无类别域间路由CIDR

文章目录 A、B、C 类网络的基本概念和历史背景A 类网络B 类网络C 类网络实际应用场景 CIDR&#xff08;无类别域间路由&#xff09;基本概念CIDR 的表示方法计算 CIDR 网络段的步骤步骤 1&#xff1a;确定网络掩码步骤 2&#xff1a;计算网络地址步骤 3&#xff1a;计算广播地址…

二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

1.逆波兰表达式 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 代码&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st;for(int i 0; i < tokens.size(); i){if(tokens[i] "" || tokens[i…

横看成岭侧成峰,山的叫法何其多。丘 陵 峰 岭 峦 岑 峭 嶂 岳 屺 岵 峡 岬 冈 崮 麓 顶 梁 包 坡 尖

文章目录 引言顶、梁、包、坡、尖山脚叫麓较低而平的山脊叫冈(岗)四周陡峭顶上较平的山叫崮(g)两山之间,有水为峡两山之间,无水为岬(jiǎ)没有草木的山叫屺(qǐ)多草木的山叫岵(h)高而险的山叫嶂高而大的山叫岳高而陡的山叫峭(qio)小而高的山叫岑小而尖的山叫峦高…

在亚马逊云科技AWS上开发大模型应用服务并设计提示词工程

项目简介&#xff1a; 接下来&#xff0c;小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何利用亚…

昇思25天学习打卡营第6天|基础知识-函数式自动微分

目录 环境 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 学习打卡时间 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08…

【C++红黑树应用】模拟实现STL中的map与set

目录 &#x1f680; 前言一&#xff1a; &#x1f525; 红黑树的修改二&#xff1a; &#x1f525; 红黑树的迭代器 三&#xff1a; &#x1f525; perator() 与 operator--() 四&#xff1a; &#x1f525; 红黑树相关接口的改造✨ 4.1 Find 函数的改造✨ 4.2 Insert 函数的改…

推荐珍藏已久的 3 款优质电脑软件,每一款都值得拥有

Advanced Find and Replace Advanced Find and Replace是一款功能强大的文本查找和替换工具&#xff0c;能够高效地在多个文档中进行复杂的内容操作。它支持通配符和正则表达式&#xff0c;使得用户可以精确地定位和替换特定的文本内容。该软件不仅适用于普通文本文件&#xff…

防洪评价报告编制方法与水流数学模型建模技术

原文链接&#xff1a;防洪评价报告编制方法与水流数学模型建模技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247610610&idx2&sn432d30cb40ec36160d635603c7f22c96&chksmfa827115cdf5f803ddcaa03a21e3721d6949d6a336062bb38170e3f9d5bd4d391cc36cc…

【速记!】3DMAX的50个常用快捷键

分享一组基本的3dMax动画和建模快捷键&#xff0c;以用于你的建筑项目。 3dMax是创建三维模型和动画的设计师中流行的软件。它用于建筑、电子游戏或其他需要高清晰度和高精度图形的视觉项目&#xff0c;是视觉艺术家寻找新工具的理想伴侣&#xff0c;这些工具可以帮助他们详细…

Vue3实战案例 知识点全面 推荐收藏 超详细 及附知识点解读

最近经常用到vue中的一些常用知识点&#xff0c;打算系统性的对 vue3 知识点进行总结&#xff0c;方便自己查看&#xff0c;另外也供正在学习 vue3 的同学参考&#xff0c;本案例基本包含 Vue3所有的基本知识点&#xff0c;欢迎参考&#xff0c;有问题评论区留言&#xff0c;谢…

Linux基本功能

Linux 操作系统&#xff0c;作为开源社区的明星之一&#xff0c;以其稳定性、安全性和灵活性在全球范围内得到广泛应用。 1. 多用户和多任务支持 Linux 是一个真正的多用户系统&#xff0c;允许多个用户同时登录并在同一时间内运行多个程序。每个用户拥有自己的账户和权限&…

每日OJ_牛客HJ86 求最大连续bit数

目录 牛客HJ86 求最大连续bit数 解析代码 牛客HJ86 求最大连续bit数 求最大连续bit数_牛客题霸_牛客网 解析代码 根据位运算&#xff0c;获取每一位的二进制值。获取第i位的值&#xff1a; (n >> i) & 1或者 n & (1 << i)。如果1连续&#xff0c;则计数…

Redis 安装和数据类型

Redis 安装和数据类型 一、Redis 1、Redis概念 redis 缓存中间件&#xff1a;缓存数据库 nginx web服务 php 转发动态请求 tomcat web页面&#xff0c;也可以转发动态请求 springboot 自带tomcat 数据库不支持高并发&#xff0c;一旦访问量激增&#xff0c;数据库很快就…

网工内推 | 合资公司、上市公司数据库工程师,OCP/OCM认证优先,双休

01 欣旺达电子股份有限公司 &#x1f537;招聘岗位&#xff1a;数据库管理高级工程师 &#x1f537;岗位职责&#xff1a; 1、负责数据库规划、管理、调优工作&#xff1b; 2、负责数据库应急预案制定、应急预案维护和应急支持&#xff1b; 3、负责数据库异常处理&#xff…