Главная » 2017 » Ноябрь » 19 » man 2 getcwd
22:14
man 2 getcwd

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


getcwd, getwd, get_current_dir_name - возвращают текущий рабочий каталог



ОБЗОР


#include <unistd.h>

char *getcwd(char *buf, size_t size);

char *getwd(char *buf);

char *get_current_dir_name(void);

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

get_current_dir_name():
_GNU_SOURCE

getwd():
Начиная с glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
|| /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
|| /* версии glibc <= 2.19: */ _BSD_SOURCE
До glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500



ОПИСАНИЕ


Данные функции возвращают строку (с null в конце), содержащую абсолютный путь
текущего рабочего каталога вызывающего процесса. Путь возвращается как результат
функции или в аргументе buf, если он есть.

Если текущий каталог расположен не ниже корневого каталога текущего процесса
(например, процесс задал новый корневой каталог файловой системы с помощью
chroot(2) и не сменил свой текущий каталог на новый корень), то начиная с Linux
2.6.36, возвращаемый путь будет начинаться со строки «(unreachable)». Такое
поведение также можно увидеть, если непривилегированный пользователь изменил
текущий каталог в другом пространстве имён mount. При работе с путями из
недоверительных источников вызывающий этих функций должен проверять начинается ли
возвращённый путь с «/» или «(», чтобы избежать неверного понимания недостижимого
пути как относительного пути.

Функция getcwd() копирует абсолютный путь текущего рабочего каталога в массив, на
который указывает buf, имеющий длину size.

Если длина абсолютного пути, включая конечный байт null, превышает size байт, то
возвращается NULL, а errno принимает значение ERANGE; приложение должно проверить,
возникла эта ошибка или нет и, если необходимо, выделить буфер большего размера.

Согласно расширению стандарта POSIX.1-2001 в glibc предусмотрено следующее: если
buf равно NULL, то при вызове getcwd() буфер выделяется динамически с помощью
функции malloc(3). В этом случае выделенный буфер имеет размер size; если size
равно нулю, то выделяется buf необходимого размера. Вызывающий после использования
должен освободить выделенный буфер с помощью free(3).

Функция get_current_dir_name() выделит с помощью malloc(3) массив, достаточно
большой для помещения в него абсолютного пути имени текущего каталога. Если
существует и имеет правильное значение переменная окружения PWD, то будет
возвращено её значение. Вызывающий после использования должен освободить
выделенный буфер с помощью free(3).



ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ


При успешном выполнении эти функции возвращают указатель на строку, содержащую
пути текущего рабочего каталога. У getcwd() и getwd() это значение совпадает с
buf.

При ошибках эти функции возвращают NULL и в errno помещают причину ошибки.
Содержимое массива buf в этом случае не определено.



ОШИБКИ


EACCES Нет прав на чтение или поиск одного из компонентов пути файла.

EFAULT Значение buf указывает на неправильный адрес.

EINVAL Аргумент size равен нулю, а buf не является указателем null.

EINVAL getwd(): buf равно NULL.

ENAMETOOLONG
getwd(): Размер строки абсолютного пути, включая конечный null, превышает
PATH_MAX байт.

ENOENT Текущий рабочий каталог был удалён.

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

ERANGE Аргумент size меньше длины абсолютного пути рабочего каталога, включая
конечный байт null. Вам нужно выделить массив большего размера попробовать
ещё раз.



АТРИБУТЫ


Описание терминов данного раздела смотрите в attributes(7).

┌───────────────────────┬──────────────────────┬─────────────┐
│Интерфейс │ Атрибут │ Значение │
├───────────────────────┼──────────────────────┼─────────────┤
│getcwd(), getwd() │ Безвредность в нитях │ MT-Safe │
├───────────────────────┼──────────────────────┼─────────────┤
│get_current_dir_name() │ Безвредность в нитях │ MT-Safe env │
└───────────────────────┴──────────────────────┴─────────────┘


СООТВЕТСТВИЕ СТАНДАРТАМ


Функция getcwd() соответствует POSIX.1-2001. Однако заметим, что в POSIX.1-2001 не
описано поведение getcwd(), если buf равно NULL.

Функция getwd() описана в POSIX.1-2001, но помечена как УСТАРЕВШАЯ. В POSIX.1-2008
getwd() удалена. Вместо неё используйте getcwd(). В POSIX.1-2001 не определены
ошибки, возвращаемые getwd().

Функция get_current_dir_name() является расширением GNU.



ЗАМЕЧАНИЯ


В Linux, функция getcwd() является системным вызовом (начиная с 2.1.92). В более
старых системах она опрашивает /proc/self/cwd. Если в системе отсутствует
системный вызов и файловая система proc, то задействуется обобщённая реализация.
Только в этом случает данные вызовы в Linux могут завершиться с ошибкой EACCES.

Данные функции часто используются для сохранения расположения текущего рабочего

Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 393 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar