linux下的软链接和硬链接具体操作和区别

本文通过实践操作详细解析了Linux系统中硬链接与软链接的工作原理,包括它们与inode的关系,以及不同用户间创建链接的方法。通过创建、修改、删除文件及链接,展示了链接在文件系统中的行为。

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

简单的看个图,看下它们软链接和硬链接和block以及inode的区别

这里写图片描述

根据下面的步骤来进行实践

1、使用vi a创建一个文件a
2、使用ln a b命令创建一个链接

这里写图片描述

使用cp a c创建一个复制版本
这里写图片描述

观察3个文件的大小、时间、属主(owner)等属性
这里写图片描述

3. 修改文件a,下面就是修改完a文件的内容,然后去查看a文件的内容
这里写图片描述

4. 观察文件b的内容,观察文件c的内容,观察3个文件的大小、时间、属主(owner)等属性
这里写图片描述

5. 使用ls –li命令,观察文件a, b, c的inode编号

inode其实可以看作是C语言中的指针,指向了物理硬盘的一个区块,文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失,两个文件和一个文件一样,inode值是相同的,都指向同一个区块

这里写图片描述

6. 使用rm a删除文件a
这里写图片描述

7. 观察文件b, c是否仍然存在,内容如何

b和c依然存在

这里写图片描述

8. 使用rm b删除文件b,再观察文件b, c是否存在

c还是存在的

这里写图片描述

1、创建文件a
2、使用ln –s a b创建符号一个链接
这里写图片描述

然后将a删除,再去ls -l,再去查看下目录结构,b也是被删除了
这里写图片描述

三、不同用户之间的硬链接和符号链接

1、在用户stu下创建文件a
注意使用chmod命令,将主目录(~stu)权限改为所有其它用户可访问(r-x)
chmod o+rx ~stu 用数字的方式改变权限,如:Chmod 777 ~stu 其中r表示可读入权限,w表示写入权限,x表示的是执行权限,o表示的其他用户+就是在增加权限

创建的a文件
这里写图片描述

然后去设置权限
这里写图片描述

2. 在另一个登录窗口内(使用Alt+F2切换到另一个登录窗口,使用Alt+F1切换回原登录窗口),以用户stu2登录,分别使用ln ~stu/a ha和ln –s ~stu/a sa命令创建硬链接ha和符号链接sa
这里写图片描述

观察3个文件的大小、时间、属主(owner)等属性
这里写图片描述

3. 在用户stu下,修改文件a;在用户stu2下分别观察文件ha和sa的内容
这里写图片描述

4. 在用户stu下,修改文件a的访问权限;在用户stu2下,用ls –l命令观察ha和sa的访问权限、用户属主等信息,并使用cat命令、cp命令、vi命令验证访问控制权限的作用

查看权限,最前面一列

这里写图片描述

无法编辑,因为没有w权限

这里写图片描述

5. 两个用户下,分别使用ls –li命令检查文件a, ha, sa的inode编号,想一下为什么ha是硬链接产生的文件,所以inode是和我们stu用户是一样的
这里写图片描述
这里写图片描述

6、在用户stu2下删除ha;观察sa存在与否?用户stu下文件a存在与否?删除ha,sa还存在因为它是软链接到用户stu下的a文件的,a文件还是存在的
这里写图片描述

7、在用户stu下可以删除文件a吗?删除后,用户stu2下的文件sa还存在吗?内容是什么?用户stu下可以删除文件删除文件a

删除文件a

这里写图片描述

stu2用户下已经不存在了

这里写图片描述

最后利用unlink函数写一个模仿的rm命令

unlink命令用于系统调用函数unlink去删除指定的文件。和rm命令作用一样,都是删除文件。从文件系统中删除一个名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。
int unlink(const char *pathname);
参数:pathname:指向需解除连接的文件名。

#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    int rc;

    if (argc != 2) {
        printf("\nUsage: myrm <filename> \n\n");
        return 1;
    }

/* We do not check the permission here.  Even a file has permission
   000, it can still be removed without any warning */

    rc = unlink(argv[1]);
    if (rc) {
        printf("Error: %s\n", strerror(errno));
        return 2;
    }
    return 0;
}

1、编辑 vi myrm.c
2、编译 gcc myrm.c –o myrm
3、运行 ./myrm 待删除的文件名

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值