pcntl_waitpid

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

pcntl_waitpidWartet auf ein oder gibt den Status eines abgezweigten Kindes zurück

Beschreibung

pcntl_waitpid(
    int $process_id,
    int &$status,
    int $flags = 0,
    array &$resource_usage = []
): int

Unterbricht die Ausführung des aktuellen Prozesses bis ein durch den Parameter process_id angegebenes Kind sich beendet hat oder bis ein Signal ausgeliefert wurde, dessen Aktion den aktuellen Prozess beendet oder eine Signalverabeitungsfunktion aufruft.

Wenn ein Kind, welches durch process_id angefordert wird, sich zum Zeitpunkt des Funktionsaufrufes bereits beendet hat (ein sog. "Zombie" Prozess) kehrt die Funktion umgehend zurück. Alle durch das Kind verwendeten Ressourcen werden freigegeben. Die waitpid(2) Handbuch-Seite des Systems ist bezüglich spezifischer Details, wie waitpid auf dem System arbeitet, zu konsultieren.

Parameter-Liste

process_id

Der Wert von process_id kann einer der Folgenden sein:

Mögliche Werte für process_id
< -1 wartet auf irgendeinen Kindprozess dessen Prozessgruppen ID gleich dem absoluten Wert von process_id ist.
-1 wartet auf irgendeinen Kindprozess; dies ist dasselbe Verhalten, welches die wait Funktion anbietet.
0 wartet auf irgendeinen Kindprozess dessen Prozessgruppen ID gleich dem Wert des aufrufenden Prozesses ist.
> 0 wartet auf das Kind, dessen Prozess ID gleich dem Wert von process_id ist.

Hinweis:

Angeben von -1 für den Parameter process_id ist äquivalent zur Funktionalität der Funktion pcntl_wait() (ohne flags).

status

pcntl_waitpid() speichert Statusinformationen im Parameter status, welcher durch die folgenden Funktionen ausgewertet werden kann: pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() und pcntl_wstopsig().

flags

Der Wert von flags ist der Wert von keiner oder mehr der mittels OR verknüpften folgenden beiden globalen Konstanten:

Mögliche Werte für flags
WNOHANG Kehre umgehend zurück, wenn kein Kind beendet wurde..
WUNTRACED Kehre für Kinder zurück die gestoppt sind und für solche, deren Status nicht gemeldet ist.

Rückgabewerte

pcntl_waitpid() gibt entweder die Prozess ID des Kindes zurück, das beendet wurde, -1 im Fehlerfall, oder 0, wenn WNOHANG verwendet wurde und kein Kind verfügbar war.

Siehe auch

add a note add a note

User Contributed Notes 3 notes

up
3
saguto dot l7cc at gmail dot com
16 years ago
please note, if you using configure option --enable-sigchild(Enable PHP's own SIGCHLD handler) when complie php(under linux 2.6.18-53.1.13.el5.centos.plus and php 5.2.5 as I know), pcntl_waitpid and pcntl_wait in php script would never return the child pid, because the build in handle get it first.
up
0
fx4084 at gmail dot com
10 years ago
<?php
$childs
= array();

// Fork some process.
for($i = 0; $i < 10; $i++) {
   
$pid = pcntl_fork();
    if(
$pid == -1)
        die(
'Could not fork');

    if (
$pid) {
        echo
"parent \n";
       
$childs[] = $pid;
    } else {
       
// Sleep $i+1 (s). The child process can get this parameters($i).
       
sleep($i+1);
       
       
// The child process needed to end the loop.
       
exit();
    }
}

while(
count($childs) > 0) {
    foreach(
$childs as $key => $pid) {
       
$res = pcntl_waitpid($pid, $status, WNOHANG);
       
       
// If the process has already exited
       
if($res == -1 || $res > 0)
            unset(
$childs[$key]);
    }
   
   
sleep(1);
}
?>
up
-1
renmengyang567 at gmail dot com
5 years ago
<?php

declare(ticks = 1);
function
zp_handler($signal) {
   
$id = pcntl_waitpid(-1, $status, WNOHANG);
    if (
pcntl_wifexited($status))
    {
       
printf("Removed Chlid id: %d \n",$id);
       
printf("Chlid status: %d \n",pcntl_wexitstatus($status));
    }
}

//pcntl_signal_dispatch();
pcntl_signal(SIGCHLD, "zp_handler");
//pcntl_signal_dispatch();
//

$pid = pcntl_fork();
if (
$pid == 0)
{
    print
"#1 Hi, I'm child process".PHP_EOL;
   
sleep(3);
    return
10;
}
else
{
    print
"#1parent process id:".$pid.PHP_EOL;
   
$pid = pcntl_fork();
    if (
$pid == 0)
    {   print
"#2 Hi, I'm child process".PHP_EOL;
       
sleep(10);
        exit(
20);
    }
    else
    {
        print
"#2parent process id:".$pid.PHP_EOL;
        for (
$i=0; $i <10 ; $i++) {
            print
"wait..".PHP_EOL;
           
sleep(10);
        }
    }
}
?>
To Top