硬链接与符号链接
来源:互联网 发布:金和网络怎么样 编辑:程序博客网 时间: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创建硬链接类似,创建的链接时不能跨越文件系统的,且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函数实现。
- 硬链接与符号链接
- 符号链接与硬链接
- 符号链接与硬链接
- 硬链接与符号链接
- 硬链接与符号链接
- Linux:符号链接与硬链接
- 符号链接与硬链接的区别
- UNIX文件系统:硬链接与符号链接
- shell中的硬链接与符号链接
- Linux:符号链接与硬链接
- 符号链接与硬链接的区别
- Linux中的硬链接与符号链接
- 硬链接与符号链接的区别
- Linux文件系统 硬链接与符号链接
- Linux文件系统 硬链接与符号链接
- 符号链接、软链接与硬链接(转载+整理)
- Linux 硬链接与软链接(符号链接)
- 硬链接与软链接(符号链接)
- ognl.NoSuchPropertyException(没有对应属性异常)
- 对于新上线的javascript与客户端缓存存在冲突,到时客户端执行的是老代码的问题解决
- USACO/msquare 3.2.5
- 我使用过的Linux命令之join - 根据关键字合并数据文件
- 人人旗下风车网产品经理的创业失败教训总结
- 硬链接与符号链接
- 使用GCD
- 算法导论 2.1-4
- UVa 11137 - Ingenuous Cubrency 背包
- struts2结果类型分析
- STM32 ISL1208编程
- 未将对象引用设置到对象的实例 Microsoft.Office.Server.Administration.SqlSessionStateResolver
- 使用myeclipse中的JAX-WS构建webserver
- 数据仓库(四):设计数据仓库--Inmon方法