LINK(2) | Linux Programmer's Manual | LINK(2) |
link, linkat - ファイルの新しい名前を作成する
#include <unistd.h> int link(const char *oldpath, const char *newpath); #include <fcntl.h> /* AT_* 定数の定義 */ #include <unistd.h> int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
linkat():
link() は存在するファイルへの新しいリンク (link) (ハードリンク (hard link) ともいう) を作成する。
newpath が存在する場合には、上書きはされない。
この新しい名前は全ての操作において古い名前と完全に同じように使用される; 両方の名前は同じファイルを参照しており (それで同じ許可 (permission) や所有者 (ownership) となるので)、 どちらの名前が本来のものであるか判別できない。
linkat() システムコールは link() と全く同様に動作するが、以下で説明する点が異なる。
oldpath で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター olddirfd が参照するディレクトリに対する相対パスと解釈される (link(2) に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
oldpath で指定されたパス名が相対パスで、 olddirfd が特別な値 AT_FDCWD の場合、 (link(2) と同様に) oldpath は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
oldpath で指定されたパス名が絶対パスの場合、 olddirfd は無視される。
newpath の解釈は oldpath と同じである。 相対パスのパス名がファイルディスクリプター newdirfd が参照するディレクトリと解釈される点だけが異なる。
以下の値のビット単位の論理和を flags に指定できる。
linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
newname, AT_SYMLINK_FOLLOW);
カーネル 2.6.18 より前では、 flags 引き数は未使用で、 0 を指定しなければならなかった。
linkat() の必要性についての説明については openat(2) を参照。
成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。
linkat() では以下のエラーも発生する。
open(path, O_TMPFILE | O_EXCL, mode);
open(2) 参照。
linkat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc に追加された。
link(): SVr4, 4.3BSD, POSIX.1-2001 (但し「注意」を参照), POSIX.1-2008.
linkat(): POSIX.1-2008.
link() でファイルシステムを超えてハードリンクを作成することはできない。 このような場合は symlink(2) を使用すること。
POSIX.1-2001 では、 oldpath がシンボリックリンクである場合、 link() は oldpath の参照を解決すべきであると記述されている。 しかし、カーネル 2.0 以降の Linux ではそのようになっていない。 oldpath がシンボリックリンクである場合、 newpath は同じシンボリックリンクファイルへの (ハード) リンクとして作成される (つまり newpath は oldpath が参照していた同じファイルへのシンボリックリンクになる)。 他のいくつかの実装でも Linux と同じように動作する。 POSIX.1-2008 では link() の仕様が変更され、 oldpath がシンボリックリンクの場合にシンボリックリンクの参照を 解決するかどうかは実装依存となった。 リンク作成時のシンボリックリンクの扱いについての詳細な制御を行う場合には linkat(2) を使用すること。
linkat() が利用できない古いカーネルでは、 AT_SYMLINK_FOLLOW が指定されていない場合、 glibc ラッパー関数は link() を使用するモードにフォールバックする。 oldpath と newpath が相対パスの場合、 glibc は olddirfd と newdirfd 引き数に対応する /proc/self/fd のシンボリックリンクに基づいてそれぞれパス名を構成する。
NFS ファイルシステムでは、NFS サーバーがリンクを作成した後に、 それを伝える前に死んだ場合には返り値が不正な場合がある。 リンクが作成できたかどうか見つけるためには stat(2) を使用すること。
ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-08-19 | Linux |