pcntl_wait 未被 SIGTERM 中断

Thi*_*Not 5 php sigterm pcntl

根据pcntl_wait的 PHP 文档,

等待函数暂停当前进程的执行,直到子进程退出,或者直到传递了一个信号,其动作是终止当前进程或调用信号处理函数。

但是,当我运行以下代码并使用kill -s SIGTERM [pid]信号处理程序将 SIGTERM 发送到父进程时,仅子进程退出后才调用(即我必须等待睡眠完成。不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);
  }
?>
Run Code Online (Sandbox Code Playgroud)

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

$ php fork_test.php
child
parent
SIGTERM
Run Code Online (Sandbox Code Playgroud)

PHP 版本 => 5.3.3

Dav*_*rtz 4

您的呼叫pcntl_signal指定应重新启动呼叫。检查文档,默认情况restart_syscallstrue。因此,在子进程终止之前,您的调用pcntl_signal不会返回。

你没有调用flush。所以 PHP 可以将 的输出保存echo在缓冲区中。

因此,您所看到的行为正是您所请求的行为。重新启动系统调用并缓冲输出。