setgid -
устанавливает
идентификатор
группы
процесса
Standard C library (
libc,
-lc)
#include <unistd.h>
int setgid(gid_t gid);
Вызов
setgid()
устанавливает
эффективный
идентификатор
группы
вызвавшего
процесса.
Если
вызывающий
процесс
имеет
права
(точнее,
мандат
CAP_SETGID в
своём
пространстве
имён
пользователя),
то также
устанавливаются
действительный
и
сохраненный
идентификаторы
группы.
В Linux
setgid()
реализован
так же, как в
версии POSIX
где есть
возможность
_POSIX_SAVED_IDS. Это
позволяет
set-group-ID-программам
(не
являющимся
программами
суперпользователя)
сбросить
привилегии
группы,
проделать
непривилегированную
работу и
безопасно
вернуть
исходный
эффективный
идентификатор
группы.
On success, zero is returned. On error, -1 is returned, and
errno is set
to indicate the error.
- EINVAL
- Идентификатор
группы,
заданный в
gid,
некорректен
в этом
пользовательском
пространстве
имён.
- EPERM
- У
вызвавшего
процесса
нет прав
(не имеет
мандата CAP_SETGID
в его
пользовательском
пространстве
имён) и gid не
совпадает
с
эффективным
идентификатором
группы или
сохраненным
set-group-ID
идентификатором
группы
вызывающего
процесса.
POSIX.1-2001, POSIX.1-2008, SVr4.
Первоначальная
версия
системного
вызова
setgid() в
Linux
поддерживала
только
16-битные
идентификаторы
групп.
Позднее в Linux 2.4
был
добавлен
вызов
setgid32(),
поддерживающий
32-битные
идентификаторы.
В glibc
обёрточная
функция
gsetgid()
работает
одинаково
вне
зависимости
от версий
ядра.
На уровне
ядра ID
пользователя
и группы
являются
атрибутами
нити.
Однако в POSIX
требуется,
чтобы все
нити в
процессе
имели
одинаковые
права. В
реализации
нитей NPTL
требования
POSIX
реализованы
через
обёрточные
функции
для
различных
системных
вызовов,
которые
изменяют UID и
GID процесса. В
этих
функциях
(включая и
для
setgid())
используется
алгоритмы
на основе
сигналов,
которые
следят за
тем, что
когда у
одной нити
изменяются
права, эти
изменения
выполняются
и для
остальных
нитей
процесса.
Подробное
описание
смотрите в
nptl(7).
getgid(2),
setegid(2),
setregid(2),
capabilities(7),
credentials(7),
user_namespaces(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexander Golubev <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]