在Python中捕获信号

3 投票
1 回答
1595 浏览
提问于 2025-04-15 15:33

根据文档的说明:

在关键部分,没有办法暂时“阻止”信号(因为并不是所有的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程序。不过,也许你对此并不在意。:-)

撰写回答