Manpages

名 前

realpath − 正 規 化 さ れ た 絶 対 パ ス 名 を 返 す

書 式

#include <limits.h>
#include <stdlib.h>

char *realpath(const char *path, char *resolved_path);

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

realpath():

_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説 明

realpath() は path と し て 与 え ら れ た ヌ ル 終 端 さ れ た 文 字 列 中 の す べ て の シ ン ボ リ ッ ク リ ン ク を 展 開 し 、 /./, /../ に よ る 参 照 や 余 分 な '/' を 解 決 し て 、 正 規 化 さ れ た 絶 対 パ ス 名 を 生 成 す る 。 得 ら れ た 絶 対 パ ス 名 は 、 最 大 で PATH_MAX バ イ ト の ヌ ル 終 端 さ れ た 文 字 列 と し て 、 resolved_path に よ り 参 照 さ れ る バ ッ フ ァ ー に 格 納 さ れ る 。 結 果 と し て 返 る パ ス の 中 に は 、 シ ン ボ リ ッ ク リ ン ク や /./, /../ と い っ た 要 素 は 含 ま れ な い 。

resolved_path に NULL が 指 定 さ れ る と 、 realpath() は malloc(3) を 使 っ て 解 決 し た パ ス 名 を 保 持 す る た め の バ ッ フ ァ ー を 最 大 で PATH_MAX バ イ ト ま で 割 り 当 て 、 こ の バ ッ フ ァ ー へ の ポ イ ン タ ー を 返 す 。 呼 び 出 し 元 は 、 free(3) を 使 っ て こ の バ ッ フ ァ ー を 解 放 す べ き で あ る 。

返 り 値

エ ラ ー が な か っ た 場 合 、 realpath() は resolved_path へ の ポ イ ン タ ー を 返 す 。 そ れ 以 外 の 場 合 は NULL が 返 り 、 配 列 resolved_path の 内 容 は 不 定 と な り 、 errno に エ ラ ー の 内 容 を 示 す 値 が セ ッ ト さ れ る 。

エ ラ ー

EACCES パ ス の デ ィ レ ク ト リ 部 分 に 、 読 み 出 し 許 可 ま た は 検 索 許 可 が 与 え ら れ て い な い 。

EINVAL

path が NULL で あ る 。 (バ ー ジ ョ ン 2.3 よ り 前 の glibc で は 、 resolved_path が NULL の 場 合 に も こ の エ ラ ー が 返 さ れ る 。 )

EIO フ ァ イ ル シ ス テ ム を 読 む と き に 、

I/Oエ ラ ー が 起 こ っ た 。

ELOOP パ ス 名 の 変 換 に あ た り 、 解 決 す べ

き シ ン ボ リ ッ ク リ ン ク の 数 が 多 過 ぎ た 。

ENAMETOOLONG パ ス 名 の 一 要 素 の 文 字 数 が NAME_MAX を 越 え て い る 、 ま た は パ ス 名 全 体 の 文 字 数 が PATH_MAX を 越 え て い る 。

ENOENT 指 定 さ れ た フ ァ イ ル が 存 在 し な い 。

ENOTDIR パ ス の デ ィ レ ク ト リ 要 素 が 、 デ ィ レ ク ト リ で な い 。

準 拠

4.4BSD, POSIX.1−2001.

POSIX.1−2001 で は resolved_path が NULL の 場 合 の 動 作 は 実 装 に 依 存 す る と し て い る 。 POSIX.1−2008 で は 、 こ の マ ニ ュ ア ル ペ ー ジ に 書 か れ て い る 動 作 が 規 定 さ れ て い る 。

注 意

4.4BSD と Solaris で は 、 パ ス 名 の 長 さ の 上 限 は (<sys/param.h> の 中 に あ る ) MAXPATHLEN で あ る 。 SUSv2 で は PATH_MAXNAME_MAX が 規 定 さ れ て お り 、 こ れ ら は <limits.h> で 定 義 さ れ て い る か 、 pathconf(3) 関 数 か ら 得 ら れ る 。 以 下 の よ う な ソ ー ス コ ー ド に な っ て い る こ と が 多 い 。

#ifdef PATH_MAX
path_max = PATH_MAX;
#else
path_max = pathconf(path, _PC_PATH_MAX);
if (path_max <= 0)

path_max = 4096;

#endif

(バ グ の 章 も 参 照 の こ と 。 )

GNU に よ る 拡 張 呼 び 出 し が EACCESENOENT で 失 敗 し resolved_path が NULL で な い 場 合 、 読 む こ と が で き な い 、 も し く は 存 在 し な い path の デ ィ レ ク ト リ 要 素 (prefix) が resolved_path で 返 さ れ る 。

バ グ

こ の 関 数 の POSIX.1−2001 版 は 、 設 計 段 階 か ら 問 題 が あ る 。 出 力 バ ッ フ ァ ー resolved_path の 適 切 な サ イ ズ を 決 定 す る こ と が で き な い か ら で あ る 。 POSIX.1−2001 で は バ ッ フ ァ ー サ イ ズ と し て PATH_MAX は 十 分 だ と さ れ て い る が 、 PATH_MAX は 定 義 済 の 定 数 で あ る 必 要 は な く 、 pathconf(3) を 使 っ て 得 ら れ る 値 で あ っ て も よ い こ と に な っ て い る 。 pathconf(3) か ら バ ッ フ ァ ー サ イ ズ を 取 得 し た と し て も 必 ず し も 十 分 で は な い 。 な ぜ な ら 、 POSIX で 警 告 さ れ て い る よ う に 、 pathconf(3) の 返 り 値 が 大 き 過 ぎ て 適 切 に メ モ リ ー を 確 保 す る こ と が で き な い か も し れ な い 一 方 で 、 pathconf(3)PATH_MAX に 制 限 が な い こ と を 示 す −1 を 返 す か も し れ な い か ら で あ る 。 resolved_path == NULL の 機 能 を 使 う と 、 こ の 設 計 上 の 問 題 を 回 避 す る こ と が で き る 。 こ の 機 能 は POSIX.1−2001 で は 標 準 化 さ れ て い な い が 、 POSIX.1−2008 で は 標 準 化 さ れ て い る 。

関 連 項 目

realpath(1), readlink(2), canonicalize_file_name(3), getcwd(3), pathconf(3), sysconf(3)

こ の 文 書 に つ い て

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