link(2) - Linux 手册页
名称
link - 为文件创建新的名称概要
#include <unistd.h>int link(const char *oldpath, const char *newpath);
描述
如果 newpath 存在,它将不会被覆盖。
这个新的名称可以在任何操作中使用,就像旧名称一样;这两个名称都指向同一个文件(因此具有相同的权限和所有权),并且无法判断哪个名称是“原始”名称。
返回值
成功时返回零。出错时返回 -1,并相应地设置 errno。错误
- EACCES
- 无法访问包含 newpath 的目录的写入权限,或者拒绝了 oldpath 或 newpath 的路径前缀中的某个目录的搜索权限。(请参阅 path_resolution(7)。)
- EDQUOT
- 用户在文件系统上的磁盘块配额已用完。
- EEXIST
- newpath 已经存在。
- EFAULT
- oldpath 或 newpath 指向您可访问地址空间之外的位置。
- EIO
- 发生了 I/O 错误。
- ELOOP
- 在解析 oldpath 或 newpath 时遇到了过多的符号链接。
- EMLINK
- 由 oldpath 引用的文件已经达到了最大链接数。
- ENAMETOOLONG
- oldpath 或 newpath 太长。
- ENOENT
- oldpath 或 newpath 中的某个目录组件不存在或是一个断开的符号链接。
- ENOMEM
- 内核内存不足。
- ENOSPC
- 包含该文件的设备没有足够的空间来创建新的目录条目。
- ENOTDIR
- 在 oldpath 或 newpath 中用作目录的组件实际上不是一个目录。
- EPERM
- oldpath 是一个目录。
- EPERM
- 包含 oldpath 和 newpath 的文件系统不支持创建硬链接。
- EPERM (自 Linux 3.6 起)
- 调用者没有权限为此文件创建硬链接(请参阅 proc(5) 中的 /proc/sys/fs/protected_hardlink 的描述)。
- EROFS
- 文件位于只读文件系统上。
- EXDEV
- oldpath 和 newpath 不在同一个挂载的文件系统上。(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)。