pcntl_waitpid

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

pcntl_waitpidEspera la finalización de la ejecución de un proceso hijo

Descripción

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

Suspende la ejecución del proceso actual hasta que un proceso hijo especificado por el parámetro process_id haya terminado, una señal haya terminado este proceso o una señal haya llamado a un gestor de señales.

Si el proceso hijo identificado por process_id ya ha terminado en el momento de la llamada a esta función (se les llama procesos "zombie"), la función termina inmediatamente. Cualquier recurso del sistema utilizado por el proceso hijo es liberado. Consulte la página de man waitpid(2) para obtener detalles sobre el comportamiento de esta función en su sistema.

Parámetros

process_id

El valor de process_id puede ser uno de los siguientes:

Valores posibles para process_id
< -1 espera un proceso hijo cuyo identificador de grupo es igual al valor absoluto de process_id.
-1 espera cualquier proceso hijo; esto corresponde al mismo comportamiento que el de la función pcntl_wait() presente.
0 espera un proceso hijo cuyo identificador de grupo es igual al del proceso actual.
> 0 espera el proceso hijo cuyo identificador es igual al valor de process_id.

Nota:

Si process_id vale -1, esto equivale a utilizar la función pcntl_wait() (menos flags).

status

pcntl_waitpid() registrará información sobre el estado actual del proceso en el parámetro status, al cual se puede acceder gracias a las siguientes funciones: pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() y pcntl_wstopsig().

flags

El parámetro flags puede tomar el valor cero, o varias de las siguientes constantes globales (combinadas con el operador OR):

Valores posibles de flags
WNOHANG retorna inmediatamente si ningún proceso hijo ha terminado.
WUNTRACED retorna cuando los procesos hijos están detenidos y su estado no ha sido actualizado.

Valores devueltos

pcntl_waitpid() retorna el identificador de proceso del proceso hijo que ha terminado, o bien -1 en caso de error o cero si WNOHANG ha sido utilizado y ningún proceso hijo estaba disponible.

Ver también

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