链接和链接子例程
用途
为现有文件创建额外的目录条目。
库
标准 C 库 (libc.a)
语法
#include <unistd.h>int link ( Path1, Path2)
const char *Path1, *Path2;
int linkat ( DirFileDescriptor1,Path1,DirFileDescriptor2,Path2,Flag)
int DirFileDescriptor1, DirFileDescriptor2;
const char *Path1, *Path2;
int Flag; 描述
链接 和 林开 子例程会为现有文件创建额外的硬链接 (目录条目)。 旧链接和新链接都共享对底层对象的同等访问权。
如果 标志 参数设置了 AT_SYMLINK_FOLLOW 位,并且 DirFileDescriptor1 和 DirFileDescriptor2 参数都是 AT_FDCWD ,或者 Path1 和 Path2 参数都是绝对路径名,那么 林开 子例程与链接子例程等效。 如果 DirFileDescriptor1 是打开目录的有效文件描述符,并且 Path1 是相对路径名,那么 Path1 将被视为相对于与 DirFileDescriptor1 参数相关联的目录,而不是当前工作目录。 对于 DirFileDescriptor2 和 Path2 参数也如此。
如果 林开 子例程中的任何一个目录是在没有 搜索 打开标志的情况下打开的,那么该子例程通过使用该目录的当前许可权来检查是否允许对该目录进行目录搜索。 如果任一目录是使用 搜索 打开标志打开的,那么子例程不会对该目录执行检查。
如果 林开 子例程的 Flag 参数未设置 AT_SYMLINK_FOLLOW 位,并且 Path1 参数指定了符号链接,那么该子例程将创建指向符号链接的链接,而不是其目标。
参数
| 项 | 描述 |
|---|---|
| Path1 | 指向一个现有文件的路径名。 如果指定了 DirFileDescriptor1 ,并且 Path1 是相对路径名,那么 Path1 将被视为相对于 DirFileDescriptor1指定的目录。 |
| Path2 | 指向要创建的目录项的路径名。 如果指定了 DirFileDescriptor2 ,并且 Path2 是相对路径名,那么 Path2 将被视为相对于 DirFileDescriptor2指定的目录。 |
| DirFileDescriptor1 | 指定打开的目录的文件描述符。 |
| DirFileDescriptor2 | 指定打开的目录的文件描述符。 |
| 标志 | 指定位字段。 如果它包含 AT_SYMLINK_FOLLOW 位,并且 Path1 指向符号链接,那么会将该链接创建到符号链接指向的文件,否则会创建指向符号链接的链接。 |
- 如果系统上安装了网络文件系统 (NFS) ,那么这些路径可以跨入另一个节点。
- 使用硬链接时, Path1 和 Path2 参数都必须位于同一文件系统上。 创建指向目录的链接需要 root 用户权限。
返回值
在成功完成后, 链接 和 林开 子例程将返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。
错误代码
如果下列其中一项为 true ,那么 链接 和 林开 子例程不成功:
| 项 | 描述 |
|---|---|
| EACCES | 指示请求的链接需要在拒绝写许可权的目录中进行写操作。 |
| EDQUOT | 指示无法扩展新链接的条目所在的目录,或者由于包含该目录的文件系统上磁盘块或索引节点的用户或组配额已耗尽,因此无法为该链接分配磁盘块。 |
| EEXIST | 指示由 Path2 参数指定的链接已存在。 |
| EMLINK | 指示文件已具有最大数目的链接。 |
| ENOENT | 指示由 Path1 参数命名的文件不存在。 |
| ENOSPC | 指示无法扩展新链接的条目所在的目录,因为包含该目录的文件系统上没有剩余的空间。 |
| EPERM | 指示由 Path1 参数指定的文件是目录,并且调用进程不具有 root 用户权限。 |
| EROFS | 指示所请求的链接需要写入只读文件系统上的目录。 |
| 扩展 DEV | 指示由 Path2 参数指定的链接以及由 Path1 参数指定的文件位于不同的文件系统上,或者由 Path1 指定的文件引用了指定的 STREAM。 |
如果以下一个或多个条件成立,那么 林开 子例程不成功:
| 项 | 描述 |
|---|---|
| EBADF | Path1 或 Path2 参数未指定绝对路径,并且相应的 DirFileDescriptor1 或 DirFileDescriptor2 参数既不是 AT_FDCWD 也不是有效的文件描述符。 |
| ENOTDIR | Path1 或 Path2 参数未指定绝对路径,相应的 DirFileDescriptor1 或 DirFileDescriptor2 参数既不是 AT_FDCWD ,也不是与目录关联的文件描述符。 |
| EINVAL | 标志 参数的值是无效的。 |
链接 和 林开 子例程可能由于其他原因而不成功。
如果在系统上安装了 NFS ,那么如果满足以下条件,那么 link 和 linkat 子例程将失败:
| 项 | 描述 |
|---|---|
| ETIMEDOUT | 指示连接已超时。 |