Linux下的软连接和硬链接

本文详细解释了Linux系统中软链接和硬链接的概念及其工作原理。通过实例演示了如何使用命令行工具创建这两种链接,并提供了C语言实现创建软链接和硬链接的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,有兴趣的可以把代码拷下去,也可以做一些优化,有些简单的函数在这里就不去进行调用了,有兴趣的可以进行一下拓展。

欢迎访问博客

Linux 系统中,链接分为 **硬链接** **链接(符号链接)**,它们都是文件系统的一种引用机制,用于访问文件内容。 --- ### 1. 链接 (Symbolic Link) 链接类似于 Windows 中的快捷方式,它是一个指向另一个文件或目录的特殊文件。链接包含目标文件路径的信息,并通过该路径间接地访问原始文件的内容。 #### 特点: - 创建命令:`ln -s 文件 目标链接` - 可以跨分区创建。 - 如果文件被删除,则链接会失效(成为“断链”)。 - 能够链接到不存在的目标文件。 #### 示例: ```bash # 假设有一个名为 file.txt 的文件 ln -s /path/to/file.txt link_to_file.txt ``` --- ### 2. 硬链接 (Hard Link) 硬链接是对同一块磁盘数据的不同入口(inode)。每个文件都有一个 inode 编号,在文件系统的底层存储结构中表示了文件的位置属性信息。当创建硬链接时,实际上是新增了一个指向同一个 inode 的入口。 #### 特点: - 创建命令:`ln 文件 目标链接` - 无法跨越分区创建。 - 删除原文件不会影响其他硬链接对数据的访问,只有所有硬链接都被删除后,实际的数据才会被释放。 - 链接只能针对文件,不能针对目录。 #### 示例: ```bash # 假设有一个名为 file.txt 的文件 ln /path/to/file.txt hard_link_to_file.txt ``` --- ### 区别总结 | 属性 | 链接 | 硬链接 | |--------------|----------------------------|-----------------------| | 定义 | 文件的一个指针 | 同一数据块的新入口 | | 是否可以跨分区 | 是 | 否 | | 对象支持 | 支持文件目录 | 仅支持文件 | | 删除文件的影响 | 连接无效 | 数据仍然存在 | --- ### 使用场景建议 - **链接**:适合需要灵活性的情况,比如想在一个地方保持对另一位置资的快速访问,同时允许目标文件移动、修改甚至消失而不破坏原有依赖关系。 - **硬链接**:适用于想要备份某些关键数据副本而又不需要额外占用空间的需求;注意它的局限性在于无法作用于目录以及跨设备之间共享内容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值