fchmod()

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

Прототип:

#include <sys/types.h>
#include <sys/stat.h>
int fchmod( int fd,
mode_t mode );

Аргументы:

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

Библиотека:

libc

Описание:

Функция fchmod() изменяет права доступа для файла, на который ссылается дескриптор fd, в режим, определяемый в mode.

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

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

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

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

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

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

Коды ошибок:

EBADF
Некорректный файловый дескриптор.
ENOSYS
Функция fchmod() не определена для файловой системы, связанной с fd.
EPERM
Эффективный идентификатор пользователя не совпадает с владельцем файла, и вызывающий процесс не имеет соответствующих прав доступа.
EROFS
Файл находится в файловой системе, доступной только для чтения.

Примеры:

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

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

POSIX 1003.1

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

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

struct stat, chmod(), chown(), errno, fchown(), fstat(), open(), stat()




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