PHP Conference Nagoya 2025

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 &$özkaynak_kullanımı = []
): 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.

Bağımsız Değişkenler

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 bağımsız değişkenine -1 belirtmek, (seçenekler haricinde) pcntl_wait() işlevselliğine denktir.

durum

pcntl_waitpid() işlevi durum bağımsız değişkeninde ş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.

özkaynak_kullanımı

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

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