Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

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

LIBRARY

       Standard C library (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).

СТАНДАРТЫ

       getgroups(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

       setgroups(): SVr4, 4.3BSD. Так как для setgroups()  требуются  права,  она  не  описана  в
       POSIX.1.

ЗАМЕЧАНИЯ

       Процесс  может  иметь,  как  минимум,  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.

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

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

СМ. ТАКЖЕ

       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>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.