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

目录

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 1024int 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 stringprintf("Symbolic link %s points to %s\n", linkpath, buf);return 0;
}

注意事项:

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

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

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

相关文章

Spring核心机制Ioc和Aop

Spring全家桶 WEB&#xff1a;SpringMvc、Spring Web Flux 持久层&#xff1a;Spring Data、Spring Data Redis、Spring Data MongoDB 安全校验&#xff1a;spring Security 构建工程脚手架&#xff1a;SpringBoot 微服务&#xff1a;SpringCloud 所有的Spring框架集成&#xf…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

ctfshow 权限维持 web670--web679

web670 <?php// 题目说明&#xff1a; // 想办法维持权限&#xff0c;确定无误后提交check&#xff0c;通过check后&#xff0c;才会生成flag&#xff0c;此前flag不存在error_reporting(0); highlight_file(__FILE__);$a$_GET[action];switch($a){case cmd:eval($_POST[c…

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…

【环境搭建问题】linux服务器安装conda并创建虚拟环境

1.检查有没有conda 首先看root文件夹下有没有anaconda或者conda 没有的话就要先下载安装conda&#xff1a; https://repo.anaconda.com/archive/index.html 在这个链接下找自己需要的。服务器一般为linux&#xff0c;所以我这里选择的是&#xff1a; 2.安装conda 下载安装…

Electron学习笔记(二)Hello World

目录 前言 运行主进程 创建界面 使用窗口打开界面 管理窗口的生命周期 关闭所有窗口时退出应用 (Windows & Linux)​ 如果没有窗口打开则打开一个窗口 (macOS) 使用预加载脚本访问渲染器的Node.js 添加你自己的功能 完整代码展示 效果展示 前言 接上一篇文章 …

LINUX进程间的通信(IPC)--信号

一、概念 信号通信&#xff0c;其实就是内核向用户空间进程发送信号&#xff0c;只有内核才能发信号&#xff0c;用户空间进程不能发送信号。信号已经是存在内核中的了&#xff0c;不需要用户自己创建。 信号通信的框架 * 信号的发送&#xff08;发送信号进程&#xff09;&am…

JS图形引擎汇总

1、leaferjs leaferjs绚丽多彩的 HTML5 Canvas 2D 图形渲染引擎&#xff0c;可结合 AI 绘图、生成界面。 提供了丰富的 UI 绘图元素&#xff0c;和开箱即用的功能&#xff0c;如自动布局、图形编辑、SVG 导出&#xff0c;方便与 Figma、Sketch 等产品进行数据交换。并为跨平台…

示波器选择导出至USB闪存盘的三种格式(bmp、set、csv)

如下图所示&#xff0c;一般由示波器导出至U盘中&#xff0c;一共有三种文件格式。 1、当前屏幕图像(*.bmp) BMP 文件格式&#xff08;全称是位图文件格式&#xff0c;Bitmap Image File&#xff09;是一种图像文件格式&#xff0c;用于存储数字图像。它是一种无损图像格式&am…

m3u8转MP4(网页视频下载)(超细教程, 有手就行)

准备工作 什么是m3u8文件 记事本打开m3u8文件&#xff1a; #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:4 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:METHODAES-128,URI"https://xxxx/key.key" #EXTINF:3.336667, #EXTINF:1.668333, clvHz13123499.ts #EXTINF:2.03…

【uniapp离线打包】(基于Android studio)

文章目录 uniapp打包官方教程入口一、准备工作(工具三大件)二、准备工作&#xff08;Android壳和uniapp包&#xff09;导入Android壳生成uniapp包将uniapp包导入android壳 三、准备工作&#xff08;证书、&#xff09;准备Android平台离线签名证书 四、修改配置参数build.gradl…

AI为什么无法替代律师?

AI能否真正取代律师&#xff1f;一探究竟&#xff01; ©作者|LuMiQ 来源|神州问学 引言 数字化时代&#xff0c;AI技术正如催化剂般加速各行业的变革&#xff1a;在医疗界&#xff0c;它犹如医生的“第二双眼睛”&#xff0c;精准分析影像&#xff1b;制造业里&#xff…

ofcms代码审计

1 SSTI模板注入 1.1 通过阅读pom.xml,使用了freemaker开源组件 1.2 找到对应的模版新增页面,并注入payload,点击保存 最重要的是,找到模板注入请求的后端API 注入的命令为:<#assign value="freemarker.template.utility.Execute"?new()>${value("c…

WIFI 接收机和发射机同步问题+CFO/SFO频率偏移问题

Synchronization Between Sender and Receiver & CFO Correction 解决同步问题和频率偏移问题是下面论文的关键&#xff0c;接下来结合论文进行详细解读 解读论文&#xff1a;Verification and Redesign of OFDM Backscatter 论文pdf&#xff1a;https://www.usenix.org/s…

ChatGPT自学指南:宝藏参考书大盘点

ChatGPT是基于人工智能领域的自然语言处理技术&#xff0c;使用深度学习技术构建的一个大型语言模型。具体地说&#xff0c;ChatGPT是建立在OpenAI的GPT-4系列模型之上的&#xff0c;使用了大量的语言数据和预训练技术&#xff0c;可以生成高质量的文本&#xff0c;并且在准确度…

二叉树--堆(下卷)

二叉树–堆&#xff08;下卷&#xff09; 如果有还没看过上卷的&#xff0c;可以看这篇&#xff0c;链接如下&#xff1a; http://t.csdnimg.cn/HYhax 向上调整算法 堆的插⼊ 将新数据插⼊到数组的尾上&#xff0c;再进⾏向上调整算法&#xff0c;直到满⾜堆。 &#x1f4…

根据空域图信息构造飞机航线图以及飞行轨迹模拟matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 航路网络建模 4.2 航线图构建 4.3 飞行轨迹模拟的具体步骤 5.完整程序 1.程序功能描述 空域图是指航空领域中的一种图形表示方式&#xff0c;它涵盖了空中交通管理所需要的各种信息&a…

如何处理selenium Webdriver中的文本框?

文本框或字段在整个网页中广泛使用,本文将介绍如何在Java中使用Selenium Webdriver处理文本框。可以有各种文本字段,我们将尝试包括其中的大多数,并执行各种操作,如清除和输入文本。 我们将使用我们的Selenium游乐场网站- testkru,与各种文本框进行交互。您也可以使用同一…

藏文词典查单词,藏汉双语解释,推荐使用《藏语翻译通》App

《藏语翻译通》App推出了藏文词典、藏汉大词典、新术语等全新在线查单词功能。 藏汉互译 《藏语翻译通》App的核心功能之一是藏汉互译。用户只需输入中文或藏文&#xff0c;即可获得翻译结果。 藏文词典查单词 掌握一门语言&#xff0c;词汇是基础。《藏语翻译通》App内置藏…