Scroll to navigation

CHMOD(2) Руководство программиста Linux CHMOD(2)

ИМЯ

chmod, fchmod - изменить права доступа к файлу

ОБЗОР

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);


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

fchmod():

_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

ОПИСАНИЕ

Данные системные вызовы изменяют права доступа к файлу. Они отличаются только тем, как задан файл:

  • chmod() изменяет права доступа к файлу, заданному параметром path, который разыменовывается, если является символьной ссылкой.
  • fchmod() изменяет права доступа к файлу, на который указывает открытый файловый дескриптор fd.

Новые права файла задаются в переменной mode, которая представляет собой битовую маску, создаваемую побитовым сложением нуля или более следующих констант:

set-user-ID (установить эффективный идентификатор пользователя процесса при execve(2))
set-group-ID (установить эффективный идентификатор группы процесса при execve(2); обязательная блокировка, описывается в fcntl(2); выбрать новую группу файла от родительского каталога, описывается в chown(2) и mkdir(2))
закрепляющий бит (ограничительный флаг удаления, описывается в unlink(2))
владелец может читать
владелец может писать
владелец может выполнять файл или искать в каталоге ("поиск" применим к каталогам и означает, что к элементам внутри каталога есть доступ)
группа-владелец может читать
группа-владелец может писать
группа-владелец может выполнять файл или искать в каталоге
все остальные могут читать
все остальные могут писать
все остальные могут выполнять файл или искать в каталоге

Эффективный идентификатор пользователя (UID) вызывающего процесса должен совпадать с UID владельца файла или процесс должен быть привилегированным (Linux: у него должен быть мандат CAP_FOWNER).

Если вызывающий процесс не является привилегированным (Linux: не имеет мандата CAP_FSETID), а группа-владелец файла не совпадает с эффективным групповым ID процесса или одним из его дополнительных групповых идентификаторов, то бит S_ISGID будет сброшен, но ошибки при этом не возникнет.

В зависимости от файловой системы в целях безопасности биты выполнения set-user-ID и set-group-ID могут сбрасываться при записи в файл. (В Linux это происходит, если записывающий процесс не имеет мандата CAP_FSETID.) В некоторых файловых системах только суперпользователь может устанавливать закрепляющий бит, который может иметь специальное назначение. Значения закрепляющего бита, set-user-ID и set-group-ID для каталогов смотрите в stat(2).

В файловых системах NFS ограничивающие права сразу начинают действовать даже уже на открытые файлы, так как контроль доступа выполняется сервером, но открытые файлы находятся в ведении клиента. Распространение прав может откладываться для других клиентов, если у них установлен атрибут кэширования.

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

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

В зависимости от файловой системы могут также появиться другие ошибки. Общий набор ошибок для chmod() таков:

Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)
Аргумент path указывает за пределы доступного адресного пространства.
Произошла ошибка ввода-вывода.
Во время определения path встретилось слишком много символьных ссылок.
path слишком длинен.
Файл не существует.
Недостаточное количество памяти ядра.
Компонент в префиксе пути не является каталогом.
Эффективный UID не совпадает с идентификатором владельца файла, а процесс не является привилегированным (Linux: не имеет мандата CAP_FOWNER).
Файл находится на файловой системе, смонтированной только для чтения.

Общий набор ошибок для fchmod() таков:

Файловый дескриптор fd не действителен.
См. выше.
См. выше.
См. выше.

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

4.4BSD, SVr4, POSIX.1-2001.

СМОТРИТЕ ТАКЖЕ

chown(2), execve(2), fchmodat(2), open(2), stat(2), path_resolution(7)

2010-09-26 Linux