Scroll to navigation

setpgid(2) System Calls Manual setpgid(2)

NAZWA

setpgid, getpgid, setpgrp, getpgrp - pobiera/ustawia grupę procesów

BIBLIOTEKA

Standardowa biblioteka C (libc, -lc)

SKŁADNIA

#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 */

Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

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)

OPIS

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.

WARTOŚĆ ZWRACANA

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.

BŁĘDY

Nastąpiła próba zmiany identyfikatora grupy procesów dla jednego z procesów potomnych procesu wywołującego funkcję, zaś ów proces potomny wykonał już execve(2) (setpgid, setpgrp).
pgid jest mniejsze niż 0 (setpgid(), setpgrp()).
Nastąpiła próba przeniesienia procesu do grupy procesów należącej do innej sesji, lub próba zmiany identyfikatora grupy procesów dla jednego z procesów potomnych procesu wywołującego funkcję, zaś ów proces potomny należy do innej sesji, lub próba zmiany identyfikatora grupy procesów dla przywódcy sesji (setpgid(), setpgrp()).
Docelowa grupa procesu nie istnieje. (setpgid(), setpgrp()).
Dla getpgid(): nie ma procesu o numerze pid. Dla setpgid(): pid nie jest ani procesem wywołującym, ani jego potomkiem.

STANDARDY

POSIX.1-2008 (lecz zob. HISTORIA).
Brak.

HISTORIA

POSIX.1-2001.
POSIX.1-2001. POSIX.1-2008 oznacza je jako przestarzałe.
4.2BSD.

UWAGI

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)).

ZOBACZ TAKŻE

getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), credentials(7)

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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.8