Signatur
Beschreibung
posix_setpgid() weist dem Prozess mit der angegebenen PID ($process_id) eine neue Prozessgruppen-ID ($process_group_id) zu. Diese Funktion entspricht dem POSIX-Systemaufruf setpgid(2) und wird primär für die Job-Kontrolle in Unix-artigen Betriebssystemen verwendet, beispielsweise in Shell-Implementierungen oder Prozess-Managern.
Wird $process_id auf 0 gesetzt, bezieht sich die Funktion auf den aufrufenden Prozess selbst. Wird $process_group_id auf 0 gesetzt, wird die PID des angegebenen Prozesses als neue Prozessgruppen-ID verwendet, wodurch eine neue Prozessgruppe mit dem Prozess als Gruppenführer (Process Group Leader) entsteht.
Typische Einsatzgebiete sind das Erstellen von Daemon-Prozessen, das Isolieren von Kind-Prozessen in eigene Prozessgruppen (z. B. um Signale gezielt an eine Gruppe zu senden) sowie die Implementierung von Job-Kontrolle in Prozess-Verwaltungssoftware. Die Funktion steht nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) zur Verfügung und ist unter Windows nicht verfügbar.
Ein Prozess kann nur seine eigene PGID oder die PGID von Kind-Prozessen ändern, solange diese noch keinen exec()-Aufruf durchgeführt haben. Fehler – etwa mangelnde Berechtigung oder eine ungültige PID – führen zur Rückgabe von false; der genaue Fehlergrund lässt sich anschließend mit posix_get_last_error() und posix_strerror() ermitteln.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $process_id Pflicht | int | Die PID des Prozesses, dessen Prozessgruppen-ID geändert werden soll. Der Wert 0 verweist auf den aktuell ausführenden Prozess. |
|
| $process_group_id Pflicht | int | Die neue Prozessgruppen-ID. Der Wert 0 setzt die PGID des Prozesses auf seine eigene PID, sodass er zum Gruppenführer einer neuen Prozessgruppe wird. |
Rückgabewert
true bei Erfolg zurück, andernfalls false. Im Fehlerfall kann der genaue POSIX-Fehlercode über posix_get_last_error() abgerufen werden.Beispiele
Aktuellen Prozess zur eigenen Prozessgruppe machen
<?php
// Den aktuellen Prozess zum Gruppenführer einer neuen Prozessgruppe ernennen
$pid = posix_getpid();
if (posix_setpgid(0, 0)) {
echo "Prozess {$pid} ist jetzt Gruppenführer der Prozessgruppe: " . posix_getpgrp() . PHP_EOL;
} else {
$errno = posix_get_last_error();
echo "Fehler: " . posix_strerror($errno) . PHP_EOL;
}
Kind-Prozess in eigene Prozessgruppe verschieben
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die("Fork fehlgeschlagen");
} elseif ($pid === 0) {
// Kind-Prozess: eigene Prozessgruppe erstellen
if (posix_setpgid(0, 0)) {
$childPid = posix_getpid();
$childPgid = posix_getpgrp();
echo "Kind-Prozess PID={$childPid} ist nun in eigener Prozessgruppe PGID={$childPgid}" . PHP_EOL;
} else {
echo "Fehler im Kind: " . posix_strerror(posix_get_last_error()) . PHP_EOL;
}
exit(0);
} else {
// Eltern-Prozess wartet auf Kind
pcntl_wait($status);
echo "Eltern-Prozess (PID=" . posix_getpid() . ") hat gewartet." . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformverfügbarkeit: posix_setpgid() steht nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) zur Verfügung. Unter Windows ist die Funktion nicht vorhanden; ein Aufruf führt zu einem fatalen Fehler.
Berechtigungen: Ein Prozess kann nur die eigene PGID oder die PGID von unmittelbaren Kind-Prozessen ändern, sofern diese noch keinen exec()-Aufruf durchgeführt haben. Versuche, die PGID fremder Prozesse zu ändern, schlagen mit EPERM fehl.
Session-Führerschaft: Ein Prozess, der der Sitzungsführer (Session Leader) ist, kann seine eigene PGID nicht mehr ändern. In solchen Fällen liefert die Funktion ebenfalls false.
Zur Fehlerdiagnose empfiehlt sich stets die Kombination aus posix_get_last_error() und posix_strerror().