link(2) - Linux 手册页

名称

link - 为文件创建新的名称

概要

#include <unistd.h>

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

描述

link() 创建一个现有文件的新的链接(也称为硬链接)。

如果 newpath 存在,它将不会被覆盖。

这个新的名称可以在任何操作中使用,就像旧名称一样;这两个名称都指向同一个文件(因此具有相同的权限和所有权),并且无法判断哪个名称是“原始”名称。

返回值

成功时返回零。出错时返回 -1,并相应地设置 errno

错误

EACCES
无法访问包含 newpath 的目录的写入权限,或者拒绝了 oldpathnewpath 的路径前缀中的某个目录的搜索权限。(请参阅 path_resolution(7)。)
EDQUOT
用户在文件系统上的磁盘块配额已用完。
EEXIST
newpath 已经存在。
EFAULT
oldpathnewpath 指向您可访问地址空间之外的位置。
EIO
发生了 I/O 错误。
ELOOP
在解析 oldpathnewpath 时遇到了过多的符号链接。
EMLINK
oldpath 引用的文件已经达到了最大链接数。
ENAMETOOLONG
oldpathnewpath 太长。
ENOENT
oldpathnewpath 中的某个目录组件不存在或是一个断开的符号链接。
ENOMEM
内核内存不足。
ENOSPC
包含该文件的设备没有足够的空间来创建新的目录条目。
ENOTDIR
oldpathnewpath 中用作目录的组件实际上不是一个目录。
EPERM
oldpath 是一个目录。
EPERM
包含 oldpathnewpath 的文件系统不支持创建硬链接。
EPERM (自 Linux 3.6 起)
调用者没有权限为此文件创建硬链接(请参阅 proc(5) 中的 /proc/sys/fs/protected_hardlink 的描述)。
EROFS
文件位于只读文件系统上。
EXDEV
oldpathnewpath 不在同一个挂载的文件系统上。(Linux 允许将文件系统挂载在多个点上,但 link() 不适用于不同的挂载点,即使同一个文件系统挂载在两者上。)

符合

SVr4, 4.3BSD, POSIX.1-2001 (但请参阅 NOTES)。

说明

link() 创建的硬链接不能跨越文件系统。如果需要,请使用 symlink(2)

POSIX.1-2001 规定,如果 oldpath 是一个符号链接,则 link() 应该取消引用 oldpath。但是,自内核 2.0 以来,Linux 并没有这样做:如果 oldpath 是一个符号链接,则 newpath 将被创建为指向相同符号链接文件的(硬)链接(即,newpath 成为指向 oldpath 引用文件的相同符号链接)。其他一些实现的行为与 Linux 相同。POSIX.1-2008 更改了 link() 的规范,使得如果 oldpath 是一个符号链接,是否取消引用 oldpath 由实现决定。要精确控制在创建链接时处理符号链接的方式,请参阅 linkat(2)

错误

在 NFS 文件系统上,如果 NFS 服务器执行链接创建并在能够告知之前就崩溃,则返回代码可能会错误。使用 stat(2) 来确定链接是否已创建。

参见

ln(1), linkat(2), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

引用自

explain(1), explain(3), explain_link(3), explain_link_or_die(3), link(1), lockfile_create(3), nfslogsum(8), open_excl(3), remove(3), star(1), tar_extract_regfile(3)