2012-04-28 67 views
2

當被信號中斷時是否有可能跳出循環?當我運行以下代碼時,如果在循環的第一次迭代期間發送SIGINT,則會調用信號處理程序,但是隨後我將放回到循環中。我想處理信號,然後跳過循環的其餘部分(不退出腳本)。當信號處理程序返回時跳出循環

<?php 
    declare(ticks = 1); 

    function sig_handler($signo) { 
    switch($signo) { 
     case SIGINT: 
     echo 'SIGINT' . PHP_EOL; 
     break; 
     default: 
    } 
    } 

    pcntl_signal(SIGINT, 'sig_handler'); 

    $vars = array('foo', 'bar', 'baz'); 
    foreach ($vars as $var) { 
    echo $var . PHP_EOL; 
    sleep(3); 
    } 

    // Do other stuff 
?> 

輸出(每個睡眠過程中按Ctrl + C):

$ php foreach_test.php 
foo 
SIGINT 
bar 
SIGINT 
baz 
SIGINT 
+0

一個非常黑客的解決方案:在信號處理程序中設置全局變量並在每次循環迭代中檢查其值;如果變量已設置,則跳出循環。這讓我懷疑我是否應該以這種方式使用信號。 – ThisSuitIsBlackNot 2012-04-28 07:07:56

回答

0

從外觀上來看,你的 「破發」 聲明打破了 「開關」,而不是循環。相反,如下所示:

if ($signo == SIGINT){ 
    echo 'SIGINT' . PHP_EOL; 
    break; 
}