.\" -*- coding: UTF-8 -*- .\" Copyright 1993 Rickard E. Faith (faith@cs.unc.edu) .\" and Copyright (C) 2008, 2010, 2015, Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified Thu Oct 31 12:04:29 1996 by Eric S. Raymond .\" Modified, 27 May 2004, Michael Kerrisk .\" Added notes on capability requirements .\" 2008-05-03, mtk, expanded and rewrote parts of DESCRIPTION and RETURN .\" VALUE, made style of page more consistent with man-pages style. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH GETGROUPS 2 "6 марта 2019 г." Linux "Руководство программиста Linux" .SH ИМЯ getgroups, setgroups \- получить/установить список дополнительных идентификаторов групп .SH СИНТАКСИС \fB#include \fP .br \fB#include \fP .PP \fBint getgroups(int \fP\fIsize\fP\fB, gid_t \fP\fIlist\fP\fB[]);\fP \fB#include \fP .PP \fBint setgroups(size_t \fP\fIsize\fP\fB, const gid_t *\fP\fIlist\fP\fB);\fP .PP .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .PP \fBsetgroups\fP(): Начиная с glibc 2.19: _DEFAULT_SOURCE В версии Glibc 2.19 и более ранних: _BSD_SOURCE .SH ОПИСАНИЕ Вызов \fBgetgroups\fP() возвращает идентификаторы дополнительных групп вызывающего процесса в списке \fIlist\fP. В аргументе \fIsize\fP должно быть указано максимальное количество элементов, которые можно сохранить в буфер, указанный в \fIlist\fP. Если вызывающий процесс является членом в более чем \fIsize\fP дополнительных групп, то возвращается ошибка. .PP Не определено, будет ли в этот список включён эффективный идентификатор группы вызывающего процесса (то есть приложение также должно вызвать \fBgetegid\fP(2) и добавить или удалить полученное значение). .PP Если размер \fIsize\fP равен нулю, то список \fIlist\fP не изменяется, а просто возвращается общее количество идентификаторов дополнительных групп процесса. Это позволяет вызывающему определить размер динамически выделяемого списка \fIlist\fP, который будет использоваться при повторном вызове \fBgetgroups\fP(). .PP Вызов \fBsetgroups\fP() устанавливает идентификаторы дополнительных групп для вызывающего процесса. Для работы требуются права (смотрите описание ошибки \fBEPERM\fP ниже). В аргументе \fIsize\fP задаётся количество дополнительных идентификаторов групп в буфере, указанном \fIlist\fP. Процесс может выйти из всех дополнительных группы вызвав: .PP .in +4n .EX setgroups(0, NULL); .EE .in .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBgetgroups\fP() возвращается количество дополнительных идентификаторов. В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в соответствующее значение. .PP При успешном выполнении \fBsetgroups\fP() возвращается 0. В случае ошибки возвращается \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEFAULT\fP Значение \fIlist\fP является неправильным адресом. .PP Вызов \fBgetgroups\fP() также может завершиться со следующей ошибкой: .TP \fBEINVAL\fP Значение \fIsize\fP меньше чем количество дополнительных идентификаторов групп, но не ноль. .PP Вызов \fBsetgroups\fP() также может завершиться со следующими ошибками: .TP \fBEINVAL\fP Значение \fIsize\fP больше чем \fBNGROUPS_MAX\fP (32, до Linux 2.6.4; 65536, начиная с Linux 2.6.4). .TP \fBENOMEM\fP Не хватает памяти. .TP \fBEPERM\fP Вызывающий процесс не имеет достаточно прав (вызывающий не имеет мандата \fBCAP_SETGID\fP в пользовательском пространстве имён, в котором он находится). .TP \fBEPERM\fP (начиная с Linux 3.19) Использование \fBsetgroups\fP() запрещено в этом пространстве имён user. Смотрите описание \fI/proc/[pid]/setgroups\fP в \fBuser_namespaces\fP(7). .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" \fBgetgroups\fP(): SVr4, 4.3BSD, POSIX.1\-2001, POSIX.1\-2008. .PP \fBsetgroups\fP(): SVr4, 4.3BSD. Так как для \fBsetgroups\fP() требуются права, она не описана в POSIX.1. .SH ЗАМЕЧАНИЯ Процесс может иметь, как минимум, \fBNGROUPS_MAX\fP дополнительных идентификаторов групп в дополнении к эффективному идентификатору группы. Константа \fBNGROUPS_MAX\fP определена в \fI\fP. Список дополнительных идентификаторов групп наследуется из родительского процесса и сохраняется при вызове \fBexecve\fP(2). .PP Максимальное количество дополнительных идентификаторов групп можно выяснить с помощью \fBsysconf\fP(3): .PP .in +4n .EX long ngroups_max; ngroups_max = sysconf(_SC_NGROUPS_MAX); .EE .in .PP Максимальное значение, возвращаемое \fBgetgroups\fP(), не может быть больше чем на единицу значения, полученного данным способом. Начиная с Linux 2.6.4, максимальное количество идентификаторов дополнительных групп также видимо через специальный файл Linux, доступный только для чтения — \fI/proc/sys/kernel/ngroups_max\fP. .PP .\" Первоначальная версия системного вызова \fBgetgroups\fP() в Linux поддерживала только 16\-битные идентификаторы групп. Позднее в Linux 2.4 был добавлен вызов \fBgetgroups32\fP(), поддерживающий 32\-битные идентификаторы. В glibc обёрточная функция \fBgetgroups\fP() работает одинаково вне зависимости от версий ядра. .SS "Отличия между библиотекой C и ядром" На уровне ядра ID пользователя и группы являются атрибутами нити. Однако в POSIX требуется, чтобы все нити в процессе имели одинаковые права. В реализации нитей NPTL требования POSIX реализованы через обёрточные функции для различных системных вызовов, которые изменяют UID и GID процесса. В этих функциях (включая и для \fBsetgroups\fP()) используется алгоритмы на основе сигналов, которые следят за тем, что когда у одной нити изменяются права, эти изменения выполняются и для остальных нитей процесса. Подробное описание смотрите в \fBnptl\fP(7). .SH "СМ. ТАКЖЕ" \fBgetgid\fP(2), \fBsetgid\fP(2), \fBgetgrouplist\fP(3), \fBgroup_member\fP(3), \fBinitgroups\fP(3), \fBcapabilities\fP(7), \fBcredentials\fP(7) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Dmitry Bolkhovskikh , Vladislav , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .