setpgid(2) Prozessgruppe setzen/holen

Other Alias

getpgid, setpgrp, getpgrp

ÜBERSICHT

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid);
pid_t getpgid(pid_t pid);

pid_t getpgrp(void); /* POSIX.1-Version */
pid_t getpgrp(pid_t pid); /* BSD-Version */

int setpgrp(void); /* System-V-Version */
int setpgrp(pid_t pid, pid_t pgid);  /* BSD-Version */

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

getpgid():

_XOPEN_SOURCE >= 500

    || /* Seit Glibc 2.12: */ _POSIX_C_SOURCE >= 200809L

setpgrp() (POSIX.1):


_XOPEN_SOURCE >= 500
|| /* Seit Glibc 2.19: */ _DEFAULT_SOURCE
|| /* Glibc-Versionen <= 2.19: */ _SVID_SOURCE

setpgrp() (BSD), getpgrp() (BSD):

    [Diese sind nur in Glibc vor 2.19 verfügbar]
    _BSD_SOURCE &&
        ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE ||
            _GNU_SOURCE || _SVID_SOURCE)

BESCHREIBUNG

Alle diese Schnittstellen sind unter Linux verfügbar. Sie werden für das Ermitteln und Setzen der Prozessgruppen-ID (PGID) eines Prozesses verwendet. Die bevorzugten, in POSIX.1 spezifizierten Arten dies zu erledigen sind: getpgrp(void) zum Ermitteln der PGID des aufrufenden Prozesses und setpgid() für das Setzen der PGID eines Prozesses.

setpgid() setzt die PGID des Prozesses pid auf pgid. Falls die pid gleich Null ist, wird die Prozess-ID des aufrufenden Prozesses verwendet. Falls die pgid gleich Null ist, wird PGID des Prozesses pid auf seine Prozess-ID gesetzt. Wenn setpgid() verwendet wird um einen Prozess von einer Prozessgruppe in eine andere zu verschieben (wie das manche Shells tun, wenn Sie Pipelines erzeugen), müssen beide Prozessgruppen Teil der gleichen Sitzung sein (siehe setsid(2) und credentials(7)). In diesem Fall gibt die pgid einer bestehende Prozessgruppe an, deren Mitgliedschaft erworben werden soll, und die Sitzungs-ID dieser Gruppe muss mit der Sitzungs-ID des wechselnden Prozesses übereinstimmen.

Die POSIX.1-Version von getpgrp() erwartet kein Argument und liefert die PGID des aufrufenden Prozesses zurück.

getpgid() gibt die PGID des Prozesses pid zurück. Falls pid gleich Null ist, wird die Prozess-ID des aufrufenden Prozesses verwendet. (Die Ermittlung einer PGID eines anderen Prozesses als des aufrufenden ist selten erforderlich. Für diese Aufgabe wird die POSIX.1-Version von getpgrp() bevorzugt.)

Das System-V-artige setpgrp() erwartet kein Argument und ist äquivalent zu setpgid(0, 0).

Der BSD-spezifische setpgrp()-Aufruf erwartet die Argumente pid und pgid und ruft Folgendes auf:


    setpgid(pid, pgid)

Seit glibc 2.19 wird die BSD-spezifische Funktion setpgrp() nicht mehr in <unistd.h> verwendet. Aufrufe sollten durch den setpgid()-Aufruf ersetzt werden, wie oben gezeigt.

Der BSD-spezifische getpgrp()-Aufruf erwartet ein einzelnes Argument pid und ruft Folgendes auf:


    getpgid(pid)

Seit glibc 2.19 wird die BSD-spezifische Funktion getpgrp() nicht mehr in <unistd.h> verwendet. Aufrufe sollten durch das POSIX-konforme getpgrp() ersetzt werden, welches keine Argumente akzeptiert (falls beabsichtigt ist, die PGID des Aufrufenden zu ermitteln), oder mit dem getpgid()-Aufruf, wie oben gezeigt.

RÜCKGABEWERT

Bei Erfolg geben setpgid() und setpgrp() Null zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

Der POSIX.1-getpgrp() gibt immer die PGID des Aufrufenden zurück.

getpgid() und das BSD-spezifische getpgrp() geben bei Erfolg immer eine Prozessgruppe zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

EACCES
Es wurde versucht, die Prozessgruppen-ID eines der Kinder des aufrufenden Prozesses zu ändern und das Kind hat bereits ein execve(2) durchgeführt (setpgid(), setpgrp()).
EINVAL
pgid ist kleiner als 0 (setpgid(), setpgrp()).
EPERM
Es wurde versucht, einen Prozess in eine Prozessgruppe in einer anderen Sitzung zu verschieben oder die Prozessgruppen-ID eines der Kinder des aufrufenden Prozesses zu ändern und das Kind war in einer anderen Sitzung oder die Prozessgruppen-ID eines »session leaders« zu ändern (setpgid(), setpgrp()).
ESRCH
Für getpgid(): pid passt auf keinen Prozess. Für setpgid(): pid ist nicht der aufrufende Prozess und kein Kind des aufrufenden Prozesses.

KONFORM ZU

setpgid() und die Version von getpgrp() ohne Argumente sind zu POSIX.1-2001 konform.

POSIX.1-2001 spezifiziert auch getpgid() und die Version von setpgrp(), die kein Argument akzeptiert. (In POSIX.1-2008 ist diese setpgrp()-Spezifikation als obsolet markiert.)

Die Version von getpgrp() mit einem Argument und die Version von setpgrp, die zwei Argumente akzeptiert, stammen von 4.2BSD ab und sind nicht in POSIX.1 spezifiziert.

ANMERKUNGEN

Ein mittels fork(2) erstelltes Kind erbt die Prozessgruppen-ID der Eltern. Die PGID wird über ein execve(2) hinweg erhalten.

Jede Prozessgruppe ist Teilnehmer einer Sitzung und jeder Prozess ist Teilnehmer der Sitzung, an der seine Prozessgruppe teilnimmt.

Einer Sitzung kann ein steuerndes Terminal zugeordnet sein. Zu jeder Zeit kann eine (und nur eine) der Prozessgruppen die Vordergrund-Prozessgruppe für das Terminal sein; die verbleibenden Prozessgruppen sind im Hintergrund. Falls vom Terminal ein Signal erzeugt wird (z. B. die Betätigung der Unterbrechungstaste, um ein SIGINT zu bewirken), wird dieses Signal an die Vordergrund-Prozessgruppe gesendet. (Siehe termios(3) für eine Beschreibung der Zeichen, die Signale erzeugen.) Nur die Vordergrund-Prozessgruppe kann vom Terminal lesen (mittels read(2)); wenn das eine Hintergrund-Prozessgruppe versucht, wird an sie ein SIGTSTP-Signal gesendet, das sie »in den Zwangsurlaub schickt«. Die Funktionen tcgetpgrp(3) und tcsetpgrp(3) werden verwendet um die Vordergrund-Prozessgruppe des steuernden Terminals zu ermitteln oder zu setzen.

Die Systemaufrufe setpgid() und getpgrp() werden von Programmen wie der bash(1) zur Erzeugung von Prozessgruppen verwendet um die Shell-Jobs zu steuern.

Falls eine Sitzung über ein steuerndes Terminal verfügt und der Schalter CLOCAL für dieses Terminal nicht gesetzt ist und sich das Terminal aufhängt, wird ein SIGHUP an den »Session Leader« gesendet. Falls der Session Leader sich beendet, wird auch an alle Prozesse in der Vordergrund-Prozessgruppe dieses Terminals ein SIGHUP-Signal gesendet.

Falls die Beendigung des Prozesses eine Prozessgruppe verwaisen lässt und wenn jedes Mitglied der neu verwaisten Prozessgruppe gestoppt wird, wird ein SIGHUP-Signal gefolgt von einem SIGCONT-Signal an jeden Prozess in der neu verwaisten Prozessgruppe gesendet werden. Eine verwaiste Prozessgruppe ist eine, in denen die Eltern eines jeden Mitglieds der Prozessgruppe entweder selbst auch Mitglied der Prozessgruppe oder Mitglied einer Prozessgruppe in einer anderen Sitzung sind (siehe auch credentials(7)).

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <[email protected]>, Helge Kreutzmann <[email protected]>, Martin Eberhard Schauer <[email protected]> und Mario Blättermann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.