getgroups(2) System Calls Manual getgroups(2) NUME getgroups, setgroups - obine/stabilete o lista de ID-uri de grupuri suplimentare BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include int getgroups(int size, gid_t list[_Nullable size]); #include int setgroups(size_t size, const gid_t list[size]); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): setgroups(): Incepand cu glibc 2.19: _DEFAULT_SOURCE glibc 2.19 i versiunile anterioare: _BSD_SOURCE DESCRIERE getgroups() returneaza in list ID-urile de grup suplimentare ale procesului apelant. Argumentul size trebuie sa fie definit la numarul maxim de elemente care pot fi stocate in memoria tampon indicata de list. In cazul in care procesul de apelare este membru a mai mult de size grupuri suplimentare, apare o eroare. Nu este specificat daca ID-ul efectiv al grupului procesului apelant este inclus in lista returnata; (astfel, o aplicaie trebuie sa apeleze i getegid(2) i sa adauge sau sa elimine valoarea rezultata). Daca size este zero, list nu este modificat, dar se returneaza numarul total de ID-uri de grup suplimentare pentru proces. Acest lucru permite apelantului sa determine dimensiunea unei liste list alocate dinamic, care va fi utilizata intr-un apel ulterior la getgroups(). setgroups() stabilete ID-urile de grup suplimentare pentru procesul apelant. Sunt necesare privilegii corespunzatoare (a se vedea descrierea erorii EPERM, mai jos). Argumentul size specifica numarul de ID-uri de grup suplimentare din memoria tampon indicata de list. Un proces poate renuna la toate grupurile sale suplimentare odata cu apelul: setgroups(0, (gid_t [0]){}); VALOAREA RETURNATA In caz de succes, getgroups() returneaza numarul de ID-uri de grup suplimentare. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. In caz de succes, setgroups() returneaza 0. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EFAULT list are o adresa nevalida. getgroups() poate eua in plus cu urmatoarea eroare: EINVAL size este mai mic decat numarul de ID-uri de grup suplimentare, dar nu este zero. setgroups() poate eua in plus cu urmatoarele erori: EINVAL size este mai mare decat NGROUPS_MAX (32 inainte de Linux 2.6.4; 65536 incepand cu Linux 2.6.4). ENOMEM Memorie insuficienta. EPERM Procesul apelant are privilegii insuficiente (apelantul nu are capacitatea CAP_SETGID in spaiul de nume al utilizatorului in care se afla). EPERM (incepand cu Linux 3.19) Utilizarea setgroups() este interzisa in acest spaiu de nume de utilizator. A se vedea descrierea /proc/pid/setgroups in user_namespaces(7). VERSIUNI Diferene intre biblioteca C i nucleu La nivelul nucleului, ID-urile de utilizator i ID-urile de grup sunt un atribut pentru fiecare fir de execuie. Cu toate acestea, POSIX impune ca toate firele dintr-un proces sa aiba aceleai credeniale. Implementarea ,,NPTL threading" se ocupa de cerinele POSIX prin furnizarea de funcii de invaluire pentru diferitele apeluri de sistem care modifica UID i GID ale proceselor. Aceste funcii invaluitoare (inclusiv cea pentru setgroups()) utilizeaza o tehnica bazata pe semnale pentru a se asigura ca, atunci cand un fir de execuie ii schimba acreditarile, toate celelalte fire de execuie din proces ii schimba i ele acreditarile. Pentru detalii, a se vedea nptl(7). STANDARDE getgroups() POSIX.1-2024. setgroups() Niciunul. ISTORIC getgroups() 4.3BSD, SVr4, POSIX.1-1988. setgroups() SVr4, 4.3BSD. Deoarece setgroups() necesita privilegii, nu este acoperit de POSIX.1. Apelul de sistem original Linux getgroups() accepta numai ID-uri de grup pe 16 bii. Ulterior, Linux 2.4 a adaugat getgroups32(), care accepta ID-uri pe 32 de bii. Funcia invaluitoare glibc getgroups() trateaza in mod transparent variaia dintre versiunile de kernel. NOTE Un proces poate avea pana la NGROUPS_MAX ID-uri de grup suplimentare in plus faa de ID-ul de grup efectiv. Constanta NGROUPS_MAX este definita in . Setul de ID-uri de grup suplimentare este motenit de la procesul parinte i este pastrat prin intermediul unui execve(2). Numarul maxim de ID-uri de grup suplimentare poate fi aflat in timpul execuiei folosind sysconf(3): long ngroups_max; ngroups_max = sysconf(_SC_NGROUPS_MAX); Valoarea maxima de returnare a lui getgroups() nu poate fi mai mare decat cu unu faa de aceasta valoare. Incepand cu Linux 2.6.4, numarul maxim de ID-uri de grup suplimentare este, de asemenea, expus prin intermediul fiierului de numai citire specific Linux, /proc/sys/kernel/ngroups_max. EXEMPLE #include #include #include #include #include #include #include #define MALLOC(n, T) ((T *) reallocarray(NULL, n, sizeof(T))) static gid_t *agetgroups(size_t *ngids); int main(void) { gid_t *gids; size_t n; gids = agetgroups(&n); if (gids == NULL) err(EXIT_FAILURE, "agetgroups"); if (n != 0) { printf("%jd", (intmax_t) gids[0]); for (size_t i = 1; i < n; i++) printf(" %jd", (intmax_t) gids[i]); } puts(""); free(gids); exit(EXIT_SUCCESS); } static gid_t * agetgroups(size_t *ngids) { int n; gid_t *gids; n = getgroups(0, NULL); if (n == -1) return NULL; gids = MALLOC(n, gid_t); if (gids == NULL) return NULL; n = getgroups(n, gids); if (n == -1) { free(gids); return NULL; } *ngids = n; return gids; } CONSULTAI I getgid(2), setgid(2), getgrouplist(3), group_member(3), initgroups(3), capabilities(7), credentials(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.18 8 februarie 2026 getgroups(2)