| credentials(7) | Miscellaneous Information Manual | credentials(7) |
credentials - identyfikatory procesu
Każdy proces posiada unikatowy identyfikator będący liczbą nieujemną, który jest mu przypisywany w trakcie tworzenia procesu za pomocą fork(2). Proces może pozyskać swój PID wywołaniem getpid(2). PID jest reprezentowany za pomocą typu pid_t (zdefiniowanego w <sys/types.h>).
PID-y są używane w wielu wywołaniach systemowych, do identyfikacji procesu, którego dotyczy wywołanie np. kill(2), ptrace(2), setpriority(2), setpgid(2), setsid(2), sigqueue(3) i waitpid(2).
PID procesu jest zachowywany przez execve(2).
Identyfikator procesu macierzystego (ang. parent process ID — PPID) identyfikuje proces, który utworzył dany proces za pomocą fork(2). Proces może uzyskać swój PPID wywołaniem getppid(2). PPID jest reprezentowany za pomocą typu pid_t.
PPID procesu jest zachowywany przez execve(2).
Każdy proces posiada identyfikator sesji oraz identyfikator grupy procesu, oba reprezentowane za pomocą typu pid_t. Proces może uzyskać swój identyfikator sesji wywołaniem getsid(2), a swój identyfikator grupy procesu wywołaniem getpgrp(2).
Proces potomny utworzony przez fork(2) dziedziczy identyfikator sesji oraz identyfikator grupy procesu swojego procesu macierzystego. Identyfikator sesji procesu oraz identyfikator grupy procesu są zachowywane przez execve(2).
Sesje i grupy procesów są abstrakcjami pomyślanymi jako wsparcie kontroli pracy powłoki. Grupa procesu (czasem nazywana „zadaniem” — ang. „job”) jest zbiorem procesów dzielących ten sam identyfikator grupy procesu; powłoka tworzy nową grupę procesu procesowi/procesom użytym do wykonania pojedynczego polecenia lub potoku (np. dwa procesy tworzone do wykonania polecenia „ls | wc” są umieszczane w tej samem grupie procesu). Członkostwo w grupie procesu można ustawić wywołaniem setpgid(2). Proces, którego PID jest taki sam jak jego identyfikator grupy procesu jest liderem grupy procesu dla danej grupy.
Sesja jest zbiorem procesów dzielących ten sam identyfikator sesji. Wszyscy członkowie grupy procesu mają również ten sam identyfikator sesji (tj. wszyscy członkowie grupy procesu zawsze przynależą do tej samem sesji, zatem sesje i grupy procesu stanowią ścisłą, dwustopniową hierarchię procesów). Nową sesję tworzy wywołanie przez proces setsid(2), co powoduje utworzenie sesji z identyfikatorem sesji takim samym, jak PID procesu wywołującego setsid(2). Twórca sesji jest nazywany liderem sesji.
Wszystkie procesy w sesji dzielą terminal kontrolujący. Termin kontrolujący jest ustanawiany, gdy lider sesji otworzy pierwotnie terminal (chyba że podano znacznik O_NOCTTY przy wywołaniu open(2)). Terminal może być terminalem kontrolującym co najwyżej jednej sesji.
Maksymalne jedno zadanie w powłoce może być zadaniem pierszoplanowym; pozostałe zadania w powłoce są zadaniami tła. Z terminala może czytać jedynie zadanie pierwszoplanowe; gdy proces w tle spróbuje odczytać z terminala, jego grupa procesu otrzymuje sygnał SIGTTIN, zawieszający zadanie. Gdy dla terminala ustawi się znacznik TOSTOP (zob. termios(3)), to tylko zadania pierwszoplanowe mogą pisać do terminala; zapisy od zadań tła spowodują wygenerowanie sygnału SIGTTOU, zawieszającego zadanie. Gdy użyje się klawiszy terminala do wygenerowania sygnału (np. klawisz przerwania, zwykle control-C), sygnał jest wysyłany do procesów będących zadaniem pierwszoplanowym.
Istnieje wiele wywołań systemowych i funkcji bibliotecznych, które mogą działać na wszystkich członkach grupy procesu, są to m.in kill(2), killpg(3), getpriority(2), setpriority(2), ioprio_get(2), ioprio_set(2), waitid(2) i waitpid(2). Zob. też opis operacji F_GETOWN, F_GETOWN_EX, F_SETOWN i F_SETOWN_EX w podręczniku fcntl(2).
Każdy proces ma wiele powiązanych identyfikatorów użytkownika i grupy. Identyfikatory te są liczbami, reprezentowanymi za pomocą typów, odpowiednio, uid_t i gid_t (zdefiniowanych w <sys/types.h>).
W Linuksie, każdy proces ma następujące identyfikatory użytkownika i grupy:
Proces potomny utworzony wywołaniem fork(2) dziedziczy kopie identyfikatorów użytkownika i grupy swojego procesu macierzystego. Podczas execve(2) zachowywane są rzeczywiste identyfikatory użytkownika i grupy procesu, a także identyfikatory grup uzupełniających; natomiast identyfikatory efektywne i zapisane suid/sgid można zmieniać, zgodnie z opisem w execve(2).
Oprócz przeznaczenia opisanego wyżej, identyfikatory użytkownika procesu są używane również w wielu innych sytuacjach:
Zgodnie z zasadami opisanymi we właściwych podręcznikach systemowych, proces może użyć następujących interfejsów programistycznych w celu modyfikacji swoich identyfikatorów użytkownika i grupy:
Wszelkie zmiany w identyfikatorach efektywnych użytkownika (grupy) procesu są automatycznie przenoszone na identyfikatory użytkownika (grupy) systemu plików procesu. Zmiany w identyfikatorach efektywnych użytkownika (grupy) procesu mogą również wpływać na atrybut procesu „zrzucalności” (ang. „dumpable”), zgodnie z opisem w podręczniku prctl(2).
Zmiany identyfikatorów efektywnych użytkownika (grupy) procesu mogą wpłynąć na jego przywileje, zgodnie z opisem w podręczniku capabilities(7).
Identyfikatory: procesu, procesu macierzystego, grupy procesu oraz sesji są określone w normie POSIX.1. Identyfikatory użytkownika i grupy: rzeczywiste, efektywne, zapisane suid/sgid są określone w POSIX.1.
Identyfikatory użytkownika i grupy systemu plików są rozszerzeniem Linuksa.
Różne pola w pliku /proc/pid/status ukazują opisane wyżej poświadczenia procesu. Więcej informacji w podręczniku systemowym proc(5).
Standard wątków określony przez POSIX wymaga, aby poświadczenia były dzielone przez wszystkie wątki procesu. Na poziomie jądra, Linux zarządza jednak osobnymi poświadczeniami użytkownika i grupy dla każdego wątku. Implementacja wątkowania NPTL czyni pewne starania aby zapewnić, że wszelkie zmiany poświadczeń użytkownika lub grupy (np. wywołania do setuid(2), setresuid(2)) są przenoszone na wszystkie wątki POSIX procesu. Więcej szczegółów w podręczniku nptl(7).
bash(1), csh(1), groups(1), id(1), newgrp(1), ps(1), runuser(1), setpriv(1), sg(1), su(1), access(2), execve(2), faccessat(2), fork(2), getgroups(2), getpgrp(2), getpid(2), getppid(2), getsid(2), kill(2), setegid(2), seteuid(2), setfsgid(2), setfsuid(2), setgid(2), setgroups(2), setpgid(2), setresgid(2), setresuid(2), setsid(2), setuid(2), waitpid(2), euidaccess(3), initgroups(3), killpg(3), tcgetpgrp(3), tcgetsid(3), tcsetpgrp(3), group(5), passwd(5), shadow(5), capabilities(7), namespaces(7), path_resolution(7), pid_namespaces(7), pthreads(7), signal(7), system_data_types(7), unix(7), user_namespaces(7), sudo(8)
Tłumaczenie niniejszej strony podręcznika: 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 |