link
Section: System Calls (2)
Updated: 2026-02-11
Index
JM Home Page
roff page
名前
link, linkat - ファイルの新しい名前を作成する
ライブラリ
標準 C ライブラリ (libc,~-lc)
書式
#include <unistd.h>
int link(const char *oldpath, const char *newpath);
#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>
int linkat(int olddirfd, const char *oldpath,
int newdirfd, const char *newpath, int flags);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
linkat():
Since glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_ATFILE_SOURCE
説明
link() は存在するファイルへの新しいリンク (link) (ハードリンク (hard link) ともいう) を作成する。
newpath が存在する場合には、上書きはされない。
この新しい名前は全ての操作において古い名前と完全に同じように使用される; 両方の名前は同じファイルを参照しており (それで同じ許可
(permission) や所有者 (ownership) となるので)、 どちらの名前が本来のものであるか判別できない。
linkat()
linkat() システムコールは link() と全く同様に動作するが、以下で説明する点が異なる。
oldpath で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター olddirfd
が参照するディレクトリに対する相対パスと解釈される (link(2)
に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
oldpath で指定されたパス名が相対パスで、 olddirfd が特別な値 AT_FDCWD の場合、 (link(2)
と同様に) oldpath は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
oldpath で指定されたパス名が絶対パスの場合、 olddirfd は無視される。
newpath の解釈は oldpath と同じである。 相対パスのパス名がファイルディスクリプター newdirfd
が参照するディレクトリと解釈される点だけが異なる。
以下の値のビット単位の論理和を flags に指定できる。
- AT_EMPTY_PATH (Linux 2.6.39 以降)
-
oldpath が空文字列の場合、 olddirfd が参照するファイルへのリンクを作成する (olddirfd は
open(2) の O_PATH フラグを使って取得する)。 この場合、 olddirfd
はディレクトリ以外の任意の型のファイルを参照することができる。 一般的には、 ファイルのリンクカウントが 0 の場合は、この操作は成功しない (ただし、
O_TMPFILE が指定され O_EXCL を指定せずに作成されたファイルは例外である)。 このフラグを使用するためには、 呼び出し元は
CAP_DAC_READ_SEARCH ケーパビリティを持っていなければならない。 このフラグは Linux 固有で、 この定義を得るには
_GNU_SOURCE を定義すること。
- AT_SYMLINK_FOLLOW (Linux 2.6.18 以降)
-
linkat() は (link() 同様) デフォルトでは oldpath がシンボリックリンクの場合リンクの展開を行わない。
フラグ AT_SYMLINK_FOLLOW を flags に指定することができ、指定した場合 oldpath
がシンボリックリンクの場合リンクの展開が行われる。 procfs がマウントされている場合、これは AT_EMPTY_PATH
の代替として以下のように使うことができる。
-
linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
newname, AT_SYMLINK_FOLLOW);
Before Linux 2.6.18, the flags argument was unused, and had to be
specified as 0.
linkat() の必要性についての説明については openat(2) を参照。
返り値
On success, zero is returned. On error, -1 is returned, and errno is set
to indicate the error.
エラー
- EACCES
-
newpath を含んでいるディレクトリへの書き込みが許されていないか、 oldpath または newpath
へのディレクトリのどれかに検索許可がない (path_resolution(7) を参照)。
- EDQUOT
-
ディスクブロックか inode がそのファイルシステムのユーザークォータに達していた。
- EEXIST
-
newpath が既に存在する。
- EFAULT
-
oldpath や newpath がアクセス可能なアドレス空間の外を指している。
- EIO
-
I/O エラーが発生した。
- ELOOP
-
oldpath または newpath を解決する際に遭遇したシンボリックリンクが多過ぎる。
- EMLINK
-
The file referred to by oldpath already has the maximum number of links
to it. For example, on an ext4(5) filesystem that does not employ the
dir_index feature, the limit on the number of hard links to a file is
65,000; on btrfs(5), the limit is 65,535 links.
- ENAMETOOLONG
-
oldpath または newpath が長過ぎる。
- ENOENT
-
oldpath または newpath のディレクトリ部分が存在しないか、 壊れた(dangling)シンボリックリンクである。
- ENOMEM
-
十分なカーネルメモリーがない。
- ENOSPC
-
そのファイルを含んでいるデバイスに新しいディレクトリエントリーを 作成するための空きがない。
- ENOTDIR
-
oldpath または newpath のディレクトリ部分が、実際には、ディレクトリでない。
- EPERM
-
oldpath がディレクトリである。
- EPERM
-
oldpath と newpath を含んでいるファイルシステムがハードリンクをサポートしていない。
- EPERM (Linux 3.6 以降)
-
The caller does not have permission to create a hard link to this file (see
the description of /proc/sys/fs/protected_hardlinks in
proc_sys_fs(5)).
- EPERM
-
oldpath is marked immutable or append-only. (See
FS_IOC_SETFLAGS(2const).)
- EROFS
-
ファイルが読み込み専用のファイルシステムに存在する。
- EXDEV
-
oldpath and newpath are not on the same mounted filesystem. (Linux
permits a filesystem to be mounted at multiple points, but link() does
not work across different mounts, even if the same filesystem is mounted on
both.)
linkat() では以下のエラーも発生する。
- EBADF
-
oldpath (newpath) is relative but olddirfd (newdirfd) is
neither AT_FDCWD nor a valid file descriptor.
- EINVAL
-
無効なフラグ値が flags に指定された。
- ENOENT
-
AT_EMPTY_PATH が flags に指定されたが、呼び出し元が CAP_DAC_READ_SEARCH
ケーパビリティを持っていなかった。
- ENOENT
-
以下の呼び出しで作成されたファイルディスクリプターに対応する /proc/self/fd/NN ファイルに対してリンクを行おおうとした。
-
open(path, O_TMPFILE | O_EXCL, mode);
-
open(2) 参照。
- ENOENT
-
削除済みのファイルに対応する /proc/self/fd/NN ファイルに対してリンクを行おおうとした。
- ENOENT
-
oldpath が相対パス名で、 olddirfd が削除されたディレクトリを参照している。 または、 newpath
が相対パス名で、 newdirfd が削除されたディレクトリを参照している。
- ENOTDIR
-
oldpath が相対パスで、 olddirfd がディレクトリ以外のファイルを参照している。または newpath と
newdirfd に関して同じ状況である。
- EPERM
-
flags に AT_EMPTY_PATH が指定され、 oldpath が空文字列で、 olddirfd
がディレクトリを参照している。
バージョン
POSIX.1-2001 says that link() should dereference oldpath if it is a
symbolic link. However, since Linux 2.0, Linux does not do so: if
oldpath is a symbolic link, then newpath is created as a (hard) link
to the same symbolic link file (i.e., newpath becomes a symbolic link to
the same file that oldpath refers to). Some other implementations behave
in the same manner as Linux. POSIX.1-2008 changes the specification of
link(), making it implementation-dependent whether or not oldpath is
dereferenced if it is a symbolic link. For precise control over the
treatment of symbolic links when creating a link, use linkat().
glibc
linkat() が利用できない古いカーネルでは、 AT_SYMLINK_FOLLOW が指定されていない場合、 glibc ラッパー関数は
link() を使用するモードにフォールバックする。 oldpath と newpath が相対パスの場合、 glibc は
olddirfd と newdirfd 引数に対応する /proc/self/fd
のシンボリックリンクに基づいてそれぞれパス名を構成する。
標準規格
POSIX.1-2024.
歴史
- link()
-
4.3BSD, SVr4, POSIX.1-1988 (but see VERSIONS).
- linkat()
-
POSIX.1-2008, glibc 2.4, Linux 2.6.16.
注意
link() でファイルシステムを超えてハードリンクを作成することはできない。 このような場合は symlink(2) を使用すること。
バグ
NFS ファイルシステムでは、NFS サーバーがリンクを作成した後に、 それを伝える前に死んだ場合には返り値が不正な場合がある。
リンクが作成できたかどうか見つけるためには stat(2) を使用すること。
関連項目
ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2),
path_resolution(7), symlink(7)
Index
- 名前
-
- ライブラリ
-
- 書式
-
- 説明
-
- linkat()
-
- 返り値
-
- エラー
-
- バージョン
-
- glibc
-
- 標準規格
-
- 歴史
-
- 注意
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.