Start · Sprachen · PHP · Referenz · pcntl_wifcontinued

pcntl_wifcontinued

Funktion

Prüft anhand eines von <code>pcntl_waitpid()</code> gelieferten Statuswerts, ob ein Kindprozess nach einem Job-Control-Stopp (SIGCONT) fortgesetzt wurde.

seit PHP 5.3.0 Kategorie: misc

Signatur

pcntl_wifcontinued(int $status): bool

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

Typ
bool
Beschreibung
Gibt 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);
}
Kind (PID 12345) läuft. Kind gestoppt. Kind fortgesetzt. Kindprozess wurde nach Stopp fortgesetzt (SIGCONT).

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);
}
Nach Stopp per SIGCONT fortgesetzt

// 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.