关于信号中断 wait 系统调用的问题

blogdaren

问题重现:
原帖子:http://wenda.workerman.net/?/question/883
walkor大大在回复中有这么一段话:
【pcntl_wait其实就是wait系统调用,是可以被信号打断的,当信号到来后pcntl_wait会立刻返回。
同理sleep也是系统调用,也可以被信号打断停止睡眠立刻返回。所以在pcntl_wait或者sleep下的pcntl_signal_dispatch函数在收到信号后会立刻被执行】

问题调试:
详见附件两副截图

[attach]1217[/attach]

[attach]1218[/attach]

测试结果:
信号确实会中断 sleep 系统调用,但是并未中断 wait 系统调用。

期望结果:
期望结果如walkor大大所言那样。

3643 6 0
6个回答

walkor

一次信号只中断一个系统调用,并且只中断正在阻塞的系统调用,其它还没执行到的不会影响

  • 暂无评论
blogdaren

凹, 事实上我单独做过针对没有 sleep 系统调用的调试【即注释图中13-14行代码】, 也就是说只测试信号对单独 pcntl_wait 调用的影响,运行以后也无法中断wait调用呢。

  • 暂无评论
walkor
<?php
    pcntl_signal(SIGINT, function(){echo "get signal\n";});
    $pid = pcntl_fork();

    if ($pid) {
        pcntl_wait($status, WUNTRACED);
        echo "pcntl_wait return\n";
    } else {
        sleep(1000);
    }

我这测试是正常的

  • 暂无评论
blogdaren

嗯,把你的代码和我的代码都调试了一遍, 似乎发现问题的症结了:

测试时一直是终端直接发送 kill -2 pid 信号指令 --> 发现无法中断系统调用
刚我顺手用了 CTRL + C 指令 --> 发现能够正常中断系统调用
CTRL + C 和 kill -2 pid 按理说一样的啊,这是为什么呢?

  • 暂无评论
blogdaren

@walkor 感谢,经调试,已经达到如你所说的预期效果,strace跟踪了下,发现我提供的DEMO代码存在问题,即:
pcntl_signal ( int signo, callback handle ) 最后一个参数忘记需要设置为false

  • 暂无评论
walkor

好的

  • 暂无评论
年代过于久远,无法发表回答
🔝