access
1. access.2.man
Manpage of ACCESS
ACCESS
Section: Руководство программиста Linux (2)Updated: 2007-07-10
Index Return to Main Contents
ИМЯ
access - проверить реальные права доступа пользователя к файлуОБЗОР
#include <unistd.h> int access(const char *pathname, int mode);
ОПИСАНИЕ
access проверяет, имеет ли вызвавший процесс права доступа к файлу pathname. Если pathname является символьной ссылкой, то проверяются права доступа к файлу, на который она ссылается.Аргумент mode --- это маска выполняемых проверок доступа; может быть равна значению F_OK, или состоять из одного или несколько побитово сложенных R_OK, W_OK и X_OK. F_OK проверяет существование файла. R_OK, W_OK и X_OK запрашивают проверку, соответственно, существования файла и возможности его чтения, записи или выполнения.
Проверка осуществляется с использованием реального, а не эффективного идентификатора пользователя (UID) и группы (GID) вызвавшего процесса. Эффективные идентификаторы будут использоваться при действительной попытке выполнения той или иной операции с файлом (например, open(2)). Это дает программам с set-user-ID простой способ проверить права доступа вызвавшего пользователя.
Если вызвавший процесс имеет соответствующие привилегии (например, его реальный UID равен нулю), то проверка X_OK пройдёт успешно для обычного файла, если у него установлено право на выполнение в любой группе бит: у владельца, группы или остальных.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха (есть все запрошенные права) возвращается нуль. При ошибке (по крайней мере, одно право из mode было не удовлетворено, или случилась другая ошибка), возвращается -1, а errno устанавливается должным образом.ОШИБКИ
access() будет завершаться с ошибкой если:- EACCES
- Запрошенный тип доступа не удовлетворён или в одном из каталогов в pathname не разрешён поиск. (См. также path_resolution(7).)
- ELOOP
- Во время определения pathname встретилось слишком много символьных ссылок.
- ENAMETOOLONG
- Слишком длинное значение аргумента pathname.
- ENOENT
- Компонент пути pathname не существует или является повисшей символьной ссылкой.
- ENOTDIR
- Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
- EROFS
- Запрошены права для файла, который находится на файловой системе, смонтированной только для чтения.
access() может завершиться с ошибкой, если:
- EFAULT
- Аргумент pathname указывает за пределы доступного адресного пространства.
- EINVAL
- Аргумент mode был задан неверно.
- EIO
- Произошла ошибка ввода-вывода.
- ENOMEM
- Недостаточное количество памяти ядра.
- ETXTBSY
- Запрошены права на запись для исполняемого файла, который сейчас выполняется.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.3BSD, POSIX.1-2001.ЗАМЕЧАНИЯ
Предупреждение: Использование access() для проверки, например, разрешено ли пользователю открытие файла перед реальным выполнением open(2), создаёт брешь в безопасности, так как пользователь может использовать короткий промежуток времени между проверкой и открытием файла для управления им. По этой причине лучше избегать использования данного системного вызова.
access() возвращает ошибку, если отказано в любом из типов доступа mode, даже если разрешены остальные типы.
Если вызвавший процесс имеет соответствующие привилегии (например, суперпользователя), то POSIX.1-2001 разрешает реализации вернуть успех при проверке X_OK даже, если ни один из битов выполнения файла не установлен. В Linux так не происходит.
Файл доступен только в случае, если для каждого каталога в пути, указанном в pathname, имеется право выполнять поиск (то есть, установлен бит выполнения). Если какой-то каталог недоступен, то вызов access() вернёт ошибку, независимо от имеющихся прав файла.
Проверяются только биты доступа, но не тип файла или его содержимое. Поэтому, если обнаруживается, что в каталог можно писать, то это, вероятно, означает, что в этом каталоге можно создавать файлы, и что в этот каталог нельзя писать как в файл. Также, файл DOS может быть посчитан как "исполняемый", но вызов execve(2) всё-равно не сможет его запустить.
Вызов access() может некорректно работать на файловых системах NFS со включенным преобразованием UID-ов, потому что это преобразование происходит на сервере и спрятано от клиента, который пытается проверить права.
ДЕФЕКТЫ
В ядрах версии 2.4 (и более ранних) есть некоторая странность в работе теста X_OK для суперпользователя. Если для всех категорий право исполнения отключено для файла-не каталога, то тест access() возвращает -1 только когда mode задан как X_OK; если в mode также указан флаг R_OK или W_OK, то access() вернёт для таких файлов 0. Ранние версии ядер 2.6 (до 2.6.3 включительно) ведут себя также как ядра 2.4.В ядрах до версии 2.6.20 вызов access() игнорировал влияние флаг MS_NOEXEC, если он был установлен с помощью mount(2) в содержащей файл файловой системе. Начиная с версия ядра 2.6.20, access() учитывает этот флаг.
СМОТРИТЕ ТАКЖЕ
chmod(2), chown(2), faccessat(2), open(2), setgid(2), setuid(2), stat(2), euidaccess(3), credentials(7), path_resolution(7)
Index
- ИМЯ
- ОБЗОР
- ОПИСАНИЕ
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- ЗАМЕЧАНИЯ
- ДЕФЕКТЫ
- СМОТРИТЕ ТАКЖЕ
This document was created by man2html using the manual pages.
Time: 17:41:29 GMT, May 11, 2012



