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

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

EINVAL
    pgid jest mniejsze niż 0 (setpgid(), setpgrp()).

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

EPERM
    Docelowa grupa procesu nie istnieje. (setpgid(), setpgrp()).

ESRCH
    Dla getpgid(): nie ma procesu o numerze pid. Dla setpgid(): pid nie jest ani procesem wywołującym, ani jego potomkiem.

STANDARDY

getpgid()
setpgid()
getpgrp() (bez argumentów)
    POSIX.1-2024.

setpgrp()
getpgrp() (1 argument)
    Brak.

HISTORIA

getpgid()
setpgid()
getpgrp() (bez argumentów)
    POSIX.1-2001.

setpgrp() (bez argumentów)
    POSIX.1-2001. Oznaczone jako przestarzałe w POSIX.1-2008. Usunięte w POSIX.1-2024.

setpgrp() (2 argumenty)
getpgrp() (1 argument)
    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
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.