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.pcntl_waitpid
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
pcntl_waitpid
Референца за `function.pcntl-waitpid.php` со подобрена типографија и навигација.
pcntl_waitpid
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_waitpid — Чека на или го враќа статусот на форкнато дете
= NULL
Го суспендира извршувањето на тековниот процес додека детето како што е специфицирано од process_id аргументот не заврши, или додека не се испорача сигнал чија акција е да го прекине тековниот процес или да повика функција за ракување со сигнали.
Ако дете како што е побарано од process_id веќе завршило во моментот на повикот (т.н. „зомби“ процес), функцијата се враќа веднаш. Сите системски ресурси што ги користело детето се ослободуваат. Ве молиме погледнете ја вашата системска man страница waitpid(2) за специфични детали за тоа како работи waitpid на вашиот систем.
Параметри
process_id-
Вредноста на
process_idможе да биде една од следниве:можни вредности за process_id< -1чека на кое било дете чиј ID на процес група е еднаков на апсолутната вредност на process_id.-1чека на кое било дете; ова е истото однесување што го прикажува функцијата pcntl_wait() чека на кое било дете чиј ID на процес група е еднаков на оној на повикувачкиот процес. 0чека на детето чиј ID на процес е еднаков на вредноста на > 0е еквивалентно на функционалноста што ја обезбедува process_id.Забелешка:
Наведување
-1какоprocess_id(минус pcntl_wait() ќе ги зачува информациите за статусот во параметаротflags). status-
pcntl_waitpid() што може да се процени со помош на следните функции:
statusе вредноста на нула или повеќе од следните две глобални константи pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig() and pcntl_wstopsig(). flags-
Вредноста на
flagsспоени заедно:ORсе враќа веднаш ако ниту едно дете не завршило.можни вредности за flagsWNOHANGсе враќа за деца кои се запрени, и чиј статус не е пријавен. WUNTRACEDго враќа ID на процесот на детето кое завршило, -1 при грешка или нула ако
Вратени вредности
pcntl_waitpid() беше искористено и ниту едно дете не беше достапно WNOHANG was used and no child was available
Види Исто така
- pcntl_fork() - Форкира тековно активен процес
- pcntl_signal() - Инсталира обработувач на сигнали
- pcntl_wifexited() - Проверува дали кодот за статус претставува нормален излез
- pcntl_wifstopped() - Проверува дали детето процес е моментално запрено
- pcntl_wifsignaled() - Проверува дали кодот за статус претставува прекин поради сигнал
- pcntl_wexitstatus() - Враќа код за враќање на прекинат дете
- pcntl_wtermsig() - Враќа сигнал што го предизвика прекинот на детето
- pcntl_wstopsig() - Враќа сигнал што го предизвика запирањето на детето
Белешки од корисници 3 белешки
<?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);
}
?><?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);
}
}
}
?>