getgroups(2) System Calls Manual getgroups(2)

getgroups, setgroups - pobiera/ustawia listę identyfikatorów grup dodatkowych

Standardowa biblioteka 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);
Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

setgroups():

    Od glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 i wcześniejsze:
        _BSD_SOURCE

getgroups() zwraca w list identyfikatory grup dodatkowych dla wywołującego procesu. Argument size powinien być ustawiony na maksymalną liczbę elementów, jakie mogą być przechowywane w buforze, na który wskazuje list. Jeśli wywołujący proces jest członkiem więcej niż size grup dodatkowych, wystąpi błąd.

Nie jest określone, czy efektywny ID grupy procesu wywołującego będzie znajdować się na zwróconej liście (zatem aplikacja powinna wywołać również getegid(2) i dodać lub usunąć otrzymaną wartość).

Jeśli size jest równe zero, to list nie jest modyfikowane, lecz zwracana jest ogólna liczba dodatkowych grup procesu. Pozwala to wywołującemu określić rozmiar dynamicznie przydzielanej list, do użycia w kolejnych wywołaniach do getgroups(2).

setgroups() ustawia identyfikatory grup dodatkowych procesu wywołującego. Konieczne są odpowiednie przywileje (zob. opis błędu EPERM poniżej). Argument size określa liczbę identyfikatorów grup dodatkowych w buforze, na który wskazuje list. Proces może porzucić wszystkie swoje grupy dodatkowe poniższym wywołaniem:


setgroups(0, NULL);

Po pomyślnym zakończeniu getgroups() zwraca liczbę grup dodatkowych. Po błędzie zwracane jest -1 i ustawiane errno wskazując błąd.

Po pomyślnym zakończeniu setgroups() zwraca zero. Po błędzie zwracane jest -1 i ustawiane errno wskazując błąd.

list ma nieprawidłowy adres.

getgroups() może dodatkowo zawieść z następującym błędem:

size jest mniejsze niż liczba grup dodatkowych, ale niezerowe.

setgroups() może dodatkowo zawieść z następującymi błędami:

size jest większe niż NGROUPS_MAX (32 przed Linuksem 2.6.4; 65536 od Linuksa 2.6.4).
Brak pamięci.
Proces wywołujący ma niewystarczające przywileje (wywołujący nie posiada przywileju (ang. capability) CAP_SETGID w przestrzeni nazw użytkownika, w której występuje).
Odmówiono użycia setgroups() w tej przestrzeni nazw użytkownika. Więcej informacji w opisie /proc/pid/setgroups w user_namespaces(7).

Na poziomie jądra, identyfikatory użytkownika i grupy są atrybutami przynależnymi wątkowi. Jednak POSIX wymaga, aby wszystkie wątki procesu dzieliły te same poświadczenia. Implementacja wątkowania NPTL obsługuje wymagania POSIX za pomocą funkcji opakowujących dla różnych wywołań systemowych zmieniających UID-y i GID-y procesów. Te funkcje opakowujące (w tym te dla setgroups()) wykorzystują technikę opartą na sygnałach aby zapewnić, że gdy jeden wątek zmieni swe poświadczenia, wszystkie inne wątki procesu również to uczynią. Więcej szczegółów w podręczniku nptl(7).

POSIX.1-2008.
Brak.

SVr4, 4.3BSD, POSIX.1-2001.
SVr4, 4.3BSD. Ponieważ setgroups() wymaga przywileju, nie jest opisana w POSIX.1.

Pierwotne linuksowe wywołania systemowe getgroups() obsługiwały jedynie 16-bitowe identyfikatory grup. Następnie, w Linuksie 2.4 dodano getgroups32(), obsługujące identyfikatora 32-bitowe. Funkcja opakowująca getgroups() biblioteki glibc obsługuje te warianty pomiędzy wersjami jądra w sposób przezroczysty.

Proces może posiadać maksymalnie NGROUPS_MAX grup dodatkowych oprócz efektywnego ID grupy. Stała NGROUPS_MAX jest definiowana w <limits.h>. Zbiór grup dodatkowych jest dziedziczony po procesie rodzicielskim i jest zachowywany na przestrzeni execve(2).

Maksymalna liczba grup dodatkowych może być odnaleziona w czasie uruchomienia za pomocą sysconf(3):


long ngroups_max;
ngroups_max = sysconf(_SC_NGROUPS_MAX);

Maksymalna zwracana wartość getgroups() nie może być większa od powyższej. Od Linuksa 2.6.4, maksymalna liczba grup dodatkowych jest również ujawniana w typowo linuksowym pliku tylko do odczytu: /proc/sys/kernel/ngroups_max.

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

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.

2 maja 2024 r. Linux man-pages 6.9.1