Provided by: manpages-ru-dev_4.29.1-1_all 

НАИМЕНОВАНИЕ
chown, fchown, lchown, fchownat - изменяет владельца файла
БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)
ОБЗОР
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);
#include <fcntl.h> /* определения констант of AT_* */
#include <unistd.h>
int fchownat(int dirfd, const char *path,
uid_t owner, gid_t group, int flags);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
fchown(), lchown():
/* Наичная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| _XOPEN_SOURCE >= 500
|| /* Glibc <= 2.19: */ _BSD_SOURCE
fchownat():
Начиная с glibc 2.10:
_POSIX_C_SOURCE >= 200809L
До glibc 2.10:
_ATFILE_SOURCE
ОПИСАНИЕ
Данные системные вызовы изменяют владельца и группу для файла. Системные вызовы chown(), fchown() и
lchown() отличаются только в том, каким образом задается файл:
• chown() changes the ownership of the file specified by path, which is dereferenced if it is a
symbolic link.
• fchown() изменяет владельца для файла, задаваемого открытым файловым дескриптором fd.
• lchown() похож на chown() за исключением того, что он не разыменовывает символьные ссылки.
Только привилегированный процесс (Linux: имеющий мандат CAP_CHOWN) может сменить владельца файла.
Владелец файла может сменить группу файла на любую группу, в которой он числится. Привилегированный
процесс (Linux: с CAP_CHOWN) может задавать произвольную группу.
Если параметр owner или group равен -1, то соответствующий идентификатор не изменяется.
Когда владелец или группа исполняемого файла изменяется непривилегированным пользователем, то биты режима
S_ISUID и S_ISGID сбрасываются В POSIX не указано, должно ли это происходить если chown() выполняется
суперпользователем; поведение в Linux зависит от версии ядра и начиная с Linux 2.2.13, root
рассматривается как обычный пользователь. В случае исполняемого файла вне группы (т. е., у которого не
установлен бит S_IXGRP) бит S_ISGID указывает на обязательную блокировку, и не сбрасывается при
выполнении chown().
Когда владелец или группа исполняемого файла изменяется (любым пользователем), то все наборы мандатов
файла очищаются.
fchownat()
Системный вызов fchownat() работает также как системный вызов chown(), за исключением случаев, описанных
здесь.
If path is relative, then it is interpreted relative to the directory referred to by the file descriptor
dirfd (rather than relative to the current working directory of the calling process, as is done by
chown() for a relative pathname).
If path is relative and dirfd is the special value AT_FDCWD, then path is interpreted relative to the
current working directory of the calling process (like chown()).
If path is absolute, then dirfd is ignored.
Аргумент flags представляет собой битовую маску, создаваемую побитовым сложением (OR) следующих значений;
AT_EMPTY_PATH (начиная с Linux 2.6.39)
If path is an empty string, operate on the file referred to by dirfd (which may have been obtained
using the open(2) O_PATH flag). In this case, dirfd can refer to any type of file, not just a
directory. If dirfd is AT_FDCWD, the call operates on the current working directory. This flag
is Linux-specific; define _GNU_SOURCE to obtain its definition.
AT_SYMLINK_NOFOLLOW
If path is a symbolic link, do not dereference it: instead operate on the link itself, like
lchown(). (By default, fchownat() dereferences symbolic links, like chown().)
Смотрите в openat(2) объяснение необходимости fchownat().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
ОШИБКИ
В зависимости от файловой системы могут также возвращаться другие ошибки, перечисленные далее.
Наиболее распространённые ошибки chown() перечислены далее.
EACCES Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)
EBADF (fchown()) Значение fd не является правильным открытым файловым дескриптором.
EBADF (fchownat()) path is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.
EFAULT Аргумент path указывает за пределы доступного адресного пространства.
EINVAL (fchownat()) Указано неверное значение в flags.
EIO (fchown()) Во время изменения индексного дескриптора (inode) возникла низкоуровневая ошибка
ввода/вывода.
ELOOP Во время определения path встретилось слишком много символьных ссылок.
ENAMETOOLONG
path слишком длинен.
ENOENT Файл не существует.
ENOMEM Недостаточное количество памяти ядра.
ENOTDIR
Компонент в префиксе пути не является каталогом.
ENOTDIR
(fchownat()) path is relative and dirfd is a file descriptor referring to a file other than a
directory.
EPERM Вызывающий процесс не имеет требуемых прав (см. выше), чтобы изменять владельца и/или группу.
EPERM Файл помечен как неизменяемый (immutable) или только для добавления (смотрите
FS_IOC_SETFLAGS(2const)).
EROFS Указанный файл находится на файловой системе, смонтированной только для чтения.
ВЕРСИИ
Версия из 4.4BSD может использоваться только суперпользователем (то есть, обычные пользователи не могут
менять владельцев).
СТАНДАРТЫ
POSIX.1-2024.
ИСТОРИЯ
chown()
fchown()
lchown()
4.4BSD, SVr4, POSIX.1-2001.
fchownat()
POSIX.1-2008. Linux 2.6.16, glibc 2.4.
ПРИМЕЧАНИЯ
Назначение владельца новых файлов
При создании нового файла (например, с помощью open(2) или mkdir(2)), его владельцем будет установлен ID
пользователя из файловой системы создающего процесса. Группа файла зависит от нескольких факторов,
включая тип файловой системы, параметры монтирования и установлен ли бит режима set-group-ID на
родительском каталоге. Если файловая система поддерживает параметры mount(8) -o grpid (тоже что и
-o bsdgroups) и -o nogrpid (тоже что и -o sysvgroups), то правила следующие:
• Если файловая система смонтирована с параметром -o grpid, то группой нового файла будет группа
родительского каталога.
• Если файловая система смонтирована с параметром -o nogrpid и у родительского каталога нет бита
set-group-ID, то группой нового файла будет GID файловой системы того же процесса.
• Если файловая система смонтирована с параметром -o nogrpid и на родительском каталоге установлен бит
set-group-ID, то группой нового файла будет группа родительского каталога.
Начиная с Linux 4.12, параметры монтирования -o grpid и -o nogrpid поддерживаются для ext2, ext3, ext4 и
XFS. Для файловых систем, не поддерживающих эти параметры монтирования, используются правила как для
-o nogrpid.
Замечания по glibc
On older kernels where fchownat() is unavailable, the glibc wrapper function falls back to the use of
chown() and lchown(). When path is relative, glibc constructs a pathname based on the symbolic link in
/proc/self/fd that corresponds to the dirfd argument.
NFS
Семантика chown() сознательно нарушается в файловых системах NFS, в которых включено отображение UID.
Также, нарушается семантика всех системных вызовов, которые обеспечивают доступ к содержимому файлов, так
как chown() может привести к немедленному отзыву доступа к уже открытым файлам. Кэширование на клиентской
стороне может привести к задержке между сменой доступа пользователю и временем, когда файл действительно
станет доступным.
Историческая справка
Первоначальные версии системных вызовов chown(), fchown() и lchown() в Linux поддерживали только
16-битные идентификаторы пользователей и групп. Позднее в Linux 2.4 были добавлены вызовы chown32(),
fchown32() и lchown32(), поддерживающие 32-битные идентификаторы. В glibc обёрточные функции chown(),
fchown() и lchown() работают одинаково вне зависимости от версий ядра.
Before Linux 2.1.81 (except 2.1.46), chown() did not follow symbolic links. Since Linux 2.1.81, chown()
does follow symbolic links, and there is a new system call lchown() that does not follow symbolic links.
Since Linux 2.1.86, this new call (that has the same semantics as the old chown()) has got the same
syscall number, and chown() got the newly introduced number.
ПРИМЕРЫ
Следующая программа изменять владельца файла, указанного вторым в командной строке, на значение,
указанное в первом аргументе командной строки. Новый владелец может задаваться в виде числового
пользовательского ID, или в виде имени пользователя (которое преобразуется в пользовательский ID с
помощью getpwnam(3), выполняющего поиск в системном файле паролей).
Исходный код программы
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
char *endptr;
uid_t uid;
struct passwd *pwd;
if (argc != 3 || argv[1][0] == '\0') {
fprintf(stderr, "%s <owner> <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
uid = strtol(argv[1], &endptr, 10); /* Allow a numeric string */
if (*endptr != '\0') { /* Was not pure numeric string */
pwd = getpwnam(argv[1]); /* Try getting UID for username */
if (pwd == NULL) {
perror("getpwnam");
exit(EXIT_FAILURE);
}
uid = pwd->pw_uid;
}
if (chown(argv[2], uid, -1) == -1) {
perror("chown");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
СМОТРИТЕ ТАКЖЕ
chgrp(1), chown(1), chmod(2), flock(2), path_resolution(7), symlink(7)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>,
Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova
<blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.16 29 октября 2025 г. chown(2)