Start · Sprachen · PHP · Referenz · pcntl_wtermsig

pcntl_wtermsig

Funktion

Gibt die Signalnummer zurück, die den Tod eines Kindprozesses verursacht hat, basierend auf dem von <code>pcntl_waitpid()</code> gelieferten Statuswert.

seit PHP 4.1.0 Kategorie: misc

Signatur

pcntl_wtermsig(int $status): int

Beschreibung

pcntl_wtermsig() extrahiert aus dem verschlüsselten $status-Wert, den pcntl_waitpid() oder pcntl_wait() liefern, die Nummer des Signals, das den Kindprozess beendet hat. Die Funktion ist nur dann aussagekräftig, wenn zuvor pcntl_wifsignaled() den Wert true zurückgegeben hat – andernfalls ist der Rückgabewert undefiniert.

Typische Signale, die einen Prozess beenden, sind z. B. SIGTERM (15), SIGKILL (9) oder SIGSEGV (11). Mithilfe dieser Funktion kann ein übergeordneter Prozess (Parent) präzise protokollieren oder reagieren, warum ein Kindprozess abrupt endete – etwa um bei einem Segmentation Fault den Fehler zu loggen oder den Prozess neu zu starten.

Die Funktion ist ausschließlich auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) verfügbar und steht unter Windows nicht zur Verfügung. Das PHP-Paket pcntl muss dazu kompiliert worden sein.

Parameter

Name Typ Default Beschreibung
$status Pflicht int Der Statuswert, der als Referenzparameter von pcntl_waitpid() oder pcntl_wait() befüllt wurde. Er ist ein opaker Integer, der mehrere Informationen über den Beendigungsgrund des Kindprozesses kodiert.

Rückgabewert

Typ
int
Beschreibung
Die Signalnummer, die den Kindprozess beendet hat. Der Wert ist nur dann gültig und sinnvoll, wenn pcntl_wifsignaled($status) zuvor true ergeben hat.

Beispiele

Signalnummer eines beendeten Kindprozesses ermitteln

<?php
$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
    // Kindprozess: sendet SIGTERM an sich selbst
    posix_kill(posix_getpid(), SIGTERM);
    exit(0);
} else {
    // Elternprozess: wartet auf Kind
    $exitedPid = pcntl_waitpid($pid, $status);

    if (pcntl_wifsignaled($status)) {
        $signal = pcntl_wtermsig($status);
        echo "Kindprozess {$exitedPid} wurde durch Signal {$signal} beendet." . PHP_EOL;
    } else {
        echo "Kindprozess endete normal." . PHP_EOL;
    }
}
Kindprozess 12345 wurde durch Signal 15 beendet.

Signalnamen über pcntl_signal-Konstanten ausgeben

<?php
$signalNames = [
    SIGHUP  => 'SIGHUP',
    SIGINT  => 'SIGINT',
    SIGQUIT => 'SIGQUIT',
    SIGKILL => 'SIGKILL',
    SIGTERM => 'SIGTERM',
    SIGSEGV => 'SIGSEGV',
];

$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
    // Kindprozess: simuliert einen Absturz per SIGSEGV
    posix_kill(posix_getpid(), SIGSEGV);
    exit(0);
} else {
    pcntl_waitpid($pid, $status);

    if (pcntl_wifsignaled($status)) {
        $sigNum  = pcntl_wtermsig($status);
        $sigName = $signalNames[$sigNum] ?? "Unbekanntes Signal";
        echo "Kind durch Signal {$sigNum} ({$sigName}) beendet." . PHP_EOL;
    }
}
Kind durch Signal 11 (SIGSEGV) beendet.

// Wichtig · Fallstricke

Wichtig: pcntl_wtermsig() darf nur ausgewertet werden, nachdem pcntl_wifsignaled($status) den Wert true zurückgegeben hat. Wird die Funktion auf einen Status angewendet, bei dem das Kind normal (z. B. per exit()) endete, liefert sie einen bedeutungslosen Wert.

Die Funktion steht nur auf POSIX-Systemen (Linux, macOS, BSD) zur Verfügung. Unter Windows ist das pcntl-Modul nicht verfügbar. Für CLI-Anwendungen und Daemon-Prozesse, die Kindprozesse überwachen müssen, ist diese Funktion unerlässlich, um zwischen normalem Exit und signalinduzierten Abbrüchen zu unterscheiden.