硬链接与符号链接

来源:互联网 发布:金和网络怎么样 编辑:程序博客网 时间:2024/04/28 18:32

 

说明:只供学习交流,转载请注明出处

 

类似于Windows系统的快捷方式,Linux系统同样提供了快速定位不同目录下文件的方法。在Linux系统中存在两种链接:一种是硬链接,还有一种是符号链接

 

硬链接:

一个inode节点可以存在任意数目的硬链接。在删除硬链接时,该inode节点上的数据上的数据将不会受到影响。在Linux系统中可以使用ln命令来创建硬链接。首先用touch命令创建名为link.test的文件。然后,输入“ln link.test link”命令,这时就创建了指向link.test的硬链接。通过“ls –i”命令可以看到这两个文件的inode节点值是一致的。

 

删除link.test文件,依然发现硬链接link文件指向了inode节点。也就是说,该inode节点数据没有被删除,因此,要删除存在硬链接的文件的数据时,除了删除文件本身,还必须删除所有的硬链接。

 

 

硬链接依赖于inode节点而存在,在Linux系统中,硬链接存在以下几点局限性:

1):只有文件才可以创建硬链接,目录不可以创建硬链接。

2):硬链接不能跨越文件系统。不能给处在不同文件系统(这里是指不同分区上的文件)创建硬链接。

 

 

符号链接:

Linux系统中,使用最多的是符号链接。符号链接是一种专门的文件类型,与硬链接不同,符号链接通过名称来指向另一个文件。因此,不会出现像硬链接中文件和链接指向同一个inode的情况。符号链接也不会影响文件的删除,如果文件消失了,那么符号链接将变得不可用。使用“ln -s”来创建符号链接。

 

符号链接要比硬链接灵活的多。在Linux系统中,可以给任何类型的文件系统创建符号链接。

 

 

 

 

 

 

下图为硬链接和符号链接的总结表:

 

特点

硬链接

符号链接

名称解析情况

较快,因为硬链接中包含对链接对象的直接引用

较慢,符号链接包含链接对象的路径名。因此,必须解析路径名称才可以找到链接的对象

链接对象

链接对象必须存在才可以创建硬链接

链接对象不一定存在,不存在的时候可以一样可以创建符号链接

是否要求存在一个分区中

要求在同一个分区中

不要求,符号链接可以跨越不同的文件系统

删除链接对象的要求

只有删除所有的硬链接才有可能删除相关的数据

无要求,删除链接对象后,符号链接给出指向错误而已

 

 

 

 

 

 

创建或删除链接:

link函数用于创建硬链接。该函数的具体信息如下表所示:

link函数

 

头文件

<unistd.h>

函数形式

int link(const char *oldpath, const char  *newpath)

返回值

成功

失败

是否设置errno

0

-1

设置

 

说明:这里创建的链接为硬链接,调用参数主要是原有的文件名称和创建的链接名称。与使用ln创建硬链接类似,创建的链接时不能跨越文件系统的,且oldpathnewpath不能为目录。

 

错误信息:

EACCES:进程没有权限在新的目录中写入文件,或给出的文件所处路径没有访问权限。

EEXIST:给出的newpath已经存在文件。

EFAULToldpathnewpath指向非法地址空间。

EIO:发生I/O读写错误。

ELOOP:给出的文件所在路径中符号链接过多。

EMLINK:执行oldpath的链接已经达到最大限度。

ENAMETOOLONGoldpathnewpath长度过长。

ENOENToldpathnewpath中的目录存在问题或是空的符号链接。

ENOMEM:内核空间不足。

ENOSPC:磁盘空间不足,无法创建新的目录项。

ENOTDIR:给出的文件所处路径中含有不是目录的部分。

EPERMoldpath为目录。

EPERM:包含oldpathnewpath的文件系统不支持创建硬链接。

EROFS:文件位于只读文件系统上。

EXDEVoldpathnewpath没有处在同一个挂载的文件系统上。

 

实例:

#include <stdio.h>#include <unistd.h>int main(void){        if (link("./umask.c", "./1") == -1)        {                perror("Cannot create the hard link");                return (1);        }        return (0);}


 

 

Linux系统还提供了unlink函数,用于删除创建的硬链接。unlink函数的具体信息如下表所示:

unlink函数

 

头文件

<unistd.h>

函数形式

int unlink(const char *pathname);

返回值

成功

失败

是否设置errno

0

-1

设置

 

说明:unlink函数删除pathname指向的链接。如果链接计数器为0,同时没有进程打开了该文件,unlink将释放文件所占用的空间。

 

 

错误信息:

EACCES:进程没有权限在新的目录中写入文件,或给出的文件所处路径没有访问权限。

EBUSY:系统或其他进程使用了该链接,无法删除。

EFAULT:路径指向非法地址空间。

EIO:发生I/O读写错误。

ELOOP:给出的文件所在路径中符号链接过多。

ENAMETOOLONG:路径过长。

ENOENT:路径中的目录存在问题或是空的符号链接。

ENOMEM:内核空间不足。

ENOSPC:磁盘空间不足,无法创建新的目录项。

ENOTDIR:给出的文件所处路径中含有不是目录的部分。

EPERM:系统不充许删除目录或者没有删除目录的权限。

EROFS:文件位于只读文件系统上。

EISDIR:路径指向一个目录。

 

实例:

#include <stdio.h>#include <unistd.h>int main(void){        if (unlink("./1") == -1)        {                perror("Cannot create the hard link");                return (1);        }        return (0);}


 

 

创建和删除符号链接:

通过使用symlink函数,可以达到与“ln -s”命令的相同的结果,即创建符号链接。symlink函数的具体定义如表:

symlink函数

 

头文件

<unistd.h>

函数形式

int symlink(const char *oldpath, const  char *newpath)

返回值

成功

失败

是否设置errno

0

-1

设置

 

说明:symlink函数中,oldpath为链接要指向的目标,而newpath为创建的链接名称。

错误信息:

EACCES:进程没有权限在新的目录中写入文件,或给出的文件所处路径没有访问权限。

EEXIST:给出的newpath已经存在文件。

EFAULToldpathnewpath指向非法地址空间。

EIO:发生I/O读写错误。

ELOOP:给出的文件所在路径中符号链接过多。

ENAMETOOLONGoldpathnewpath长度过长。

ENOENT newpath中的目录存在问题或是空的符号链接。

ENOMEM:内核空间不足。

ENOSPC:磁盘空间不足,无法创建新的目录项。

ENOTDIR:给出的文件所处路径中含有不是目录的部分。

EPERM:包含newpath的文件系统不支持创建符号链接。

EROFS:文件位于只读文件系统上。

 

 

实例:

#include <stdio.h>#include <unistd.h>int main(void){        if (symlink("./umask.c", "./1") == -1)        {                perror("Cannot create the hard link");                return (1);        }        return (0);}


 

 

符号链接的删除依然使用前面介绍的unlink函数实现。

 

 

 

 

 

 

 

 

 

原创粉丝点击