加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – pcntl_sigwaitinfo和信号处理程序

发布时间:2020-12-13 16:47:45 所属栏目:PHP教程 来源:网络整理
导读:我正在写一个守护进程,它会在一段时间内完成一些工作,并在再次重复之前休息一段时间.但它必须在睡眠时对外部影响(即终止请求)作出反应. 我设法用ALRM信号实现睡眠超时,并用TERM信号终止(样本): // ...declare(ticks = 1);function do_work(){ echo "Doing s
我正在写一个守护进程,它会在一段时间内完成一些工作,并在再次重复之前休息一段时间.但它必须在睡眠时对外部影响(即终止请求)作出反应.

我设法用ALRM信号实现睡眠超时,并用TERM信号终止(样本):

// ...

declare(ticks = 1);

function do_work()
{
    echo "Doing some work.n";
}

$term = FALSE;

$sighandler = function ($signal) use (&$term)
{
    if ($signal === SIGTERM)
    {
        pcntl_alarm(0);

        $term = TRUE;

        echo "TERM HANDLERn";
    } else {
        echo "ALRM HANDLERn";
    }
};

pcntl_signal(SIGALRM,$sighandler);
pcntl_signal(SIGTERM,$sighandler);

while (!$term)
{
    do_work();

    // Kick myself after 2 seconds
    pcntl_alarm(2);

    // Wait for alarm or termination
    $signal = pcntl_sigwaitinfo(array(SIGTERM,SIGALRM),$info);

    pcntl_signal_dispatch();

    switch ($signal)
    {
        case SIGALRM: echo "ALRM SIGWIn"; break;
        case SIGTERM: echo "TERM SIGWIn"; $term = TRUE; break;
    }
}

// ...

但是为了上帝的缘故,我无法弄清楚为什么sighandler从未被召唤过.我得到以下输出:

$php sigsample.php
Doing some work.
ALRM SIGWI
Doing some work.
ALRM SIGWI
Doing some work.
TERM SIGWI

同时,如果我没有设置此处理程序,脚本会因为信号不正确而死亡.

我错过了一些人吗?为什么我的信号处理函数从未调用过? pcntl_sigwaitinfo()会干扰吗?

是否还有其他方法可以同时实现超时和信号处理?

解决方法

这并非完全出乎意料.

您已经要求传递给信号处理程序(pcntl_signal(…)),但随后还要求接受该信号而不调用任何处理程序(pcntl_sigwaitinfo(…)).您的操作系统可以决定在这种情况下会发生什么,并且您的操作系统(如我的)选择让pcntl_sigwaitinfo()获胜.

背景

进程可以通过两种不同的方式接收(“遭受?”)信号:

>异步传递
?该信号会引发一些异步操作,通常会终止进程或调用用户定义的处理程序. pcntl_signal只注册这样一个处理程序.
?C程序员熟悉的底层调用是signalsigaction.
>同步验收
?特殊系统功能会注意到信号处于待处理状态,并将其从待处理列表中删除,并将有关信号的信息返回给进程. pcntl_sigwaitinfo就是这样一个功能.
?基础电话是sigwait,sigwaitinfosigtimedwait.

这两种方式,即交付和接受,均为different,并不意味着一起使用.例如,AIX只是禁止“[c]oncurrent use of sigaction and sigwait“.

(与上述相关的是信号掩码的概念,它可以“阻止”信号,有效地强制它们保持待决状态直到被接受或直到“解除阻塞”并被传递.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读