link - システムコールの説明 - Linux コマンド集 一覧表
名前
link - ファイルの新しい名前を作成する
書式
#include <unistd.h>
int link(const char *
oldpath
, const char *
newpath
);
説明
link
()は存在するファイルへの新しいリンク (link)
(ハード・リンク (hard link) ともいう) を作成する。
newpath
が存在する場合には上書きはされない
。
この新しい名前は全ての操作において古い名前と完全に同じように使用される;
両方の名前は同じファイルを参照しており
(それで同じ許可 (permission) や所有者 (ownership) となるので)、
どちらの名前が「本来」のものであるか判別できない。
返り値
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
エラー
- EACCES
- newpath を含んでいるディレクトリへの書き込みが許されていないか、 oldpath または newpath へのディレクトリのどれかに検索許可がない ( path_resolution (2)を参照)。
- EEXIST
- newpath が既に存在する。
- EFAULT
- oldpath または newpath がアクセス可能なアドレス空間の外を指している。 .TP .B EIO I/O エラーが発生した。 .TP .B ELOOP .IR oldpath または newpath を解決する際に遭遇したシンボリック・リンクが多過ぎる。 .TP .B EMLINK .I oldpath によって参照されるファイルは 既に最大数までのリンクを持っている。 .TP .B ENAMETOOLONG .IR oldpath または newpath が長過ぎる。
- ENOENT
- oldpath または newpath のディレクトリ部分が存在しないか、 壊れた(dangling)シンボリック・リンクである。
- ENOMEM
- カーネルに十分なメモリがない。
- ENOSPC
- そのファイルを含んでいるデバイスに新しいディレクトリ・エントリを 作成するための空きがない。
- ENOTDIR
- oldpath または newpath のディレクトリ部分が、実際には、ディレクトリでない。
- EPERM
- oldpath がディレクトリである。
- EPERM
- oldpath と newpath を含んでいるファイル・システムがハード・リンクをサポートしていない。
- EROFS
- ファイルが読み込み専用のファイル・システムに存在する。
- EXDEV
- oldpath と newpath が同じマウントされたファイル・システムに存在しない。 (Linux は 1 つのファイル・システムを複数のマウント位置に マウントすることを許可している。 しかし link (2) は、たとえ同じファイル・システムであっても、 別々のマウント位置を跨いでは動作しない。)
注意
link
()でファイル・システムを超えてハード・リンクを作成することはできない。
このような場合は
symlink
()を使用すること。
POSIX.1-2001 では、
oldpath
がシンボリック・リンクである場合、
link
()は
oldpath
の参照を削除すべきであると記述している。
しかし、Linux はそのようにしていない。
oldpath
がシンボリック・リンクである場合、
newpath
は同じシンボリック・リンクファイルへの (ハード) リンクとして作成される
(つまり
newpath
は
oldpath
が参照していた同じファイルへのシンボリックリンクになる)。
他のいくつかの実装でも Linux と同じように動作する。
準拠
SVr4, 4.3BSD, POSIX.1-2001 (上記の注意点以外).
バグ
NFS ファイル・システムでは、NFS サーバーがリンクを作成した後に、 それを伝える前に死んだ場合には返り値が不正な場合がある。 リンクが作成できたかどうか見つけるためには stat (2) を使用すること。