2017-09-15
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages-dev
Manual pages about using GNU/Linux for development
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
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
|| /* в glibc начиная с 2.19: */ _DEFAULT_SOURCE
|| /* версии glibc <= 2.19: */ _BSD_SOURCE
ОПИСАНИЕ
Функция realpath() раскрывает все символьные ссылки, конструкции /./, /../ и дополнительные символы «/» в строке path (завершается null) для создания канонического абсолютного пути. Получившееся имя сохраняется в виде строки (с null на конце) не длиннее чем PATH_MAX байт в буфере, указанном в resolved_path. Конечный путь не содержит символьных ссылок и компонентов /./ или /../.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении 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
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, позволяет избежать этой проблемы проектирования.