硬链接(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");
}
}