Выход из цикла при возврате обработчика сигнала

Можно ли разорвать петлю при прерывании сигналом? Когда я запускаю следующий код, если я посылаю 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

person ThisSuitIsBlackNot    schedule 28.04.2012    source источник
comment
Очень хакерское решение: установить глобальную переменную в обработчике сигнала и проверять ее значение на каждой итерации цикла; если переменная установлена, выйти из цикла. Это заставляет меня задаться вопросом, должен ли я вообще использовать сигналы таким образом.   -  person ThisSuitIsBlackNot    schedule 28.04.2012


Ответы (1)


Судя по всему, ваш оператор «break» ломает «переключатель», а не цикл. Вместо этого скажите что-то вроде:

if ($signo == SIGINT){
    echo 'SIGINT' . PHP_EOL;
    break;
}
person Josh T    schedule 06.12.2013