【原创】关于信号中断 pcntl_wait 系统调用的问题 【已解决】

blogdaren 2018-09-03 抢沙发 386人次

问题重现

官方原帖子: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大大所言那样。

共同关注

不知道是代码调试姿势有问题还是别的什么原因,欢迎评论区或wokerman官方社区学习讨论~~

问题解决

1、问题已经解决,已经达到如walkor大大所说的预期效果,strace跟踪了下,发现我提供的DEMO代码存在问题【原帖子上直接copy的别人DEMO代码简单修改的,不仔细看容易坑自己咯】,即:pcntl_signal ( int signo, callback handle [, bool restart_syscalls] ) 最后一个参数忘记需要设置为 false 。

2、信号的确会中断系统调用【但是会中断所有系统调用吗?NO,比如read、write?留给大家思考...】,但是这个 pcntl_signal ( int signo, callback handle [, bool restart_syscalls] ) 的最后一个参数会直接通知内核是否在系统调用被信号中断以后立即重启系统调用,也就是所谓的继续阻塞进程,至此明白问题所在。

问题总结

1、本文并不是说解决了一个参数问题就等于理解了多进程以及信号编程,更重要的在于我们要全方位认识问题本质以及如何科学解决问题,这样才算有收获,另外早前的一篇相关文章里也有详细的注意事项总结点此查看分享
2、当直接copy的别人代码做简单修改时,不仔细看容易坑自己哈,所以还需认真审阅代码。
3、关于多进程以及信号编程细节众多,其中涉及很多重要的相关PHP函数,所以对相关函数的每个参数含义一定得弄白,否则容易入坑。
4、关于多进程以及信号编程难免经常遇到系统调用,遇到问题切记 strace 调试利器,本次问题跟踪strace帮助巨大。
5、本问题在 workerman官方的对应帖:http://wenda.workerman.net/?/question/3150
6、最后论证结果为:walkor的权威说法是正确的。

#信号##进程#

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:【原创】关于信号中断 pcntl_wait 系统调用的问题 【已解决】

发表评论:

您的昵称:
电子邮件:
个人主页: