Man page - readlink(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru de

Manual

READLINK

名 前
書 式
説 明
readlinkat()
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
glibc で の 注 意

関 連 項 目
こ の 文 書 に つ い て

名 前

readlink, readlinkat - シ ン ボ リ ッ ク リ ン ク の 値 を 読 む

書 式

#include <unistd.h>

ssize_t readlink(const char * pathname , char * buf , size_t bufsiz );

#include <fcntl.h> /* AT_* 定 数 の 定 義 */
#include <unistd.h>

ssize_t readlinkat(int dirfd , const char * pathname ,
char *
buf , size_t bufsiz );

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

readlink ():

_XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
|| /* glibc 2.19 以 前 : */ _BSD_SOURCE

readlinkat ():

glibc 2.10 以 降 :

_POSIX_C_SOURCE >= 200809L

glibc 2.10 よ り 前 :

_ATFILE_SOURCE

説 明

readlink () は pathname で 与 え ら れ た シ ン ボ リ ッ ク リ ン ク の 内 容 を buf バ ッ フ ァ ー へ 格 納 す る 、 buf の サ イ ズ は bufsiz で あ る 。 readlink () は ヌ ル バ イ ト を buf に 追 加 し な い 。 そ の 内 容 全 て を 格 納 す る の に バ ッ フ ァ ー が 小 さ 過 ぎ る 場 合 は 、 ( bufsiz バ イ ト の 長 さ に ) 内 容 を (黙 っ て ) 切 り 詰 め る 。

readlinkat()

readlinkat () シ ス テ ム コ ー ル は readlink () と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る ( readlink () に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。

pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 ( readlink () と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。

pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。

Linux 2.6.39 以 降 で は 、 pathname に 空 文 字 列 を 指 定 で き る 。 そ の 場 合 、 呼 び 出 し は dirfd が 参 照 す る シ ン ボ リ ッ ク リ ン ク に 対 し て 行 わ れ る ( dirfd は フ ラ グ O_PATH O_NOFOLLOW を 指 定 し た open (2) を 使 っ て 取 得 す べ き で あ る )。

readlinkat () の 必 要 性 に つ い て の 説 明 に つ い て は openat (2) を 参 照 。

返 り 値

On success, these calls return the number of bytes placed in buf . (If the returned value equals bufsiz , then truncation may have occurred.) On error, -1 is returned and errno is set to indicate the error.

エ ラ ー

EACCES

パ ス の デ ィ レ ク ト リ 部 分 に 検 索 許 可 が 与 え ら れ て い な い ( path_resolution (7) も 参 照 す る こ と )。

EFAULT

buf が プ ロ セ ス に 割 り 当 て ら れ た ア ド レ ス 空 間 の 外 を 指 し て い る 。

EINVAL

bufsiz が 正 で な い 。

EINVAL

The named file (i.e., the final filename component of pathname ) is not a symbolic link.

EIO

フ ァ イ ル シ ス テ ム の 読 み 込 み 中 に I/O エ ラ ー が 起 こ っ た 。

ELOOP

パ ス 名 に シ ン ボ リ ッ ク リ ン ク が 多 す ぎ る 。

ENAMETOOLONG

パ ス 名 か パ ス 名 の 一 部 分 が 長 過 ぎ る 。

ENOENT

そ の 名 前 の フ ァ イ ル が 存 在 し な い 。

ENOMEM

十 分 な カ ー ネ ル メ モ リ ー が な い 。

ENOTDIR

パ ス の デ ィ レ ク ト リ 部 分 が デ ィ レ ク ト リ で な い 。

readlinkat () で は 以 下 の エ ラ ー も 発 生 す る 。

EBADF

dirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。

ENOTDIR

pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

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

準 拠

4.4BSD ( readlink () は 4.2BSD で 初 め て 登 場 し た ), POSIX.1-2001, POSIX.1-2008.

readlinkat (): POSIX.1-2008.

注 意

バ ー ジ ョ ン 2.4 以 前 の glibc (バ ー ジ ョ ン 2.4 を 含 む ) で は 、 readlink () の 返 り 値 の 型 は int で 宣 言 さ れ て い た 。 現 在 で は 、 返 り 値 の 型 は ssize_t で あ る (返 り 値 ssize_t は POSIX.1-2001 で (新 た に ) 必 須 と な っ た )。

静 的 な 大 き さ の バ ッ フ ァ ー を 使 う と 、 シ ン ボ リ ッ ク リ ン ク の 内 容 を 格 納 す る の に 十 分 な 領 域 が な い 場 合 が あ る 。 バ ッ フ ァ ー に 必 要 な サ イ ズ は 、 そ の シ ン ボ リ ッ ク リ ン ク に 対 し て lstat (2) の 呼 び 出 し で 返 さ れ る stat.st_size の 値 か ら 取 得 で き る 。 た だ し 、 readlink () や readlinkat () が 書 き 込 ん だ バ イ ト 数 を チ ェ ッ ク し て 、 シ ン ボ リ ッ ク リ ン ク の サ イ ズ が 二 つ の 呼 び 出 し の 間 で 増 え て い な い こ と を 確 認 す べ き で あ る 。 readlink () や readlinkat () 用 の バ ッ フ ァ ー を 動 的 に 割 り 当 て る 方 法 で も 、 バ ッ フ ァ ー サ イ ズ と し て PATH_MAX を 使 用 す る 場 合 に 共 通 す る 移 植 性 の 問 題 を 解 決 す る こ と が で き る 。 な ぜ な ら 、 POSIX で は 、 シ ス テ ム が そ の よ う な 上 限 値 を 定 義 し て い な い 場 合 に は 、 PATH_MAX が 定 義 さ れ る こ と が 保 証 さ れ て い な い か ら で あ る 。

glibc で の 注 意

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

The following program allocates the buffer needed by readlink () dynamically from the information provided by lstat (2), falling back to a buffer of size PATH_MAX in cases where lstat (2) reports a size of zero.

#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
struct stat sb;
char *buf;
ssize_t nbytes, bufsiz;

if (argc != 2) {
fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
exit(EXIT_FAILURE);
}

if (lstat(argv[1], &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}

/* Add one to the link size, so that we can determine whether
the buffer returned by readlink() was truncated. */

bufsiz = sb.st_size + 1;

/* Some magic symlinks under (for example) /proc and /sys
report 'st_size' as zero. In that case, take PATH_MAX as
a "good enough" estimate. */

if (sb.st_size == 0)
bufsiz = PATH_MAX;

buf = malloc(bufsiz);
if (buf == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}

nbytes = readlink(argv[1], buf, bufsiz);
if (nbytes == -1) {
perror("readlink");
exit(EXIT_FAILURE);
}

printf("'%s' points to '%.*s'\n", argv[1], (int) nbytes, buf);

/* If the return value was equal to the buffer size, then the
the link target was larger than expected (perhaps because the
target was changed between the call to lstat() and the call to
readlink()). Warn the user that the returned target may have
been truncated. */

if (nbytes == bufsiz)
printf("(Returned buffer may have been truncated)\n");

free(buf);
exit(EXIT_SUCCESS);
}

関 連 項 目

readlink (1), lstat (2), stat (2), symlink (2), realpath (3), path_resolution (7), symlink (7)

こ の 文 書 に つ い て

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