Signatur
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
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;
}
}
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;
}
}
// 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.