软/硬链接

41 篇文章 0 订阅

硬链接(p91)

  • 通过索引节点inode链接,一个文件有多个有效路径名,多个文件名指向同一索引节点inode。
  • hard link 只是在某个目录下新增一条文件名链接到某 inode 号码的关连记录而已。
  • 磁盘的空间与 inode 的数目都不会改变!
  • 不能跨文件系统,不能链接目录。
#include<unistd.h>
int link("已存在文件""硬链接文件");  创建
int unlink("文件名");  
如果该文件对应的inode有多个文件名,如果文件打开,则关闭后才能删除。
删除一个代表硬链接数减一,减为0才删除该文件。

软链接

类似win的快捷方式,文件中包含被链接文件的路径。
建立一个独立的文件,所以会占用掉 inode 与 block。

int symlink("已存在文件","软连接文件");  创建
int readlink("软连接文件",buf,bufsize); 
成功时返回写入buf中的字节数,buf中存放的是被链接文件名,失败时返回0

区别

5.3.1硬链接与符号链接的区别
每个保存在磁盘上的文件都有一个inode与之对应,一个inode可以对应一个或多个文件名,而与inode对应的文件名的个数就是在ls -l命令中显示的文件链接数。
硬链接和符号链接都是指向一个已保存文作的链接,符号文件当于Win中的快捷方式。它们主要有以下区别。
(1)命令

  • 硬链接命令:ln 原文件 硬链接文件(注意:不能对目录创建硬链接)
  • 符号链接命令:ln -s 原文件/目录 符号链接文件
    (2)新增文件
  • 硬链接:不新增真实的文件,仅增加一个指向原文件inode的文件名。
  • 符号链接:增加一个真实的文件即符号链接文件,新增的符号链接文件有自己的inode,文件内容为设置符号连接时指定的原文件或目录的路径名。
    (3)删除原文件/目录
  • 硬链接:删除原文件,使文件对应inode的链接数减1,减为0则删除该文件。
  • 符号链接;删除原文件,符号链接文件失效,但该文件依然存在,如果后期又新建了一个与符号链接文件内容相同路径的文件,则符号链接文件重新有效。
    (4)删除链接文件
  • 删除硬链接文件:使文件对应inode的链接数减1,减为0则删除该文件。
  • 删除符号链接文件:对原文件/目录无任何影响。
    (5)是否跨文件系统
  • 硬链接:不可以,不同的文件系统其文件的组织方式和结构可能不一样,因此不能随意创建跨文件系统的硬链接文件。
  • 符号链接;可以,因为符号链接文件仅仅保存了原文件或目录的路径名,所以不受文件系统的影响。

代码如下:

#include<unistd.h>
#include<stdio.h>

int main()
{
        int fl = link("file2","link_file");
        if (fl == 0)
        {
                printf("link successful!!!\n");
        }
        else
        {
                printf("link failure!!!\n");
        }


        int ufl = unlink("link_file");
        if (ufl == 0)
        {
        		printf("delete successful!!!\n");
        }
        else
        {
                printf("delete failure!!!\n");
        }

        int fsyml = symlink("file2","sym_link");
        if (fsyml == 0)
        {
                printf("symlink successful!!!\n");
        }
        else
        {
                printf("symlink failure!!!\n");
        }

        char buf[2048] = {};
        int frlink = readlink("sym_link",buf,sizeof(buf));
        printf("buf = %s\n",buf);
        printf("frlink = %d\n",frlink);
        if (frlink == 0)
        {
                printf("readlink failure!!!\n");
        }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值