【问题标题】:php pcntl_alarm - pcntl_signal handler doesn't fire?php pcntl_alarm - pcntl_signal 处理程序不触发?
【发布时间】:2016-10-28 00:07:54
【问题描述】:

我正在考虑使用 pcntl_alarm() 做某事,所以为了测试它,我运行了一个变体示例,您在 google pcntl_alarm 时随处可见:

function signal_handler()
{
    echo "Caught SIGALRM\n";
    exit;
}
pcntl_signal('SIGALRM', 'signal_handler');

pcntl_alarm(3);

for($i = 1; $i <= 6; $i++) {
    echo "$i ";
    sleep(1);
}
echo "Normal exit\n";

预期输出:

1 2 3 Caught SIGALRM

实际输出:

1 2 3 Alarm Clock

我尝试在pcntl_signal() 调用中不引用SIGALRM(因为它需要一个int),但是警报似乎没有触发:

1 2 3 4 5 6 Normal exit

我假设Alarm Clock 输出是由于默认处理程序而导致的,而我的signal_handler() 没有被调用。 SIGALRM 是正确的常数吗?我错过了什么?我在 linux (centos) 下通过 CLI 运行,已经尝试过 php 5.5 和 5.6。

【问题讨论】:

    标签: php timeout command-line-interface pcntl


    【解决方案1】:

    SIGALRM 是一个常量,您可以通过以下操作看到:

    echo SIGALRM; //14
    

    您还需要使用以下方法检查待处理信号 pcntl_signal_dispatch 在你的循环中。

    function signal_handler()
    {
        echo "Caught SIGALRM\n";
        exit;
    }
    pcntl_signal(SIGALRM, 'signal_handler');
    
    pcntl_alarm(3);
    
    for($i = 1; $i <= 6; $i++) {
        echo "$i ";
        sleep(1);
        pcntl_signal_dispatch();
    }
    echo "Normal exit\n";
    

    祝你好运!

    【讨论】:

    • pcntl_signal_dispatch() 的调用是我所缺少的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多