名前

symlink, symlinkat - ファイルに新しい名前を付ける

書式

#include <unistd.h>
int symlink(const char *target, const char *linkpath);
#include <fcntl.h> /* AT_* 定数の定義 */ #include <unistd.h>
int symlinkat(const char *target, int newdirfd, const char *linkpath);

glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
symlink():

_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
|| /* glibc 2.19 以前: */ _BSD_SOURCE
symlinkat():
glibc 2.10 以降:
_POSIX_C_SOURCE >= 200809L
glibc 2.10 より前:
_ATFILE_SOURCE

説明

symlink() は target という文字列をファイルの内容として持つ linkpath というシンボリックリンク (symbolic link) を作成する。
シンボリックリンクは実行時に解釈され、 リンクの内容でパスを置き換えて、そのパスを辿ることで、 ファイルやディレクトリに到達する。
シンボリックリンクはパスの部分に .. を含むかもしれない。これは (もしリンクの最初に使用された場合は) リンクの 存在するディレクトリの親ディレクトリが参照される。
シンボリックリンクは (ソフトリンク (soft link) とも呼ばれ) 存在するファイルを指しているかもしれないし、 存在しないファイルを指しているかもしれない; 後者の場合は壊れたリンク (dangling link) とも呼ばれる。
シンボリックリンクの許可 (permission) は無意味である; リンクを追跡する場合には所有権 (ownership) は無視される。 ただし、リンクの削除や名前の変更が要求され、かつリンクが存在する ディレクトリにスティッキービット (sticky bit) ( S_ISVTX) が設定されている場合には、所有権のチェックが行われる。
linkpath が存在する場合には上書きは されない

symlinkat()

symlinkat() システムコールは symlink() と全く同様に動作するが、以下で説明する点が異なる。
linkpath で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター newdirfd が参照するディレクトリに対する相対パスと解釈される ( symlink() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
linkpath で指定されたパス名が相対パスで、 newdirfd が特別な値 AT_FDCWD の場合、 ( symlink() と同様に) linkpath は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
linkpath で指定されたパス名が絶対パスの場合、 newdirfd は無視される。

返り値

成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

EACCES
linkpath を含んでいるディレクトリへの書き込みが拒否されたか、 linkpath に含まれているディレクトリのどれかに検索許可が与えられていない ( path_resolution(7) も参照すること)。
EDQUOT
そのファイルシステムのリソース使用量がユーザークォータに達している。対象となるリソースは inode かディスクブロックで、どちらになるかはファイルシステムの実装依存である。
EEXIST
linkpath が既に存在する。
EFAULT
targetlinkpath がアクセス可能なアドレス空間の外を指している。
EIO
I/O エラーが発生した。
ELOOP
linkpath を解決する際に遭遇したシンボリックリンクが多過ぎる。
ENAMETOOLONG
target または linkpath が長過ぎる。
ENOENT
linkpath に含まれるディレクトリ部分が存在しないか、壊れたリンクであるか、 targetlinkpath が空文字列である。
ENOMEM
十分なカーネルメモリーがない。
ENOSPC
そのファイルを含んでいるデバイスに新しいディレクトリエントリーを 作成するための空きがない。
ENOTDIR
linkpath に含まれるディレクトリ部分が、実際には、ディレクトリではない。
EPERM
linkpath を含んでいるファイルシステム (file system) が シンボリックリンクの作成をサポートしていない。
EROFS
linkpath が読み込み専用のファイルシステムに存在している。
symlinkat() では以下のエラーも発生する。
EBADF
newdirfd が有効なファイルディスクリプターでない。
ENOENT
linkpath が相対パス名で、 newdirfd が削除されたディレクトリを参照している。
ENOTDIR
linkpath が相対パスで、 newdirfd がディレクトリ以外のファイルを参照しているファイルディスクリプターである。

バージョン

symlinkat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc に追加された。

準拠

symlink(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.
symlinkat(): POSIX.1-2008.

注意

target についてのチェックは行なわれない。
シンボリックリンクによって参照される名前を削除すると (それが他にハードリンク (hard link) を持たなければ) 実際にファイルが削除される。 この動作が望んだものでない場合は、 link(2) を使用すること。

glibc での注意

symlinkat() が利用できない古いカーネルでは、 glibc ラッパー関数は symlink() を使用するモードにフォールバックする。 pathname が相対パスの場合、 glibc は newdirfd 引数に対応する /proc/self/fd のシンボリックリンクに基づいてパス名を構成する。

関連項目

ln(1), namei(1), lchown(2), link(2), lstat(2), open(2), readlink(2), rename(2), unlink(2), path_resolution(7), symlink(7)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。