EN JA
READLINK(2)
READLINK(2) Linux Programmer's Manual READLINK(2)

名前

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

書式

#include <unistd.h>
 
ssize_t readlink(const char * path , char * buf , size_t bufsiz );
 

glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
 
readlink():
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE >= 200112L

説明

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

返り値

成功すると、 readlink() は buf に格納されたバイト数を返す。エラーの場合、-1 を返し、 errno にエラーを示す値を設定する。

エラー

EACCES
パスのディレクトリ部分に検索許可が与えられていない ( path_resolution(7) も参照すること)。
EFAULT
buf がプロセスに割り当てられたアドレス空間の外を指している。
EINVAL
bufsiz が正でない。
EINVAL
指定したファイルがシンボリックリンクでない。
EIO
ファイルシステムの読み込み中に I/O エラーが起こった。
ELOOP
パス名にシンボリックリンクが多すぎる。
ENAMETOOLONG
パス名かパス名の一部分が長過ぎる。
ENOENT
その名前のファイルが存在しない。
ENOMEM
十分なカーネルメモリーがない。
ENOTDIR
パスのディレクトリ部分がディレクトリでない。

準拠

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

注意

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

以下のプログラムは、 readlink() が必要とするバッファを、 lstat() が提供する情報に基づいて動的に割り当てる。また、両方の呼び出し間で競合条件がないことを保証している。


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


int
main(int argc, char *argv[])
{
struct stat sb;
char *linkname;
ssize_t r;


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);
}


linkname = malloc(sb.st_size + 1);
if (linkname == NULL) {
fprintf(stderr, "insufficient memory\n");
exit(EXIT_FAILURE);
}


r = readlink(argv[1], linkname, sb.st_size + 1);


if (r < 0) {
perror("lstat");
exit(EXIT_FAILURE);
}


if (r > sb.st_size) {
fprintf(stderr, "symlink increased in size "
"between lstat() and readlink()\n");
exit(EXIT_FAILURE);
}


linkname[sb.st_size] = '\0';


printf("'%s' points to '%s'\n", argv[1], linkname);


exit(EXIT_SUCCESS);
}

関連項目

readlink(1), lstat(2), readlinkat(2), stat(2), symlink(2), path_resolution(7), symlink(7)

この文書について

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