Man page - setgroups(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro de

Manual

getgroups

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
ВЕРСИИ
Отличия между библиотекой C и ядром
СТАНДАРТЫ
ИСТОРИЯ
ПРИМЕЧАНИЯ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

getgroups, setgroups - получить/установить список дополнительных идентификаторов групп

БИБЛИОТЕКА

Стандартная библиотека языка C ( libc , -lc )

ОБЗОР

#include <unistd.h>

int getgroups(int size , gid_t list []);

#include <grp.h>

int setgroups(size_t size , const gid_t *_Nullable list );

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

setgroups ():
Начиная с glibc 2.19:
_DEFAULT_SOURCE
В версии glibc 2.19 и более ранних:
_BSD_SOURCE

ОПИСАНИЕ

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

Не определено, будет ли в этот список включён эффективный идентификатор группы вызывающего процесса (то есть приложение также должно вызвать getegid (2) и добавить или удалить полученное значение).

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

Вызов setgroups () устанавливает идентификаторы дополнительных групп для вызывающего процесса. Для работы требуются права (смотрите описание ошибки EPERM ниже). В аргументе size задаётся количество дополнительных идентификаторов групп в буфере, указанном list . Процесс может выйти из всех дополнительных группы вызвав:

setgroups(0, NULL);

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

On success, getgroups () returns the number of supplementary group IDs. On error, -1 is returned, and errno is set to indicate the error.

При успешном выполнении setgroups () возвращает 0; при ошибке — -1, а в errno задаётся код ошибки.

ОШИБКИ

EFAULT

Значение list является неправильным адресом.

Вызов getgroups () также может завершиться со следующей ошибкой:

EINVAL

Значение size меньше чем количество дополнительных идентификаторов групп, но не ноль.

Вызов setgroups () также может завершиться со следующими ошибками:

EINVAL

Значение size больше чем NGROUPS_MAX (32, до Linux 2.6.4; 65536, начиная с Linux 2.6.4).

ENOMEM

Не хватает памяти.

EPERM

Вызывающий процесс не имеет достаточно прав (вызывающий не имеет мандата CAP_SETGID в пользовательском пространстве имён, в котором он находится).

EPERM (начиная с Linux 3.19)

Использование setgroups () запрещено в этом пространстве имён user. Смотрите описание /proc/ pid /setgroups в user_namespaces (7).

ВЕРСИИ

Отличия между библиотекой C и ядром

На уровне ядра ID пользователя и группы являются атрибутами нити. Однако в POSIX требуется, чтобы все нити в процессе имели одинаковые права. В реализации нитей NPTL требования POSIX реализованы через обёрточные функции для различных системных вызовов, которые изменяют UID и GID процесса. В этих функциях (включая и для setgroups ()) используется алгоритмы на основе сигналов, которые следят за тем, что когда у одной нити изменяются права, эти изменения выполняются и для остальных нитей процесса. Подробное описание смотрите в nptl (7).

СТАНДАРТЫ

getgroups ()

POSIX.1-2008.

setgroups ()

Отсутствуют.

ИСТОРИЯ

getgroups ()

SVr4, 4.3BSD, POSIX.1-2001.

setgroups ()

SVr4, 4.3BSD. Since setgroups () requires privilege, it is not covered by POSIX.1.

Первоначальная версия системного вызова getgroups () в Linux поддерживала только 16-битные идентификаторы групп. Позднее в Linux 2.4 был добавлен вызов getgroups32 (), поддерживающий 32-битные идентификаторы. В glibc обёрточная функция getgroups () работает одинаково вне зависимости от версий ядра.

ПРИМЕЧАНИЯ

Процесс может иметь, как минимум, NGROUPS_MAX дополнительных идентификаторов групп в дополнении к эффективному идентификатору группы. Константа NGROUPS_MAX определена в <limits.h> . Список дополнительных идентификаторов групп наследуется из родительского процесса и сохраняется при вызове execve (2).

Максимальное количество дополнительных идентификаторов групп можно выяснить с помощью sysconf (3):

long ngroups_max;
ngroups_max = sysconf(_SC_NGROUPS_MAX);

Максимальное значение, возвращаемое getgroups (), не может быть больше чем на единицу значения, полученного данным способом. Начиная с Linux 2.6.4, максимальное количество идентификаторов дополнительных групп также видимо через специальный файл Linux, доступный только для чтения — /proc/sys/kernel/ngroups_max .

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

getgid (2), setgid (2), getgrouplist (3), group_member (3), initgroups (3), capabilities (7), credentials (7)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков .