Semaphorepython2.7与C不同
Posted Qing-Huan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Semaphorepython2.7与C不同相关的知识,希望对你有一定的参考价值。
前言
技术背景:能够使用信号量进行C语言编程使用
遇到问题:python的信号量阻塞导致线程无法接收kill的终止信号(SIGTERM)
步骤
- 将遇到的问题写成一个demo.py
- 用C语言将其复现一遍,对比其与python中的信号量不同之处,并进行多种测试
- 根据测试结果,带着问题查找资料,并进行总结
demo.py 示例
- 功能:注册一个信号回调,然后连续两次进行 semaphore.acquire() 进入阻塞状态,终端按下 Ctrl+C 发送SIGINT信号
- 预期:进程终止退出
- 结果:按下 Ctrl+C 后没有任何反应
- 讨论结果:出现这样的情况无法确定是由于系统信号机制改变的缘故还是python语言独有的特性,因此用C语言按示例功能写了一遍。
demo.c 无法复现
- 测试方法:
- 终端按下 Ctrl+C 发送SIGINT信号,观察是否和demo.py一样被阻塞
- 终端按下 Ctrl+C 发送SIGINT信号,在其回调函数运行结束之前,kill命令发送SIGTERM命令,观察信号量退出方式
- 终端连续按下3次及以上 Ctrl+C 发送SIGINT信号
测试结果如下图所示,但是发现了两个问题
- 测试结果:
- 没有像demo.py一样被阻塞
- SIGINT回调函数运行2秒,SIGTERM回调函数运行10秒,SIGINT等SIGTERM运行结束后退出的
- 只有两次生效了,并且是第一次并没有等第二次结束再结束,而是按顺序运行并退出的
- 问题思考:
- python具备了什么样的机制导致了这种情况?
- 按下 Ctrl+C 发送SIGINT信号后,虽然没被阻塞,但是进程没有退出,发送SIGTERM信号后,进程依旧没有退出,是否注册的信号量回调函数会导致系统原有信号量功能失效呢?
- 根据测试方法2的结果,信号机制是否像入栈出栈一样?
- 若思考3成立,那么第三种测试结果又是什么原因呢?
带着思考问题查找资料
感谢众多原创作者发布的文章,看了很多资料,不过多列举,这篇文章写的深入浅出,帮助我非常多
参考文档:https://mp.weixin.qq.com/s/fpRocwWpgs0LYRbFvQV0ZA
以上是关于Semaphorepython2.7与C不同的主要内容,如果未能解决你的问题,请参考以下文章
为啥 NumPy.exp 显示的结果与 C 中的 exp 不同
Visual C++/C# 中的 WinForms 编程与 Visual C++(MFC) 中的 Windows 编程有何不同