Linux下的软连接和硬链接
首先说一下什么是软连接和硬链接吧:
硬链接:就是创建在原来文件基础之上,类似在创建一个文件,不依赖源文件。每次硬链接一次都会在原来的文件基础之上链接数再加1;
软连接:在原来文件的基础之上,创建一个类似windows下的快捷方式,它以来源文件,如果源文件没了的话,那么这个“这个快捷方式”也就没有用了
下面演示下命令行下创建软链接和硬链接,都是使用 ln命令
ln a.txt l_a
ln -s a.txt s_a
上面图示中我们可以看到对a.txt创建了一个软连接s_a和一个硬链接l_a
,软链接有一个箭头指向了a.txt源文件,而硬链接有一个2显示出来,标识a.txt的链接数是2
上面的图就是删除了源文件 之后,软链接的变成红色了,因为软链接指向的源文件已经丢失了所以可以看出来,而硬链接不变,不懂的可以试一下,硬链接还是可以进行访问的,也可以看到文本文件中的数据,但是软连接就不行
说说关于Linux系统下,创建软硬链接的函数调用:
软链接:symlink
#include<unistd.h>
int symlink(const char*actualpath,const char *sympath);
返回:成功返回0,出错返回-1
功能:创建一个符号链接(软链接)
int readlink(const char *restrict pathname,char *restrict buf,size_t bufsize);
返回:成功读到子节数为0,失败为-1
功能:打开该链接本身,并读该链接中的名字
符号创建链接:
创建符号链接不要求actualpath存在
可以跨文件系统建立符号链接
限制条件相对比较少
硬链接link
link和unlink函数
#include<unistd.h>
int link(const char *existingpath,const char*newpath);
返回:成功返回0,出错返回-1
功能:创建一个指向现存文件的连接(硬链接)
int unlink(const char*pathname);
返回:成功返回0,出错返回-1;
功能:删除pathname制定的硬链接,并将由pathname所引用的文件连接数减1
硬链接的创建条件:
针对文件创建链接
必须是同一个分区
只用超级用户才能对目录创建链接
文件删除条件:
链接计数为0
无其他进程打开该文件
其他相关的操作函数:
#include<unistd.h>
int remove(const char *pathname)
返回:成功返回0,失败返回-1
功能:解除对一个文件或者目录的链接
int rename(const *oldname,const char *newname);
返回:成功返回0,出错返回-1
功能:文件或者目录更名
对于文件:remove和unlink一样
对于目录:remove和rmdir一样
下面就针对上图的图示中的软硬链接写一个比较简单的Demo,当然这个可能在实际过程中相对来说是比较少用的,但是真正设计到的是整个系统的文件系统的原理,这个才是最重要的。有兴趣的童鞋可以www.baidu.com一下,Linux的系统文件存储原理
上Code了,用代码创建软链接部分的代码
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<memory.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
*argv[1]为源文件。argv[i]为链接文件
int main(int argc,char* argv[]){
if(argc == 1){
printf("缺少参数");
exit(EXIT_FAILURE);
int result = symlink(argv[1],argv[2]);
if(result == 0){
printf("create success\n");
}else{
printf("create failed\n");
char buffer[1024];
ssize_t read_result;
memset(buffer,0,sizeof(buffer));
int fd = open(argv[2],O_RDONLY);
if(fd <0){
perror("open error\n");
exit(EXIT_FAILURE);
while((read_result = read(fd,buffer,sizeof(buffer)))>0){
if(write(STDOUT_FILENO,buffer,read_result) > 0){
printf("\n");
printf("read success\n");
}else{
printf("\n");
printf("read failed\n");
memset(buffer,0,sizeof(buffer));
if((read_result = readlink(argv[2],buffer,sizeof(buffer)))<0){
perror("readlink error");
}else{
write(STDOUT_FILENO,buffer,read_result);
printf("\n");
close(fd);
return 0;
创建硬链接部分的代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdlib.h>
#include<fcntl.h>
int main(int argc,char * argv[]){
if(argc<3){
printf("缺少参数\n");
exit(EXIT_FAILURE);
int i = 0;
for(i = 2; i<argc ;i++){
int link_result = link(argv[1],argv[i]);
if(link_result < 0){
printf("create hard link failed\n");
continue;
}else{
printf("create hard link success\n");
return 0;
这些相对来说都是一些比较简单的Demo,有兴趣的可以把代码拷下去,也可以做一些优化,有些简单的函数在这里就不去进行调用了,有兴趣的可以进行一下拓展。
欢迎访问博客
软链接软链接(Soft Link)也称为符号链接(Symbolic Link)。linux里的软链接文件就类似Windows系统中的快捷方式。linux里的软链接文件实际上是一个特殊的文件,文件类型是l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。原理图:
ln -s
2.inode是什么
⛅要解释清楚两者的区别和联系需要先说清楚 linux 文件系统中的 inode 这个东西
⛅当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BwxzMkko-1607786218296)(H:\正课学习笔记\day16\inode.png)]
这里写目录标题拓展:Linux 链接概念硬连接软连接测试:参考目录
拓展:Linux 链接概念
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。
$ ln 源文件名称 硬链接文件名称
ln -s 源文件名称 软链接文件名称
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都