| setpgid(2) | System Calls Manual | setpgid(2) |
setpgid, getpgid, setpgrp, getpgrp - pobiera/ustawia grupę procesów
Standardowa biblioteka C (libc, -lc)
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid); pid_t getpgid(pid_t pid);
pid_t getpgrp(void); /* wersja POSIX.1 */ [[deprecated]] pid_t getpgrp(pid_t pid); /* wersja BSD */
int setpgrp(void); /* wersja Systemu V */ [[deprecated]] int setpgrp(pid_t pid, pid_t pgid); /* wersja BSD */
getpgid():
_XOPEN_SOURCE >= 500
|| /* Od glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
setpgrp() (POSIX.1):
_XOPEN_SOURCE >= 500
|| /* Od glibc 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE
setpgrp() (BSD), getpgrp() (BSD):
[Poniższe są dostępne wyłącznie przed glibc 2.19]
_BSD_SOURCE &&
! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE
|| _GNU_SOURCE || _SVID_SOURCE)
Wszystkie te interfejsy są dostępne w Linuksie i służą do pobierania i ustawiania identyfikatora grupy procesu (process group ID — PGID). Preferowanymi, określonymi przez POSIX.1 sposobami są: getpgrp(void) do pobierania PGID procesu wywołującego oraz setpgid() do ustawiania PGID procesu.
setpgid() ustawia PGID procesu określonego przez pid na pgid. Jeśli pid jest zerem, to używany jest PGID procesu wywołującego. Jeśli pgid jest zerem, to PGID procesu określonego przez pid staje się taki sam, jak jego identyfikator procesu. Jeśli setpgid() jest używane do przeniesienia procesu z jednej grupy procesów do innej (jak to robią niektóre powłoki podczas tworzenia potoków), to obie grupy procesów muszą należeć do tej samej sesji (zob. setsid(2) i credentials(7)). W tym przypadku pgid określa istniejącą grupę procesów, do której zostanie przyłączony proces i numer sesji dla tej grupy musi być taki sam, jak numer sesji dla przyłączanego procesu.
Wersja POSIX.1 getpgrp(), która nie przyjmuje żadnych argumentów, zwraca PGID procesu wywołujacego.
getpgid zwraca PGID procesu określonego przez pid. Jeśli pid jest zerem, to używany jest identyfikator procesu, procesu wywołującego (pobieranie PGID procesu innego niż wywołujący jest rzadko potrzebne i do tego celu preferowany jest getpgrp() POSIX.1).
Wywołanie setpgrp() w stylu Systemu V, które nie przyjmuje argumentów, jest równoważne setpgid(0, 0).
Specyficzne dla BSD wywołanie setpgrp(), które przyjmuje argumenty pid i pgid, jest funkcją opakowującą, która wywołuje
setpgid(pid, pgid)
Od glibc 2.19, specyficzna dla BSD funkcja setpgrp() nie jest już ujawniana przez <unistd.h>; wywołania powinny być zastąpione wywołaniem setpgid(), o którym mowa wyżej.
Specyficzne dla BSD wywołanie getpgrp(), które przyjmuje argument pid, jest funkcją opakowującą, która wywołuje
getpgid(pid)
Od glibc 2.19, specyficzna dla BSD funkcja getpgrp() nie jest już ujawniana przez <unistd.h>; wywołania powinny być zastąpione wywołaniem getpgrp() POSIX.1, nieprzyjmującym argumentów (jeśli chce się pozyskać PGID wywołującego) lub wywołaniem getpgid(), o którym mowa wyżej.
Po pomyślnym zakończeniu setpgid() i setpgrp() zwracają zero. W przypadku błędu zwracane jest -1 i ustawiane errno wskazując błąd.
getpgrp POSIX.1 zawsze zwraca PGID wywołującego.
getpgid() i specyficzne dla BSD getpgrp() po pomyślnym zakończeniu zwracają grupę procesów. W przypadku błędu zwracane jest -1 i ustawiane errno wskazując błąd.
Potomek utworzony przez fork(2) dziedziczy identyfikator grupy procesu od swojego rodzica. Wartość PGID jest także zachowywana podczas execve(2).
Każda grupa procesów należy do pewnej sesji i każdy proces należy do sesji, do której należy jego grupa procesów (zob. credentials(7)).
Sesja może mieć terminal kontrolujący. W każdym czasie jedna (i tylko jedna) z grup procesów w sesji, może być pierwszoplanową grupą procesu dla terminala; pozostałe grupy procesu są w tle. Jeśli z terminala wygenerowany zostanie sygnał (np. przez wpisanie klucza przerwania, generującego sygnał SIGINT), to sygnał ten trafia to pierwszoplanowej grupy procesu (opis znaków generujących sygnały zawarto w podręczniku termios(3)). Jedynie pierwszoplanowa grupa procesu może czytać (read(2)) z terminala, jeśli grupa procesu tła spróbuje dokonać odczytu (read(2)) z terminala, to do grupy wysyłany jest sygnał ją zawieszający — SIGTTIN. Do pobierania/ustawiania pierwszoplanowej grupy procesu terminala kontrolującego służą funkcje tcgetpgrp(3) i tcsetpgrp(3).
Wywołania setpgid() i getpgrp() są używane przez programy takie jak bash(1), do utworzenia grupy procesu w celu zaimplementowania kontroli zadań powłoki.
Jeśli przerwanie procesu spowoduje, że grupa procesów stanie się osierocona, a wszystkie procesy nowoosieroconej grupy będą zatrzymane, to do każdego z nich zostanie wysłany sygnał SIGHUP, po którym nastąpi wysłanie sygnału SIGCONT. Osierocona grupa procesów to taka, w której rodzicem każdego członka grupy procesów jest również członek grupy procesów lub członek grupy procesów w innej sesji (zob. też credentials(7)).
getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), credentials(7)
Tłumaczenie niniejszej strony podręcznika: 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 |