符号链接文件类似于 Windows
系统的快捷方式,只保留目标文件的地址,而不占用存储空间。使用符号链接文件和使用目标文件的效果是一样的,符号链接文件可以指定不同的访问权限,以控制对文件的共享和保证安全性。
Linux
中有两种类型的链接:软链接和硬链接。
硬链接
硬链接是利 用Linux
系统为每个文件分配的物理编号i节点建立链接(关于i节点,详见:文件的时间戳)。因此,硬链接不能跨域文件系统。硬链接的文件属性与源文件是基本一致的,二者可以同步更新。这种方式类似于 Windows
系统中将文件复制一份。
软链接
软链接是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度保证可移植性。软链接更像是 Windows
中创建快捷方式,软链接权限不会改变源文件(目标文件)的权限。
区别
硬链接和软链接的不同之处在于,源文件删除后,软链接无法定位到源文件,所以会显示没有文件;硬链接类似于赋值,删除源文件,硬链接依然可以访问。假如删除源文件后,重新创建一个同名文件,软链接将恢复;硬链接则不再有效,因为文件的i节点已经改变。
注意
修改链接的目标文件名,硬链接依然有效,软链接将断开。对一个已经存在的符号链接文件执行移动或删除操作,有可能导致链接的断开。
link() & unlink()
使用 link()
函数来创建硬链接,使用 unlink()
函数来移除硬链接。
link()
语法:
#include <unistd.h> int link(const char *oldpath, const char *newpath);点击复制复制失败已复制
参数 oldpath
提供的是一个已存在文件的路径名, link()
函数将以 newpath
参数所指定的路径名创建一个新链接。如果 newpath
指定的路径名已然存在,那么它不会被覆盖;相反,函数会产生一个错误( EEXIST
)。在 Linux
中, link()
函数不会对符号链接进行解引用操作。如果 oldpath
属于符号链接,则会将 newpath
创建为指向相同符号链接文件的全新硬链接( newpath
也是符号链接,指向 oldpath
所指向的同一文件)。
unlink()
unlink()
函数用于移除一个链接(删除一个文件名),且如果此链接是指向文件的最后一个链接,那么还将移除文件本身。语法如下:
#include <unistd.h> int unlink(const char *pathname);点击复制复制失败已复制
若 pathname
指定的文件的链接不存在,则 unlink()
函数调用失败, errno
(错误码)被置为 ENOENT
。 unlink()
函数不会对符号链接进行解引用操作,若 pathname
为符号链接,则移除链接本身,而为链接指向的名称。
symlink()
symlink()
函数用来创建软链接。语法如下:
#include <unistd.h> int symlink(const char *oldpath, const char *newpath);点击复制复制失败已复制
针对 oldpath
所指定路径名创建一个新的符号链接 newpath
(移除符号链接需要使用 unlink()
函数)。
若 newpath
中给定的路径已然存在,则调用失败( errno
置为 EEXIST
)。由 oldpath
指定的路径名可以是绝对路径,也可以是相对路径。符号链接存储的内容是符号链接文件的路径。例如, /home/test
链接到 /home/test.txt
,符号链接 /home/txt
存储的内容就是 "/home/test.txt"
。这一点类似于指针,即指针变量保存的是数据的地址,通过指针就可以访问数据。
readlink()
readlink()
函数则可以获取链接本身的内容,即其所指向的路径名。语法如下:
#include <unistd.h> ssize_t readlink(const char *path, char *buf, size_t bufsiz);点击复制复制失败已复制
函数 bufsiz
是一个整型参数,用来指定参数 buf
中的可用字节数。如果成功, readlink()
函数将返回实际放入 buf
中的字节数。若链接长度超过 buf
,则置于 buf
中的是经截断处理的字符串。因为 buf
尾部并未放置终止字符,因此无法分辨 readlink()
函数所返回的字符串到底是经过了截断处理,还是恰巧将 buf
填满。验证的方法之一是重新分配一块更大的 buf
,并再次调用 readlink()
函数。