2010-07-17 41 views
2

我遇到了有一個子進程有殺死父進程的問題 - 父進程正在等待子進程退出,並且只有在調用kill進程之後。當kill handler未安裝時(pcntl_signal(SIGTERM,「kill_handler」))腳本立即終止。PHP - 子進程阻止父母的SIGTERM

我需要在提交kill命令終止父進程後立即通過kill處理函數收到信號。這個函數然後會殺死子進程。

任何想法?

回答

1

如果您正在捕獲信號,則必須在某個時間檢查它們。如果掛在阻止文件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