2
我遇到了有一個子進程有殺死父進程的問題 - 父進程正在等待子進程退出,並且只有在調用kill進程之後。當kill handler未安裝時(pcntl_signal(SIGTERM,「kill_handler」))腳本立即終止。PHP - 子進程阻止父母的SIGTERM
我需要在提交kill命令終止父進程後立即通過kill處理函數收到信號。這個函數然後會殺死子進程。
任何想法?
我遇到了有一個子進程有殺死父進程的問題 - 父進程正在等待子進程退出,並且只有在調用kill進程之後。當kill handler未安裝時(pcntl_signal(SIGTERM,「kill_handler」))腳本立即終止。PHP - 子進程阻止父母的SIGTERM
我需要在提交kill命令終止父進程後立即通過kill處理函數收到信號。這個函數然後會殺死子進程。
任何想法?
如果您正在捕獲信號,則必須在某個時間檢查它們。如果掛在阻止文件waitpid()
中,請在腳本的頂部使用declare(ticks=1);
,或在循環中使用WNOHANG
(可能爲sleep
ing),並調用pcntl_signal_dispatch()
。
這不起作用:
<?php
declare(ticks=1);
//rest of previous code
?>
沒有蜱蟲,這將讓我們在SIGTERM父不死,但因爲沒有:
<?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;
}
?>
這將在父&孩子一起孩子繼續在孩子的信號調度:
<?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;
}
?>
所以eithe您必須在孩子身上撥打pcntl_signal_dispatch()
,否則您只能在分叉後撥打pcntl_signal
。