chmod()

Изменить права доступа для файла

Прототип:

#include <sys/types.h>
#include <sys/stat.h>
int chmod( const char *path,
mode_t mode );

Аргументы:

path
Имя файла, права доступа которого нужно изменить.
mode
Новые права доступа для файла. Для дополнительной информации смотрите struct stat.

Библиотека:

libc

Описание:

Функция chmod() изменяет S_ISUID, S_ISGID, S_ISVTX и биты прав доступа файла, определяемого path, на соответствующие биты аргумента mode. Приложение должно гарантировать, что эффективный идентификатор пользователя для процесса совпадает с владельцем файла или процесс имеет соответствующие привилегии для этого.

Если директория имеет права на запись и бит S_ISVTX для этой директории установлен, процесс может удалить или переименовать файл внутри данной директории только в случае одного или более условий:

Если директория имеет установленный бит установки для группы, файл, созданный в этой директории, будет иметь тот же идентификатор группы, что и у директории. В ином случае, идентификатор группы созданного файла устанавливается в значение эффективного идентификатора группы процесса, который создал файл.

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

Если эффективный идентификатор пользователя вызывающего процесса совпадает с владельцем файла, либо вызывающий процесс имеет соответствующие права (например, вызывается от лица суперпользователя), chmod() устанавливает S_ISUID, S_ISGID и биты прав доступа файла, определенные в заголовочном файле <sys/stat.h>, из соответствующих битов аргумента mode. Данные биты определяют права доступа для пользователя, связанного с файлом, группы, связанной с файлом, и всех остальных.

Данный вызов не имеет никаких эффектов для файловых дескрипторов файлов, которые уже открыты.

Если chmod() завершен успешно, поле st_ctime файла помечается для обновления.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EACCES
Для части префикса пути отсутствует право на поиск.
ELOOP
Слишком много уровней символических ссылок или префиксов.
ENAMETOOLONG
Длина строки path превышает PATH_MAX или часть пути к файлу длиннее NAME_MAX.
ENOTDIR
Часть префикса пути не является директорией.
ENOENT
Файл не существует, или аргумент path указывает на пустую строку.
ENOSYS
Функция chmod() не реализована для файловой системы, содержащей path.
EPERM
Эффективный идентификатор пользователя не совпадает с владельцем файла и вызывающий процесс не имеет соответствующих привилегий.
EROFS
Файл расположен в файловой системе, доступной только для чтения.

Примеры:

/*
* Change the permissions of a list of files
* to by read/write by the owner only
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main( int argc, char **argv )
{
int i;
int ecode = 0;
for ( i = 1; i < argc; i++ )
{
if ( chmod( argv[i], S_IRUSR | S_IWUSR ) == -1 )
{
perror( argv[i] );
ecode++;
}
}
return (ecode);
}

Классификация:

POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

chown(), errno, fchmod(), fchown(), fstat(), open(), stat()




Предыдущий раздел: Описание API системной библиотеки