PHP Doku:: Wartet auf ein oder gibt den Status eines abgezweigten Kindes zurück - function.pcntl-waitpid.html

Verlauf / Chronik / History: (41) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzErweiterungen zur ProzesskontrolleProzesskontrollePCNTL Funktionenpcntl_waitpid

Ein Service von Reinhard Neidl - Webprogrammierung.

PCNTL Funktionen

<<pcntl_wait

pcntl_wexitstatus>>

pcntl_waitpid

(PHP 4 >= 4.1.0, PHP 5)

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

Beschreibung

int pcntl_waitpid ( int $pid , int &$status [, int $options ] )

Die Funktion pcntl_waitpid() unterbricht die Ausführung des aktuellen Prozesses bis ein durch den Parameter pid 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 pid 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. Bitte schlagen Sie in der waitpid(2) man Seite Ihres Systems für spezifische Dateils nach, wie waitpid auf Ihrem System arbeitet.

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

Der Wert von pid kann einer der Folgenden sein:
mögliche Werte für pid
< -1 wartet auf einen Kindprozess dessen Prozessgruppen ID gleich dem absoluten Wert von pid ist.
-1 wartet auf einen Kindprozess; dies ist das selbe Verhalten, welches die wait Funktion anbietet.
0 wartet auf einen Kindprozess dessen Prozessgruppen ID gleich dem Wert des aufrufenden Prozesses ist.
> 0 wartet auf das Kind, dessen Prozess ID gleich dem Wert von pid ist.

Hinweis:

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

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().

Der Wert von options ist der Wert von Null oder mehr der mittels OR verknüpften folgenden beiden globalen Konstanten:
mögliche Werte für options
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.

Siehe auch pcntl_fork(), pcntl_signal(), pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() und pcntl_wstopsig().


5 BenutzerBeiträge:
- Beiträge aktualisieren...
brian dot ngure at gmail dot com
8.07.2009 17:03
Please note that you must use bitwise OR | in the following:

"The value of options is the value of zero or more of the following two global constants OR'ed together"

i.e.

WNOHANG | WUNTRACED
tunderzone at gmail dot com
25.06.2009 15:26
A better way to do this and not end up having zombie processes until all child processes ends is like this:

<?php
        $i
= 0;
       
$starttime = microtime(TRUE);
       
$pid_arr = array();
        while (
$i < intval($argv[1]))
        {
           
$pid = pcntl_fork();
            if (
$pid == -1)
            {
                die(
'could not fork');
            }
            else
            {
                if (
$pid) // parent
               
{
                   
$pid_arr[$i] = $pid;
                }
                else
// child
               
{
                   
performSomeFunction($i+1);
                }
            }
           
$i++;
        }

        while(
count($pid_arr) > 0)
        {
               
$myId = pcntl_waitpid(-1, $status, WNOHANG);
                foreach(
$pid_arr as $key => $pid)
                {
                        if(
$myId == $pid) unset($pid_arr[$key]);
                }
               
usleep(100);
        }

       
$elapsed = microtime(TRUE) - $starttime;
        print
"\n==> total elapsed: " . sprintf("%f secs.\n", $elapsed);
?>
saguto dot l7cc at gmail dot com
10.04.2008 6:09
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.
Kevin
11.05.2006 0:40
---
       while ($i < intval($argv[1]))
       {
           $pid = pcntl_fork();
           if ($pid == -1)
           {
               die('could not fork');
           }
           else
           {
               if ($pid) // parent
               {
                   $pid_arr[$i] = $pid;
               }
               else // child
               {
                   performSomeFunction($i+1);
               }
           }
           $i++;
       }
---

careful, this will create a lot more children than you probably expect. You must return or exit after performSomeFunction($i+1); ie,

               else // child
               {
                   performSomeFunction($i+1);
                   exit(0);
               }
admin at albert dot us dot com
6.03.2006 19:48
Here's a decent example of the pcntl_waitpid() call:

        $i = 0;
        $starttime = microtime(TRUE);
        $pid_arr = array();
        while ($i < intval($argv[1]))
        {
            $pid = pcntl_fork();
            if ($pid == -1)
            {
                die('could not fork');
            }
            else
            {
                if ($pid) // parent
                {
                    $pid_arr[$i] = $pid;
                }
                else // child
                {
                    performSomeFunction($i+1);
                }
            }
            $i++;
        }
        foreach ($pid_arr as $pid)
        {
            // we are the parent
            pcntl_waitpid($pid, $status);
        }
        $elapsed = microtime(TRUE) - $starttime;
        print "\n==> total elapsed: " . sprintf("%f secs.\n", $elapsed);



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)