pcntl_wait不是SIGTERM中断(pcntl_wait not interrupted b

2019-09-16 17:04发布

按照PHP文档的pcntl_wait ,

等待函数挂起当前进程的执行,直到孩子已经退出,或直到一个信号被发送,其作用是终止当前进程或调用一个信号处理功能。

然而,当我运行下面的代码,并发送SIGTERM父进程与kill -s SIGTERM [pid]信号处理程序只在孩子退出之后调用(即我必须等待睡眠来完成。不应该pcntl_wait()由SIGTERM中断?

fork_test.php:

<?php
  declare(ticks = 1);

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

  pcntl_signal(SIGTERM, 'sig_handler');

  $pid = pcntl_fork();

  if ($pid == -1) {
     die('could not fork');
  }
  else if ($pid) {
    echo 'parent' . PHP_EOL;

    pcntl_wait($status);
  }
  else {
    echo 'child' . PHP_EOL;
    sleep(30);
  }
?>

输出(SIGTERM仅等待30秒后出现):

$ php fork_test.php
child
parent
SIGTERM

PHP版=> 5.3.3

Answer 1:

您对呼叫pcntl_signal指定电话应重新启动。 检查文档 , restart_syscallstrue默认。 所以,你要调用pcntl_signal不返回,直到孩子已经终止。

你没有调用刷新 。 所以PHP可以容纳的输出echo在缓冲区中。

所以你看到的行为恰恰是您所请求的行为。 系统调用重新启动并输出缓冲。



文章来源: pcntl_wait not interrupted by SIGTERM