LINK(2) | FreeBSD System Calls Manual | LINK(2) |
名称
link, linkat — ハードファイルリンクを作成するライブラリ
Standard C Library (libc, -lc)書式
#include < unistd.h> int
link( const char *name1, const char *name2);
int
linkat( int fd1, const char *name1, int fd2, const char *name2, int flag);
解説
link() システムコールは、 name1 が指す下層オブジェクトの属性を持つ、指定のディレクトリエントリ (ハードリンク) name2 を不可分に作成します。リンクが正常に完了すると下層オブジェクトのリンクカウントが増加します。 name1 と name2 は、下層オブジェクトへのアクセスとアクセス権を等しく共有します。name1 を削除してもファイル name2 は削除されず、下層オブジェクトのリンクカウントが減少します。
name1 引数によって指されるオブジェクトはハードリンクが成功するために存在している必要があり、 name1 と name2 の両方が同じファイルシステム上に存在している必要があります。 name1 引数はディレクトリであってはなりません。
linkat() システムコールは、 name1 または name2 が相対パスである場合を除いて、 link と同等です。この場合、相対パス name1 は、カレントワーキングディレクトリの代わりにファイル記述子 fd1 に関連しているディレクトリに相対的に解釈され、 name2 とファイル記述子 fd2 も同様です。
flag のための値は、 < fcntl.h> で定義され、次のリストからフラブのビット単位の包括的論理和 (OR) によって構成されます:
- AT_SYMLINK_FOLLOW
- name1 がシンボリックリンクであるなら、シンボリックリンクのターゲットのための新しいリンクが、作成されます。
linkat() が、 fd1 または fd2 パラメータの特別な値 AT_FDCWD を渡されるなら、カレントワーキングディレクトリは、個別の name 引数のために使用されます。 fd1 と fd2 の両方に値 AT_FDCWD があるなら、振る舞いは、 link() への呼び出しと同様です。 flag が AT_SYMLINK_FOLLOW フラグを含んでいなくて、 name1 がシンボリックリンクであるなら、新しいリンクは、ターゲットではなく、シンボリックリンク name1 のために作成されます。
戻り値
The link() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.エラー
link() システムコールは次の場合に処理に失敗し、リンクは作成されません:- [ ENOTDIR]
- いずれかの前置パス名の構成要素がディレクトリではありません。
- [ ENAMETOOLONG]
- いずれかのパス名の構成要素が 255 文字を越えているか、またはいずれかのパス名全体の長さが 1023 文字を越えています。
- [ ENOENT]
- いずれかの前置パス名の構成要素が存在しません。
- [ EOPNOTSUPP]
- name1 によって指定されたファイルが入っているファイルシステムがリンクをサポートしていません。
- [ EMLINK]
- name1 で指定されたファイルのリンクカウントが 32767 を越えます。
- [ EACCES]
- いずれかの前置パス名の構成要素について検索許可が拒否されています。
- [ EACCES]
- 要求されたリンクは、書み込み許可を拒否するモードのディレクトリに書き込むことを要求しています。
- [ ELOOP]
- パス名を変換するときに検出されたシンボリックリンクが多すぎます。
- [ ENOENT]
- name1 によって指定されたファイルが存在しません。
- [ EEXIST]
- name2 によって指定されたリンクが存在します。
- [ EPERM]
- name1 によって指定されたファイルは、ディレクトリです。
- [ EPERM]
- name1 によって指定されたファイルは、不変または追加専用フラグが設定されています、詳細については、 chflags(2) マニュアルページを参照してください。
- [ EPERM]
- name2 によって指定されたファイルの親ディレクトリには、不変のフラグが設定されています。
- [ EXDEV]
- name2 によって指定されたリンクと name1 によって指定されたファイルが異なるファイルシステム上にあります。
- [ ENOSPC]
- ディレクトリを格納しているファイルシステムに容量が残っていないため、新しいリンクを入れるエントリを置くディレクトリを拡張できません。
- [ EDQUOT]
- ディレクトリを格納しているファイルシステムでユーザのディスクブロックに関するクォータが枯渇したため、新しいリンクを入れるエントリを置くディレクトリを拡張できません。
- [ EIO]
- ディレクトリエントリを作成するためファイルシステムに読み書きしている間に入出力エラーが発生しました。
- [ EROFS]
- 要求されたリンクは、読み込み専用ファイルシステム上のディレクトリに書み込みすることを要求しています。
- [ EFAULT]
- 指定されたパス名の 1 つが、プロセスに割り当てられたアドレス空間の範囲外を指しています。
link() によって返されたエラーに加えて linkat() は、次の場合に失敗します:
- [ EBADF]
- name1 または name2 引数が、絶対パスを指定していません、そして fd1 または fd2 引数は、 AT_FDCWD でもなく検索のためにオープンされた有効なファイル記述子でもありません。
- [ EINVAL]
- flag 引数の値は、有効ではありません。
- [ ENOTDIR]
- name1 または name2 引数が、絶対パスではありません、そして fd1 または fd2 が、 AT_FDCWD でもなくディレクトリに関連しているファイル記述子でもありません。
規格
link() システムコールは IEEE Std 1003.1-1990 (“POSIX.1”) に適合するはずです。 linkat() システムコールは、The Open Group Extended API Set 2 仕様に従います。歴史
link() 関数は Version 7 AT&T UNIX で登場しました。 linkat() システムコールは FreeBSD 8.0 で登場しました。従来、スーパユーザは link() システムコールによってディレクトリをリンクでき、これはファイルシステムの一貫性を破壊するものでした。この実装は、もはや許可されていません。
April 10, 2008 | FreeBSD |