问题重现:
原帖子: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大大所言那样。
一次信号只中断一个系统调用,并且只中断正在阻塞的系统调用,其它还没执行到的不会影响
凹, 事实上我单独做过针对没有 sleep 系统调用的调试【即注释图中13-14行代码】, 也就是说只测试信号对单独 pcntl_wait 调用的影响,运行以后也无法中断wait调用呢。
我这测试是正常的
嗯,把你的代码和我的代码都调试了一遍, 似乎发现问题的症结了:
测试时一直是终端直接发送 kill -2 pid 信号指令 --> 发现无法中断系统调用
刚我顺手用了 CTRL + C 指令 --> 发现能够正常中断系统调用
CTRL + C 和 kill -2 pid 按理说一样的啊,这是为什么呢?
@walkor 感谢,经调试,已经达到如你所说的预期效果,strace跟踪了下,发现我提供的DEMO代码存在问题,即:
pcntl_signal ( int signo, callback handle ) 最后一个参数忘记需要设置为false
好的