Linux---软硬链接

news2024/11/16 3:42:22

软链接

我们先学习一下怎样创建软链接文件,指令格式为:ln -s 被链接的文件 生成的链接文件名

我们可以这样记忆:ln是link的简称,s是soft的简称。

我们在下面的图片中就是给test文件生成了一个软链接mytest:

我们来解释一下图片上每一行中各部分的意义:

在使用ls命令时,加上-i的选项就可以在第一行查看文件的inode,这里我们可以看到我们的软链接文件和原本的文件的inode不同,也就是说我们的软链接文件有自己的inode,并且软链接文件和原有文件的属性也不一致,例如我们原本文件权限为0664,文件大小为0,我们的软链接文件权限则为0777,文件大小为4。这说明我们创建软链接文件时操作系统会给我们创建一个新的文件,这个文件有自己的属性和inode,但是如果我们执行这两个文件的话,二者的执行结果是一致的。例如我们将test编译成一个打印"hello world"的程序。执行两个文件得:

软链接的应用

其实软链接就类似于windows下的快捷方式,可以便利我们的使用。例如一个情况:我们在其他目录下有一个文件需要在当前目录下调用,如果不用软链接的话,我们就需要./一串路径来调用,很麻烦,如果我们使用软链接的方式连接到该可执行文件,就很方便了。例如下面的代码:

我们在当前目录下,创建一连串目录,在最里面的子目录创建了一个可执行文件love,他的功能是打印一个study。如果我们想在当前目录下执行love的话,我们就需要带上一长串路径,但是我们创建一个软链接链接到love的话,我们只需要执行链接文件即可。这就是软链接的作用。

硬链接

相比软链接,硬链接要说的知识会多很多。

我们先来看创建硬链接的操作:ln 原文件名  链接文件名

也就是我们创建链接文件时不加-s,创建的链接文件就是硬链接文件,如下图:

我们仔细观察会发现硬链接于与软链接的不同:

红色圈住的是文件的inode,我们可以看到原文件和硬链接文件inode一致,软硬链接最根本的区别就是:是否有各自独立的inode。绿色的是文件的硬链接数,也就是有几个文件名对应这一个inode,硬链接数为2,也就代表有两个文件名指向了这同一个inode。

我们一对比就能发现:软链接有属于自己的inode,所以软链接是一个独立的文件。而硬链接并没有独立的inode,所以他并不能被当作独立的文件看待。在创建硬链接文件时,并没有创建新文件,因为他并没有分配独立的inode,他用的是原文件的inode和内容。我们在上篇文章讲过目录的数据块记录着文件名和inode的映射关系,创建硬链接的本质就是在目录的数据块中添加一个文件名,并使这个文件名指向原文件的inode,所以一个inode可能会被多个文件名所指向。因此为了记录一个inode被多少个文件名所指,在inode内有一个计数器,当有一个文件名指向该inode时,计数器加1,这个就是我们的硬链接数,也就是我们上图中绿色圈住的部分。

既然链接文件名和原文件名都指向同一个inode,我们可以试着删除掉其中一个文件,看看会发生什么,这里我们把原文件删掉,结果如下:

我们会发现软链接文件mytest标红,一直闪烁着红色表示警告。而对硬链接文件来说,并没有受什么影响,功能及属性都没变,只有硬连接数变了,由2变为了1,也就是说我们刚才删除了原文件并不是真的删除了文件,而是将目录数据块中记录的原文件名字与inode映射关系删除了,硬链接文件名和inode的映射关系仍在。只有当一个文件的硬连接数为0才是真正的删除了一个文件,其余的只是删掉一个映射关系,计数器减一。

这也侧面说明了软链接不是通过inode找到文件的,而是通过文件名来找文件的,由于文件之间都是树状结构连接起来的,在树状结构中查找一个文件名的方式是通过绝对路径或相对路径,所以软链接文件的数据块中保存的是原文件的路径,这也就是问什么删除原文件名软链接会发警报的原因。

硬链接的补充

我们会发现创建一个普通文件时,硬连接数都是1,这很正常没问题。但是在创建一个目录文件时,硬链接数是2,而且若在目录下再创建目录文件的话,多创建一个目录文件,上层目录的硬链接数就会加1。原因就是创建目录文件时,目录文件下会自动生成 ...两个隐藏文件。

这里bin是一个目录文件,其下就会有.和..两个文件,其中.指向目录自己,..指向目录的上层目录。

其实就是.文件映射的inode也是目录自己的inode,..文件映射的inode是上层目录的inode。所以硬连接数就会增加。

硬链接的目的

就是让多个不在同一目录下或者在同一目录下的文件,能够同时修改同一文件,其中一个修改后,所有与其硬连接的文件一起修改了。

文件的三个时间

我们可以通过 stat 文件名 的方式查看对应文件的信息:

信息中包含了三个时间:

  1. Access: 文件最后被访问的时间。
  2. Modify: 文件内容最后的修改时间。
  3. Change: 文件属性最后的修改时间。

当我们修改文件内容时,文件属性一般也会修改,所以modify修改时也会带着change时间一起修改。至于access时间,在以前老版本的时候,是只要访问文件后,该时间就会修改。但是在实际中访问文件的场景比修改文件的场景多很多,每次访问文件都要修改时间的话就很拉低效率,例如:我们总是cat一个文件,如果每次cat后都要更新时间的话真的太浪费时间了,所以在Linux2.6以后,只有真正的有效访问或者多次访问后才会刷新。

在我们使用make和makefile的时候,make会主动检测源文件是否做了修改,如果源文件没有被修改就不会重新编译,其中make就是通过文件的modify更改时间来判断源文件是否做了修改,若做了修改,源文件的修改时间是会比可执行文件的修改时间晚的。这就是时间在make上所做的应用。

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

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

相关文章

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术,它允许多个进程访问同一块内存区域,以此作为进程间通信(IPC, Inter-Process Communication)的一种方式。这种方式相对于管道、套接字等通信手段,具有更高的效率&…

【skill】onedrive的烦人问题

Onedrive的迷惑行为 安装Onedrive,如果勾选了同步,会默认把当前用户的数个文件夹(桌面、文档、图片、下载 等等)移动到安装时提示的那个文件夹 查看其中的一个文件的路径: 这样一整,原来的文件收到严重影…

孪生网络、匹配网络和原型网络:详解与区分

孪生网络、匹配网络和原型网络 孪生网络、匹配网络和原型网络:详解与区分孪生网络(Siamese Networks)核心概念工作原理 匹配网络(Matching Networks)核心概念工作原理 原型网络(Prototypical Networks&…

环形链表知识点

目录 判断链表中是否有环快慢指针步数问题 判断链表中是否有环 题目:给你一个链表的头节点 head ,判断链表中是否有环。 解决方法:使用快慢指针 如果两个快慢指针相遇,则有环。 如果没有相遇,则没有环。 但是这个原理…

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅&#xff0c…

【LinuxC语言】setitimer与getitimer函数

文章目录 前言一、setitimer() 函数二、getitimer() 函数三、示例代码总结 前言 在Linux系统下,编写程序时经常需要使用定时器来实现一些定时任务、超时处理等功能。setitimer() 和 getitimer() 函数是两个用于操作定时器的重要函数。它们可以帮助我们设置定时器的…

第19章 基于质量特性的测试技术

一、功能性测试 (一)测试方法 等价类边界值法因果图法判定表法场景法 (二)用例 1、正常用例 2、异常用例 (三)完备性 1、功能覆盖率 2、X1-A/B 功能覆盖率X:软件实际功能覆盖文档中所有…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来,形成一个相互通信和共享资源的系统。 (1) 独立模式 独立模式 : 计算机之间相互独立。 (2)…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”,必须根目录下的某个文件夹,或者其子文件夹 …

在线OJ——链表经典例题详解

引言:本篇博客详细讲解了关于链表的三个经典例题,分别是:环形链表(简单),环形链表Ⅱ(中等),随机链表的复制(中等)。当你能毫无压力地听懂和成功地…

面试中算法(使用栈实现队列)

使用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。 栈的特点:先入后出,出入元素都是在同一端(栈顶)。 队列的特点:先入先出,出入元素是在两端(队头和队尾)。 分析&…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏:【机器学习:项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非…

springboot+vue课程作业成绩可视化大屏分析系统

教师的登录功能。 教师需要可以拥有每学期新增课程的功能。 新增的课程有作业成绩,考勤成绩,考试成绩,实验成绩,其中作业成绩是平时作业1到作业8的平均成绩,最后根据占比得出学期的总评成绩。(参考我发的表…

Shell编程debug

debug调试 debug方法 sh -x显示脚本执行过程set命令设置开始debug和结束debug的位置显示脚本某一部分执行过程,解决复杂脚本故障 示例: sh -x 显示脚本执行过程 set显示脚本的部分执行过程 set -x 开始调试,从这里开始显示脚本的详细执行过…

【C++】模板初阶:泛型编程的起点

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

day02-分布式事务

1.分布式事务问题 1.1.本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 1.2.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如&#xf…

鸿蒙组件样式复用简介

鸿蒙组件样式复用简介 使用Style进行复用在Component内部复用在Component外部复用使用Extend复用指定类型组件Extend支持参数传递 使用Style进行复用 在页面开发过程中,会遇到多个组件都在使用相同的样式,这时候就要考虑是不是可以将相同的样式的进行复…

Python中的`return`语句详解

Python中的return语句详解 对于初学Python或任何编程语言的人来说,理解函数如何返回值是非常重要的。在Python中,return语句用于从函数中返回结果。本篇博客将详细介绍return语句的基本用法,以及如何在不同情境中有效使用它。 什么是return…

mac安装虚拟机linux系统

需要下载的有:centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有: CentOS、ubuntu、redhat,选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

cloudreve离线下载报错Insufficient capacity

报错内容: [Warning] 2024-05-03 22:57:40 Failed to update status of download task "c0xxxxxxxxx749": Insufficient capacity 使用motrix作为离线程序,报错后,会自动暂停下载 报错原因: 初始容量只有1G&#xff0c…