realpath

REALPATH(3)              Руководство программиста Linux              REALPATH(3)



ИМЯ
       realpath - возвращает канонизированный абсолютный путь

ОБЗОР
       #include <limits.h>
       #include <stdlib.h>

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

   Требования макроса тестирования свойств для glibc (см.
   feature_test_macros(7)):

       realpath():
           _XOPEN_SOURCE >= 500
               || /* в glibc начиная с 2.19: */ _DEFAULT_SOURCE
               || /* версии glibc <= 2.19: */ _BSD_SOURCE

ОПИСАНИЕ
       Функция realpath() раскрывает все символьные ссылки, конструкции /./,
       /../ и дополнительные символы «/» в строке path (завершается null) для
       создания канонического абсолютного пути. Получившееся имя сохраняется в
       виде строки (с null на конце) не длиннее чем PATH_MAX байт в буфере,
       указанном в resolved_path. Конечный путь не содержит символьных ссылок и
       компонентов /./ или /../.

       Если значение resolved_path равно NULL, то realpath() выделяет буфер
       размером PATH_MAX байт с помощью malloc(3) для хранения полного пути и
       возвращает указатель на этот буфер. Вызывающий должен освободить буфер с
       помощью free(3).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
       При успешном выполнении realpath() возвращает указатель на resolved_path.

       При ошибках возвращается NULL, содержимое массива resolved_path не
       определено и в errno указывается код ошибки.

ОШИБКИ
       EACCES Запрещено чтение или поиск для компонента, содержащегося в пути.

       EINVAL Значение path равно NULL (в glibc до версии 2.3 эта ошибка также
              возвращалась и при resolved_path равном NULL).

       EIO    При чтении файловой системы произошла ошибка ввода-вывода.

       ELOOP  Во время определения pathname встретилось слишком много символьных
              ссылок.

       ENAMETOOLONG
              Компонент имени пути более NAME_MAX символов, или весь путь более
              PATH_MAX символов.

       ENOENT Указанный файл не существует.

       ENOMEM Не хватает памяти.

       ENOTDIR
              Компонент в префиксе пути не является каталогом.

АТРИБУТЫ
       Описание терминов данного раздела смотрите в attributes(7).

       ┌───────────┬──────────────────────┬──────────┐
       │Интерфейс  Атрибут              Значение │
       ├───────────┼──────────────────────┼──────────┤
       │realpath() │ Безвредность в нитях │ MT-Safe  │
       └───────────┴──────────────────────┴──────────┘
СООТВЕТСТВИЕ СТАНДАРТАМ
       4.4BSD, POSIX.1-2001.

       В POSIX.1-2001 сказано, что поведение при значении resolved_path равном
       NULL, зависит от реализации. В POSIX.1-2008 определено поведение,
       аналогичное описанию на этой странице.

ЗАМЕЧАНИЯ
       В 4.4BSD и Solaris максимальная длина пути равна MAXPATHLEN (находится в
       <sys/param.h>). В SUSv2 величины PATH_MAX и NAME_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
       Если вызов завершается с ошибкой EACCES или ENOENT и значение
       resolved_path не равно NULL, то в resolved_path возвращается начало не
       читаемой или не существующей части path.

ДЕФЕКТЫ
       Стандартная версия этой функции POSIX.1-2001 некорректна изначально, так
       как невозможно определить подходящий размер для буфера результата. В
       соответствии с POSIX.1-2001 буфера размером PATH_MAX должно хватить, но
       PATH_MAX может не задаваться константой, а получаться через функцию
       pathconf(3). И запрос pathconf(3) особо не поможет, так как с одной
       стороны POSIX предупреждает, что результат pathconf(3) может быть слишком
       велик и не пригоден для выделения памяти. С другой стороны, pathconf(3)
       может возвратить -1 для обозначения того, что PATH_MAX неограничен.
       Свойство resolved_path == NULL, не стандартизованное в POSIX.1-2001, но
       стандартизованное в POSIX.1-2008, позволяет избежать этой проблемы
       проектирования.

СМОТРИТЕ ТАКЖЕ
       realpath(1), readlink(2), canonicalize_file_name(3), getcwd(3),
       pathconf(3), sysconf(3)



                                   2016-03-15                        REALPATH(3)