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 的文件系统中,保存在磁盘分区中的文件不管是什么类型都