名 前
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():
glibc 2.10 以 降 :
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
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); カ ー ネ
ル2.6.18 よ り 前 で は
、 flags 引 き 数 は
未 使 用 で 、 0 を
指 定 し な け れ
ば な ら な か っ
た 。
linkat() の 必 要 性 に つ い て の 説 明 に つ い て は openat(2) を 参 照 。
返 り 値
成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は −1 が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
EACCES
newpath を 含 ん で い る デ ィ レ ク ト リ へ の 書 き 込 み が 許 さ れ て い な い か 、 oldpath ま た は newpath へ の デ ィ レ ク ト リ の ど れ か に 検 索 許 可 が な い (path_resolution(7) を 参 照 )。
EDQUOT
デ ィ ス
ク ブ ロ ッ ク か inode
が そ の フ ァ イ
ル シ ス テ ム の
ユ ー ザ ー ク ォ
ー タ に 達 し て
い た 。
EEXIST
newpath が 既 に 存 在 す る 。
EFAULT
oldpath や newpath が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。
EIO
I/O エ ラ ー が 発 生 し た 。
ELOOP
oldpath ま た は newpath を 解 決 す る 際 に 遭 遇 し た シ ン ボ リ ッ ク リ ン ク が 多 過 ぎ る 。
EMLINK
oldpath に よ っ て 参 照 さ れ る フ ァ イ ル は 既 に 最 大 数 ま で の リ ン ク を 持 っ て い る 。
ENAMETOOLONG
oldpath ま た は newpath が 長 過 ぎ る 。
ENOENT
oldpath ま た は newpath の デ ィ レ ク ト リ 部 分 が 存 在 し な い か 、 壊 れ た (dangling)シ ン ボ リ ッ ク リ ン ク で あ る 。
ENOMEM
十 分 な カ ー ネ ル メ モ リ ー が な い 。
ENOSPC そ の フ ァ イ ル を 含 ん で い る デ バ イ ス に 新 し い デ ィ レ ク ト リ エ ン ト リ ー を 作 成 す る た め の 空 き が な い 。
ENOTDIR
oldpath ま た は newpath の デ ィ レ ク ト リ 部 分 が 、 実 際 に は 、 デ ィ レ ク ト リ で な い 。
EPERM
oldpath が デ ィ レ ク ト リ で あ る 。
EPERM
oldpath と newpath を 含 ん で い る フ ァ イ ル シ ス テ ム が ハ ー ド リ ン ク を サ ポ ー ト し て い な い 。
EPERM (Linux 3.6 以 降 ) 呼 び 出 し 元 に こ の フ ァ イ ル へ の ハ ー ド リ ン ク を 作 成 す る 許 可 が な か っ た (proc(5) の /proc/sys/fs/protected_hardlinks の 説 明 を 参 照 )。
EROFS フ ァ イ ル が 読 み 込 み 専 用 の フ ァ イ ル シ ス テ ム に 存 在 す る 。
EXDEV
oldpath と newpath が 同 じ マ ウ ン ト さ れ た フ ァ イ ル シ ス テ ム に 存 在 し な い 。 (Linux は 1 つ の フ ァ イ ル シ ス テ ム を 複 数 の マ ウ ン ト 位 置 に マ ウ ン ト す る こ と を 許 可 し て い る 。 し か し link() は 、 た と え 同 じ フ ァ イ ル シ ス テ ム で あ っ て も 、 別 々 の マ ウ ン ト 位 置 を 跨 い で は 動 作 し な い 。 )
linkat() で は 以 下 の エ ラ ー も 発 生 す る 。
EBADF
olddirfd か newdirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。
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
oldpath が 相 対 パ ス 名 で 、 olddirfd が 削 除 さ れ た デ ィ レ ク ト リ を 参 照 し て い る 。 ま た は 、 newpath が 相 対 パ ス 名 で 、 newdirfd が 削 除 さ れ た デ ィ レ ク ト リ を 参 照 し て い る 。
ENOTDIR
oldpath が 相 対 パ ス で 、 olddirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る 。 ま た は newpath と newdirfd に 関 し て 同 じ 状 況 で あ る 。
EPERM
flags に AT_EMPTY_PATH が 指 定 さ れ 、 oldpath が 空 文 字 列 で 、 olddirfd が デ ィ レ ク ト リ を 参 照 し て い る 。
バ ー ジ ョ ン
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) を 使 用 す る こ と 。
glibc
で の 注 意
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/ に 書 か れ て い る 。