Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

       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 == -1) {
               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[r] = '\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.54 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。