Signatur
Beschreibung
pcntl_wifcontinued() wertet den Statuswert aus, der von pcntl_waitpid() oder pcntl_wait() zurückgegeben wird, und gibt true zurück, wenn der Kindprozess nach einem zuvor empfangenen Stopp-Signal (z. B. durch SIGSTOP oder SIGTSTP) durch das Signal SIGCONT fortgesetzt wurde.
Die Funktion ist nützlich, wenn ein Elternprozess seinen Kindprozessen gegenüber eine vollständige Job-Control implementiert und dabei unterscheiden möchte, ob ein Statuss-Ereignis ein reguläres Beenden, ein Stoppen oder eben eine Fortsetzung des Kindprozesses darstellt. Typischerweise wird pcntl_waitpid() mit dem Flag WNOHANG | WCONTINUED aufgerufen, damit solche Ereignisse auch gemeldet werden.
Die Funktion entspricht dem POSIX-Makro WIFCONTINUED(status) aus der C-Bibliothek und steht nur auf Betriebssystemen zur Verfügung, die Job-Control unterstützen (z. B. Linux, macOS). Unter Windows ist diese Funktionalität nicht verfügbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $status Pflicht | int | Der Statuswert, der als Referenzparameter von pcntl_waitpid() oder pcntl_wait() befüllt wurde. Er enthält codierte Informationen über den Zustand des Kindprozesses. |
Rückgabewert
true zurück, wenn der Kindprozess durch SIGCONT nach einem Stopp fortgesetzt wurde, andernfalls false.Beispiele
Kindprozess stoppen und fortsetzen, Ereignis im Elternprozess erkennen
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: warte auf Signale
echo "Kind (PID " . getmypid() . ") läuft.\n";
sleep(30);
exit(0);
} else {
// Elternprozess: Kind stoppen
sleep(1);
posix_kill($pid, SIGSTOP);
echo "Kind gestoppt.\n";
sleep(1);
// Kind wieder fortsetzen
posix_kill($pid, SIGCONT);
echo "Kind fortgesetzt.\n";
// Auf das SIGCONT-Ereignis warten
$result = pcntl_waitpid($pid, $status, WNOHANG | WCONTINUED);
if ($result > 0) {
if (pcntl_wifcontinued($status)) {
echo "Kindprozess wurde nach Stopp fortgesetzt (SIGCONT).\n";
} elseif (pcntl_wifstopped($status)) {
echo "Kindprozess ist gestoppt.\n";
} elseif (pcntl_wifexited($status)) {
echo "Kindprozess ist beendet mit Code: " . pcntl_wexitstatus($status) . "\n";
}
} else {
echo "Noch kein Ereignis verfügbar.\n";
}
// Kind sauber beenden
posix_kill($pid, SIGKILL);
pcntl_waitpid($pid, $status);
}
Zustandsmaschine mit vollständigem Statuscheck
<?php
function beschreibeStatus(int $status): string {
if (pcntl_wifexited($status)) {
return 'Beendet mit Code ' . pcntl_wexitstatus($status);
}
if (pcntl_wifsignaled($status)) {
return 'Durch Signal ' . pcntl_wtermsig($status) . ' beendet';
}
if (pcntl_wifstopped($status)) {
return 'Gestoppt durch Signal ' . pcntl_wstopsig($status);
}
if (pcntl_wifcontinued($status)) {
return 'Nach Stopp per SIGCONT fortgesetzt';
}
return 'Unbekannter Status';
}
$pid = pcntl_fork();
if ($pid === 0) {
sleep(10);
exit(0);
} else {
sleep(1);
posix_kill($pid, SIGSTOP);
posix_kill($pid, SIGCONT);
pcntl_waitpid($pid, $status, WCONTINUED);
echo beschreibeStatus($status) . "\n";
posix_kill($pid, SIGKILL);
pcntl_waitpid($pid, $dummy);
}
// Wichtig · Fallstricke
Plattformabhängigkeit: pcntl_wifcontinued() setzt voraus, dass das Betriebssystem und die zugrundeliegende C-Bibliothek die Konstante WCONTINUED und das Makro WIFCONTINUED unterstützen. Unter Linux und macOS ist dies der Fall; unter Windows steht die gesamte pcntl-Erweiterung nicht zur Verfügung.
Flag erforderlich: Damit pcntl_waitpid() überhaupt ein Fortsetzungs-Ereignis zurückmeldet, muss beim Aufruf das Flag WCONTINUED übergeben werden. Ohne dieses Flag wird das Ereignis nicht gemeldet und pcntl_wifcontinued() liefert stets false.
CLI-only: Die pcntl-Erweiterung ist ausschließlich für den Einsatz in CLI-Skripten gedacht und sollte niemals in Web-Server-Kontexten verwendet werden, da Prozesssteuerung dort zu unvorhersehbarem Verhalten führen kann.