PHP - 阻止父级SIGTERM的子进程

时间:2010-07-17 20:08:47

标签: php process parent-child kill terminate

我遇到了杀死有一个子进程的父进程的问题 - 父进程正在等待子进程退出并且只有在调用了kill处理程序之后。未安装kill处理程序时(pcntl_signal(SIGTERM,“kill_handler”))脚本立即终止。

我需要在提交kill命令终止父进程后,kill处理函数会立即收到信号。然后,此函数将终止子进程。

有什么想法吗?

1 个答案:

答案 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()