在Python中捕获信号
根据文档的说明:
在关键部分,没有办法暂时“阻止”信号(因为并不是所有的Unix系统都支持这个功能)。
那我为什么不能用signal.signal(signum,SIG_IGN)
来阻止信号,然后再把信号加回来呢?
1 个回答
11
你遇到的问题是,如果在设置了SIG_IGN的情况下信号真的来了,那么这个信号就会被忽略掉,直接丢掉。当你稍后再添加信号时,已经太晚了,因为信号已经消失了,你永远也无法知道它曾经发生过。
所以,你实际上是“忽略”了这个信号(也就是把它丢掉了),而不是“阻塞”它(也就是把它保留到关键部分结束后再处理)。你可能会困惑是因为不太清楚“阻塞”信号具体是什么意思:这意味着操作系统会暂时保留这个信号,让它等到你的关键部分完成后再处理。
如果你想了解更多类似的问题,可以参考W. Richard Steven的《UNIX环境高级编程》。我查过我手头这本书的第10.8节,标题是“可靠的信号术语和语义”,这部分内容对我回答这个问题很有帮助。
更新:在我的Ubuntu笔记本上,输入“man sigprocmask”(如果安装了manpages-dev)似乎是学习信号阻塞的好起点。正如Python文档所提到的,这在所有Unix系统上并不都适用,所以如果你真的使用“sigprocmask”,不要指望你的老旧Irix或AIX系统能运行你的Python程序。不过,也许你对此并不在意。:-)