pcntl_waitpid
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_waitpid — Espera la finalización de la ejecución de un proceso hijo
Descripción
function pcntl_waitpid(
int $process_id,
int &$status,
int $flags = 0,
array &$resource_usage = []):
int
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:
Especificando -1 como process_id, esto equivale
a la funcionalidad que proporciona 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.
|
resource_usage
-
El parámetro resource_usage se establece en un
array asociativo que contiene estadísticas de uso de
recursos del proceso hijo. Para el detalle de su contenido, véase
getrusage().
Esto solo se admite si la llamada al sistema
wait4(2) está disponible en el sistema; en caso
contrario, el parámetro se deja sin modificar.
Si no se ha recogido ningún proceso hijo, es decir si la función devuelve
0 o -1, el parámetro se establece
en un array vacío.
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.
Ejemplos
Ejemplo #1 Ejemplo con pcntl_waitpid()
<?php
function checkChild(int $pid, bool $wait): void
{
$flags = ($wait ? 0 : WNOHANG);
$deadPid = pcntl_waitpid($pid, $status, $flags, $rusage);
if ($deadPid === -1) {
$errNo = pcntl_get_last_error();
$errMsg = pcntl_strerror($errNo);
print "PARENT pcntl_waitpid FAILED ({$errNo}): {$errMsg}\n";
} elseif ($deadPid === 0) {
print "PARENT pcntl_waitpid: No exited children.\n";
} elseif (pcntl_wifexited($status)) {
print "PARENT pcntl_waitpid: Child PID {$deadPid} exited with status: "
. pcntl_wexitstatus($status) . "\n";
var_dump($rusage);
} else {
print "PARENT pcntl_waitpid: Child PID {$deadPid} was terminated by signal: "
. pcntl_wtermsig($status) . "\n";
}
}
$parentPid = getmypid();
$forkedPid = pcntl_fork();
if ($forkedPid == -1) {
die('Could not fork');
} else if ($forkedPid) {
// Proceso padre
print "PARENT {$parentPid} has forked {$forkedPid}\n";
print "PARENT is checking for exited children\n";
checkChild($forkedPid, false);
// Evita que los hijos queden como "proceso zombi"
print "PARENT is waiting for a child to exit\n";
checkChild($forkedPid, true);
print "PARENT is checking for exited children\n";
checkChild($forkedPid, false);
print "PARENT is exiting\n";
} else {
// Proceso hijo
$pid = getmypid();
print "CHILD {$pid} is sleeping\n";
sleep(10);
print "CHILD is exiting\n";
exit(7);
}