Semaphorepython2.7与C不同

Posted Qing-Huan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Semaphorepython2.7与C不同相关的知识,希望对你有一定的参考价值。

前言

技术背景:能够使用信号量进行C语言编程使用
遇到问题:python的信号量阻塞导致线程无法接收kill的终止信号(SIGTERM)

步骤

  1. 将遇到的问题写成一个demo.py
  2. 用C语言将其复现一遍,对比其与python中的信号量不同之处,并进行多种测试
  3. 根据测试结果,带着问题查找资料,并进行总结

demo.py 示例

  • 功能:注册一个信号回调,然后连续两次进行 semaphore.acquire() 进入阻塞状态,终端按下 Ctrl+C 发送SIGINT信号
  • 预期:进程终止退出
  • 结果:按下 Ctrl+C 后没有任何反应
  • 讨论结果:出现这样的情况无法确定是由于系统信号机制改变的缘故还是python语言独有的特性,因此用C语言按示例功能写了一遍。

demo.c 无法复现

  • 测试方法:
  1. 终端按下 Ctrl+C 发送SIGINT信号,观察是否和demo.py一样被阻塞
  2. 终端按下 Ctrl+C 发送SIGINT信号,在其回调函数运行结束之前,kill命令发送SIGTERM命令,观察信号量退出方式
  3. 终端连续按下3次及以上 Ctrl+C 发送SIGINT信号
    测试结果如下图所示,但是发现了两个问题
  • 测试结果:
  1. 没有像demo.py一样被阻塞
  2. SIGINT回调函数运行2秒,SIGTERM回调函数运行10秒,SIGINT等SIGTERM运行结束后退出的
  3. 只有两次生效了,并且是第一次并没有等第二次结束再结束,而是按顺序运行并退出的
  • 问题思考:
  1. python具备了什么样的机制导致了这种情况?
  2. 按下 Ctrl+C 发送SIGINT信号后,虽然没被阻塞,但是进程没有退出,发送SIGTERM信号后,进程依旧没有退出,是否注册的信号量回调函数会导致系统原有信号量功能失效呢?
  3. 根据测试方法2的结果,信号机制是否像入栈出栈一样?
  4. 若思考3成立,那么第三种测试结果又是什么原因呢?

带着思考问题查找资料

感谢众多原创作者发布的文章,看了很多资料,不过多列举,这篇文章写的深入浅出,帮助我非常多
参考文档:https://mp.weixin.qq.com/s/fpRocwWpgs0LYRbFvQV0ZA

以上是关于Semaphorepython2.7与C不同的主要内容,如果未能解决你的问题,请参考以下文章

ANSI C 与 C99的不同

linux c与普通的c语言有啥不一样?

为啥 NumPy.exp 显示的结果与 C 中的 exp 不同

Visual C++/C# 中的 WinForms 编程与 Visual C++(MFC) 中的 Windows 编程有何不同

C++中“for”循环的范围规则与C中不同? [复制]

Swift 数组与 c 数组有何不同