Start · Sprachen · PHP · Referenz · posix_setsid

posix_setsid

Funktion

Macht den aktuellen Prozess zum Leiter einer neuen Session und löst ihn von seinem steuernden Terminal.

seit PHP 4.0.0 Kategorie: misc

Signatur

posix_setsid(): int

Beschreibung

posix_setsid() ruft den POSIX-Systemaufruf setsid() auf. Dabei wird eine neue Session erstellt, deren Leiter (Session Leader) der aufrufende Prozess wird. Der Prozess wird außerdem Leiter einer neuen Prozessgruppe und hat kein steuerndes Terminal mehr.

Diese Funktion wird typischerweise beim Erstellen von Daemon-Prozessen eingesetzt. Nach einem fork() ruft der Kindprozess posix_setsid() auf, um sich vollständig vom Elternprozess und vom Terminal zu lösen. Dadurch kann der Kindprozess im Hintergrund weiterlaufen, ohne durch Signale des Terminals (z. B. SIGHUP) beeinflusst zu werden.

Wichtig: Die Funktion schlägt fehl, wenn der aufrufende Prozess bereits Leiter einer Prozessgruppe ist. Aus diesem Grund wird vor dem Aufruf von posix_setsid() in der Regel zunächst ein pcntl_fork() durchgeführt, da der Kindprozess nach dem Fork eine neue PID erhält und damit garantiert kein Prozessgruppenleiter ist.

Diese Funktion steht nur auf POSIX-konformen Systemen (Linux, macOS, BSD) zur Verfügung und ist unter Windows nicht nutzbar.

Rückgabewert

Typ
int
Beschreibung
Gibt die Session-ID der neuen Session zurück (entspricht der PID des aufrufenden Prozesses) bei Erfolg, oder -1 bei einem Fehler (z. B. wenn der Prozess bereits Prozessgruppenleiter ist).

Beispiele

Einfachen Daemon-Prozess per Fork und setsid erstellen

<?php
if (!function_exists('posix_setsid')) {
    die('POSIX-Erweiterung nicht verfügbar.');
}

$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen.');
} elseif ($pid > 0) {
    // Elternprozess beendet sich
    echo "Elternprozess beendet. Kind-PID: $pid\n";
    exit(0);
}

// Kindprozess: neue Session erstellen
$sid = posix_setsid();

if ($sid === -1) {
    die('posix_setsid() fehlgeschlagen.');
}

echo "Neue Session-ID: $sid\n";

// Verzeichnis wechseln, um gemountete Dateisysteme freizugeben
chdir('/');

// Standarddateideskriptoren schließen
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

// Daemon-Logik hier ...
sleep(5);
Elternprozess beendet. Kind-PID: 12345 Neue Session-ID: 12345

Session-ID prüfen und Fehler behandeln

<?php
// Direkt aufgerufen (ohne vorherigen Fork) schlägt setsid fehl,
// wenn der Prozess bereits Prozessgruppenleiter ist.
$sid = posix_setsid();

if ($sid === -1) {
    $error = posix_get_last_error();
    echo 'Fehler: ' . posix_strerror($error) . PHP_EOL;
} else {
    echo 'Session erfolgreich erstellt. Session-ID: ' . $sid . PHP_EOL;
}
Session erfolgreich erstellt. Session-ID: 12346

// Wichtig · Fallstricke

Plattformabhängigkeit: posix_setsid() ist nur auf POSIX-kompatiblen Betriebssystemen verfügbar (Linux, macOS, BSD). Unter Windows ist die Funktion nicht verfügbar.

Prozessgruppenleiter: Der Aufruf schlägt mit -1 fehl, wenn der aufrufende Prozess bereits Leiter einer Prozessgruppe ist. Daher sollte stets zuerst pcntl_fork() aufgerufen werden, um im Kindprozess posix_setsid() sicher nutzen zu können.

Fehlerbehandlung: Den genauen Fehlergrund erhält man über posix_get_last_error() und posix_strerror().