pcntl_waitのPHPドキュメントによると、
待機関数は、子が終了するまで、または現在のプロセスを終了するかシグナル処理関数を呼び出すアクションを持つシグナルが配信されるまで、現在のプロセスの実行を一時停止します。
ただし、次のコードを実行し、シグナルハンドラーを使用してSIGTERMを親プロセスに送信すると、子が終了した後kill -s SIGTERM [pid]
にのみ呼び出されます(つまり、スリープが終了するのを待つ必要があります。SIGTERMによって中断されるべきではありませんか?pcntl_wait()
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