简单的看个图,看下它们软链接和硬链接和block以及inode的区别
根据下面的步骤来进行实践
一、文件链接与复制 (hard link)
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还是存在的
二、符号链接(软链接)symbolic link / soft link
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 待删除的文件名