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

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

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

33.png


44.png


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

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

walkor

赞同来自: 默然

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

blogdaren - 喜欢分享的PHP码农【http://www.blogdaren.com】

赞同来自:

凹, 事实上我单独做过针对没有 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 - 喜欢分享的PHP码农【http://www.blogdaren.com】

赞同来自:

嗯,把你的代码和我的代码都调试了一遍, 似乎发现问题的症结了:
  1. 测试时一直是终端直接发送 kill -2 pid 信号指令 --> 发现无法中断系统调用
  2. 刚我顺手用了 CTRL + C 指令 --> 发现能够正常中断系统调用
  3. CTRL + C 和 kill -2 pid 按理说一样的啊,这是为什么呢?

blogdaren - 喜欢分享的PHP码农【http://www.blogdaren.com】

赞同来自:

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

walkor

赞同来自:

好的

要回复问题请先登录注册