最近在研究信号机制,看到 python 官网 https://docs.python.org/zh-cn/3/library/signal.html?highlight=signal#execution-of-python-signal-handlers
中信号处理的描述如下:
捕获同步错误是没有意义的,例如 SIGFPE 或 SIGSEGV ,它们是由 C 代码中的无效操作引起的。Python 将从信号处理程序返回到 C 代码,这可能会再次引发相同的信号,导致 Python 显然的挂起。 从Python 3.3开始,你可以使用 faulthandler 模块来报告同步错误。
这里提到了一个概念 :同步错误
,那什么是异步错误呢?
参考
原文
synchronous error
确实有点怪,不过从上下文看其实说的是信号signal
而不是错误error
。在这个前提下翻了下 stackoverflow。确切地说,同步和异步指的是信号在何处产生。在当前执行的指令流里产生的信号被叫做同步信号,从外部产生并递送进来的叫异步信号。
在上面 glibc 手册里说的比较清楚:
linuxjournal 的链接对信号处理说得还是挺好的,也建议读一读。
说了信号再说为什么说处理同步信号没有意义。在上面的 1003.1-2017 文档里其实有提过一嘴:
大意就是:不是
kill
、sigqueue
、raise
产生的sigbus
、sigfpe
、sigill
、sigsegv
信号,从信号处理函数返回后的行为是未定义的。而 glibc 文档中,
sigign
文档也有说:python 的
signal
包文档也说了:因为信号处理程序本身是有个可重入性要求的(async-signal-safety(7)),能在信号处理函数里安全调用的函数很少。加上上面提到的某些信号返回后行为是未定义的,再加上有些错误信号代表的错误并不会因为你忽略了信号就能恢复正常运行(比如
SIGILL
、SIGSEGV
、SIGBUS
),所以粗略地说,这些信号并不是 python 的信号处理函数能处理的(即便能也没有意义,因为信号代表的故障并没有解决,问题可能来自解释器本身或C扩展)。