硬链接与符号链接
2013-05-03 15:21
127 查看
说明:只供学习交流,转载请注明出处
类似于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创建硬链接类似,创建的链接时不能跨越文件系统的,且oldpath或newpath不能为目录。
错误信息:
EACCES:进程没有权限在新的目录中写入文件,或给出的文件所处路径没有访问权限。
EEXIST:给出的newpath已经存在文件。
EFAULT:oldpath或newpath指向非法地址空间。
EIO:发生I/O读写错误。
ELOOP:给出的文件所在路径中符号链接过多。
EMLINK:执行oldpath的链接已经达到最大限度。
ENAMETOOLONG:oldpath或newpath长度过长。
ENOENT:oldpath或newpath中的目录存在问题或是空的符号链接。
ENOMEM:内核空间不足。
ENOSPC:磁盘空间不足,无法创建新的目录项。
ENOTDIR:给出的文件所处路径中含有不是目录的部分。
EPERM:oldpath为目录。
EPERM:包含oldpath和newpath的文件系统不支持创建硬链接。
EROFS:文件位于只读文件系统上。
EXDEV:oldpath和newpath没有处在同一个挂载的文件系统上。
实例:
#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已经存在文件。
EFAULT:oldpath或newpath指向非法地址空间。
EIO:发生I/O读写错误。
ELOOP:给出的文件所在路径中符号链接过多。
ENAMETOOLONG:oldpath或newpath长度过长。
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函数实现。
相关文章推荐
- ln的理解(符号链接与硬链接)
- 关于硬链接和软连接(符号链接)的区别
- 硬链接(hard link)与符号链接(symbolic link)
- 【2014年12月2日】【每日一问】在Linux中,符号链接(软链接)和硬链接有什么区别?
- 符号链接和硬链接的区别
- 图解符号链接和硬链接的区别和i节点的介绍
- 关于硬链接和软连接(符号链接)的区别
- 符号链接与硬链接
- 硬链接和符号链接的区别
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- Windows下创建硬链接和软链接(符号链接)
- linux下符号链接和硬链接的区别
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- Linux上创建和更改硬链接和符号链接
- Linux:创建和更改硬链接和符号链接
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- 关于硬链接和软连接(符号链接)的区别
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- linux 链接ln的使用 创建和删除符号连接(软、硬链接)
- 关于硬链接和软连接(符号链接)的区别