Start · Sprachen · PHP · Referenz · pcntl_wifsignaled

pcntl_wifsignaled

Funktion

Prüft anhand eines Statuscodes, ob ein Kindprozess durch ein nicht abgefangenes Signal beendet wurde.

seit PHP 4.1.0 Kategorie: misc

Signatur

pcntl_wifsignaled(int $status): bool

Beschreibung

pcntl_wifsignaled() analysiert den Statuscode, der von pcntl_wait() oder pcntl_waitpid() zurückgeliefert wurde, und gibt true zurück, wenn der Kindprozess durch ein Signal beendet wurde, das er nicht selbst abgefangen hat (z. B. SIGKILL, SIGSEGV).

Diese Funktion ist essenziell für die Prozessüberwachung in Multiprocessing-Anwendungen. Wenn ein Kindprozess durch ein Signal abgebrochen wurde, sollte der Elternprozess reagieren – beispielsweise durch Protokollierung, Neustart des Kindprozesses oder Weiterleitung des Fehlers.

Um herauszufinden, welches Signal den Abbruch verursacht hat, kann ergänzend pcntl_wtermsig() verwendet werden. Dieses liefert die Signalnummer, die den Prozess beendet hat.

Wichtig: Die Funktion ist nur auf Unix-ähnlichen Systemen verfügbar und erfordert die PHP-Erweiterung pcntl, die standardmäßig nicht in allen PHP-Builds enthalten ist.

Parameter

Name Typ Default Beschreibung
$status Pflicht int Der Statuscode, der als Referenzparameter von pcntl_wait() oder pcntl_waitpid() befüllt wurde. Dieser Rohwert darf nicht manuell gesetzt werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Kindprozess durch ein nicht abgefangenes Signal beendet wurde, andernfalls false.

Beispiele

Kindprozess starten und auf Signal-Abbruch prüfen

<?php
$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
    // Kindprozess: simuliert einen Absturz durch SIGSEGV
    posix_kill(posix_getpid(), SIGSEGV);
    exit(0);
} else {
    // Elternprozess wartet auf das Kind
    $pid = pcntl_wait($status);

    if (pcntl_wifsignaled($status)) {
        $signal = pcntl_wtermsig($status);
        echo "Kindprozess wurde durch Signal {$signal} beendet.\n";
    } else {
        echo "Kindprozess normal beendet.\n";
    }
}
Kindprozess wurde durch Signal 11 beendet.

Mehrere Kindprozesse überwachen und Signal-Abbrüche protokollieren

<?php
$children = [];

for ($i = 0; $i < 3; $i++) {
    $pid = pcntl_fork();
    if ($pid === -1) {
        die('Fork fehlgeschlagen');
    } elseif ($pid === 0) {
        // Kindprozess: erstes Kind wird durch Signal beendet
        if ($i === 0) {
            posix_kill(posix_getpid(), SIGTERM);
        }
        sleep(1);
        exit(0);
    } else {
        $children[] = $pid;
    }
}

foreach ($children as $childPid) {
    pcntl_waitpid($childPid, $status);
    if (pcntl_wifsignaled($status)) {
        $sig = pcntl_wtermsig($status);
        echo "PID {$childPid}: durch Signal {$sig} abgebrochen.\n";
    } else {
        $code = pcntl_wexitstatus($status);
        echo "PID {$childPid}: normal beendet mit Exit-Code {$code}.\n";
    }
}
PID 1234: durch Signal 15 abgebrochen. PID 1235: normal beendet mit Exit-Code 0. PID 1236: normal beendet mit Exit-Code 0.

// Wichtig · Fallstricke

Plattformabhängigkeit: pcntl_wifsignaled() steht nur auf Unix-artigen Betriebssystemen zur Verfügung (Linux, macOS etc.). Unter Windows ist die pcntl-Erweiterung nicht verfügbar.

Achtung: Der $status-Parameter muss direkt von pcntl_wait() oder pcntl_waitpid() stammen. Ein selbst gesetzter oder berechneter Wert liefert unzuverlässige Ergebnisse, da es sich um einen systeminternen Bitfeld-Wert handelt.

Um den vollständigen Prozess-Lebenszyklus korrekt zu prüfen, sollte man pcntl_wifexited(), pcntl_wifsignaled() und pcntl_wifstopped() kombinieren, um alle möglichen Endzustände abzudecken.