realpath - возвращает канонизированный абсолютный путь
realpath(3)
возвращает канонизированный абсолютный путь
ОБЗОР
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
Требования макроса тестирования свойств для glibc
(см. feature_test_macros(7)):
realpath():
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
ОПИСАНИЕ
Функция
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 символов.
ENOMEM
Не хватает памяти.
ENOENT
Указанный файл не существует.
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, позволяет избежать этой
проблемы проектирования.