ОБЗОР
#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
(Но смотрите раздел ДЕФЕКТЫ)