2012-04-24 2 views
3

Согласно PHP документации для pcntl_wait,pcntl_wait не прерывается SIGTERM

Функция ожидания приостанавливает выполнение текущего процесса, пока ребенок не вышел, или пока сигнал не подается, действие которого является прекращение тока или вызвать функцию обработки сигнала.

Однако, когда я запускаю следующий код и отправить 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 Version => 5.3.3

ответ

3

Ваш призыв к pcntl_signal указывает, что вызов должен быть перезапущен. Проверьте docs, restart_syscalls по умолчанию - true. Таким образом, ваш звонок до pcntl_signal не возвращается, пока ребенок не завершится.

У вас нет звонка на адрес flush. Таким образом, PHP может хранить вывод echo в буфере.

Таким образом, поведение, которое вы видите, - это именно то поведение, которое вы запрашиваете. Системный вызов перезапускается и вывод буферизуется.

+0

Настройка перезапуска_событий на фальшивый трюк, хотя я не совсем понимаю, что происходит под капотом. – ThisSuitIsBlackNot

+0

Ваше 'эхо' просто записывается в буфер, потому что вы не вызываете' flush'. Поскольку у вас было 'restart_syscalls' установлено значение true, системный вызов был перезапущен с эхом, все еще сидящим в буфере. –

+0

В CLI требуется также флеш? (это то, что я использую). – ThisSuitIsBlackNot

Смежные вопросы