pcntl_waitpid

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

pcntl_waitpidBir çocuk sürecin çıkmasını bekler ve durum kodunu döndürür

Açıklama

pcntl_waitpid(
    int $pid,
    int &$durum,
    int $seçenekler = 0,
    array &$rusage = ?
): int

pid ile belirtilen çocuk süreç çıkana veya sonlandırıcı bir sinyal alana ya da bir sinyal eylemcisi çağrılana kadar çalışmakta olan sürecin çalışmasını askıya alır.

pid ile belirtilen çocuk zaten çıkmışsa (yani bir zombi süreçse) işlev beklemeden döner. Çocuk sürecin kullandığı sistem özkaynakları serbest bırakılır. Sisteminizde waitpid'in nasıl çalıştığı hakkında ayrıntılı bilgi edinmek için waitpid(2) kılavuz sayfasına bakınız.

Değiştirgeler

pid

pid değeri şunlardan biri olabilir:

pid için olası değerler
< -1 Süreç grup kimliği pid'in mutlak değeriyle eşleşen çocuk süreç için beklenir.
-1 Herhangi bir çocuk süreç için beklenir; bu, wait işlevinin davranışıyla aynıdır.
0 Süreç grup kimliği çağıran sürecinkiyle aynı olan çocuk süreç için beklenir.
> 0 Süreç grup kimliği pid ile eşleşen çocuk süreç için beklenir.

Bilginize:

pid değiştirgesine -1 belirtmek, (seçenekler haricinde) pcntl_wait() işlevselliğine denktir.

durum

pcntl_waitpid() işlevi durum değiştirgesinde şu işlevler ile değerendirilmek üzere durum bilgisini saklar: pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() ve pcntl_wstopsig().

seçenekler

Değeri aşağıdaki küresel sabitlerin bitsel VEYAlanmışıdır:

Olasıseçenekler
WNOHANG Çıkmış çocuk süreç yoksa hemen dön.
WUNTRACED Durumu raporlanmamış ve durmuş çocuklar varsa dön.

rusage

Dönen Değerler

Çocuk süreç çıkmışsa süreç kimliği, hata oluşmuşsa -1, WNOHANG kullanılmış ama ortada bir çocuk süreç yoksa 0 ile döner.

Ayrıca Bakınız

add a note add a note

User Contributed Notes 3 notes

up
2
fx4084 at gmail dot com
9 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
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
-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