我遇到了杀死有一个子进程的父进程的问题 - 父进程正在等待子进程退出并且只有在调用了kill处理程序之后。未安装kill处理程序时(pcntl_signal(SIGTERM,“kill_handler”))脚本立即终止。
我需要在提交kill命令终止父进程后,kill处理函数会立即收到信号。然后,此函数将终止子进程。
有什么想法吗?
答案 0 :(得分:1)
如果您正在捕获信号,则必须在某个时间检查它们。如果您挂在阻止waitpid()
中,请使用脚本顶部的declare(ticks=1);
,或在循环中使用WNOHANG
(可能sleep
),然后致电{ {1}}。
这不起作用:
pcntl_signal_dispatch()
这对父母和父母都有效。子:
<?php
pcntl_signal(SIGTERM, 'kill_handler');
function kill_handler($no){
global $pid;
posix_kill($pid,SIGTERM);
echo 'Done killing '.$pid.PHP_EOL;
exit;
}
$pid = pcntl_fork();
if ($pid) {
echo 'Forked, parent is'.posix_getpid().PHP_EOL;
pcntl_waitpid($pid,$status);
} else {
echo 'child '.posix_getpid().PHP_EOL;
$i = 0;
while($i++ < 30){
echo date('H:i:s').PHP_EOL;
sleep(1);
}
echo 'done'.PHP_EOL;
}
?>
如果没有滴答声,这会让父母死在SIGTERM上,但由于孩子没有信号发送,孩子会继续:
<?php
declare(ticks=1);
//rest of previous code
?>
因此,您必须在孩子本身中拨打<?php
pcntl_signal(SIGTERM, 'kill_handler');
function kill_handler($no){
global $pid;
posix_kill($pid,SIGTERM);
echo 'Done killing '.$pid.PHP_EOL;
exit;
}
$pid = pcntl_fork();
if ($pid) {
echo 'Forked, parent is'.posix_getpid().PHP_EOL;
while(0==pcntl_waitpid($pid,$status,WNOHANG)){
echo "nothing yet".PHP_EOL;
pcntl_signal_dispatch();
sleep(1);
}
} else {
echo 'child '.posix_getpid().PHP_EOL;
$i = 0;
while($i++ < 30){
echo date('H:i:s').PHP_EOL;
sleep(1);
}
echo 'done'.PHP_EOL;
}
?>
,或者您必须在分叉后拨打pcntl_signal_dispatch()
。